diff --git a/assembly/plugins/org.eclipse.jsf.branding/.classpath b/assembly/plugins/org.eclipse.jsf.branding/.classpath
deleted file mode 100644
index 7cec603..0000000
--- a/assembly/plugins/org.eclipse.jsf.branding/.classpath
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/assembly/plugins/org.eclipse.jsf.branding/.cvsignore b/assembly/plugins/org.eclipse.jsf.branding/.cvsignore
deleted file mode 100644
index 7033a79..0000000
--- a/assembly/plugins/org.eclipse.jsf.branding/.cvsignore
+++ /dev/null
@@ -1,4 +0,0 @@
-bin
-@dot*
-temp.folder
-build.xml
diff --git a/assembly/plugins/org.eclipse.jsf.branding/.project b/assembly/plugins/org.eclipse.jsf.branding/.project
deleted file mode 100644
index bd50004..0000000
--- a/assembly/plugins/org.eclipse.jsf.branding/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jsf.branding</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.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/assembly/plugins/org.eclipse.jsf.branding/META-INF/MANIFEST.MF b/assembly/plugins/org.eclipse.jsf.branding/META-INF/MANIFEST.MF
deleted file mode 100644
index 8524822..0000000
--- a/assembly/plugins/org.eclipse.jsf.branding/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,7 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %plugin.Name
-Bundle-SymbolicName: org.eclipse.jsf
-Bundle-Version: 1.0.1.qualifier
-Bundle-Localization: plugin
-Bundle-Vendor: %plugin.Provider
diff --git a/assembly/plugins/org.eclipse.jsf.branding/about.html b/assembly/plugins/org.eclipse.jsf.branding/about.html
deleted file mode 100644
index 7c80c6c..0000000
--- a/assembly/plugins/org.eclipse.jsf.branding/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 06, 2007</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/assembly/plugins/org.eclipse.jsf.branding/about.ini b/assembly/plugins/org.eclipse.jsf.branding/about.ini
deleted file mode 100644
index a21a3ec..0000000
--- a/assembly/plugins/org.eclipse.jsf.branding/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/assembly/plugins/org.eclipse.jsf.branding/about.mappings b/assembly/plugins/org.eclipse.jsf.branding/about.mappings
deleted file mode 100644
index bddaab4..0000000
--- a/assembly/plugins/org.eclipse.jsf.branding/about.mappings
+++ /dev/null
@@ -1,6 +0,0 @@
-# about.mappings
-# contains fill-ins for about.properties
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# This file does not need to be translated.
-
-0=@build@
\ No newline at end of file
diff --git a/assembly/plugins/org.eclipse.jsf.branding/about.properties b/assembly/plugins/org.eclipse.jsf.branding/about.properties
deleted file mode 100644
index c62b076..0000000
--- a/assembly/plugins/org.eclipse.jsf.branding/about.properties
+++ /dev/null
@@ -1,24 +0,0 @@
-###############################################################################
-# Copyright (c) 2005 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-
-# about.properties
-# contains externalized strings for about.ini
-# java.io.Properties file (ISO 8859-1 with "\" escapes)
-# fill-ins are supplied by about.mappings
-# This file should be translated.
-
-blurb=JavaServer Faces Tools\n\
-\n\
-Version: {featureVersion}\n\
-Build id: {0}\n\
-\n\
-(c) Copyright Eclipse contributors and others 2005.  All rights reserved.\n\
-Visit http://www.eclipse.org/webtools
diff --git a/assembly/plugins/org.eclipse.jsf.branding/build.properties b/assembly/plugins/org.eclipse.jsf.branding/build.properties
deleted file mode 100644
index ab20e78..0000000
--- a/assembly/plugins/org.eclipse.jsf.branding/build.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2006 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-bin.includes = META-INF/,\
-               eclipse32.png,\
-               eclipse32.gif,\
-               about.properties,\
-               about.mappings,\
-               about.ini,\
-               about.html,\
-               plugin.properties,\
-               component.xml
-
diff --git a/assembly/plugins/org.eclipse.jsf.branding/component.xml b/assembly/plugins/org.eclipse.jsf.branding/component.xml
deleted file mode 100644
index d470a56..0000000
--- a/assembly/plugins/org.eclipse.jsf.branding/component.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<component  xmlns="http://eclipse.org/wtp/releng/tools/component-model" name="org.eclipse.jsf">
-<description url=""></description>
-<component-depends unrestricted="true"></component-depends>
-<plugin id="org.eclipse.jst.jsf.common" fragment="false"/>
-<plugin id="org.eclipse.jst.jsf.common.ui" fragment="false"/>
-<plugin id="org.eclipse.jst.jsf.core" fragment="false"/>
-<plugin id="org.eclipse.jst.jsf.ui" fragment="false"/>
-<plugin id="org.eclipse.jst.jsf.standard.tagsupport" fragment="false"/>
-<plugin id="org.eclipse.jst.jsf.facesconfig" fragment="false"/>
-<plugin id="org.eclipse.jst.jsf.facesconfig.ui" fragment="false"/>
-<plugin id="org.eclipse.jst.pagedesigner" fragment="false"/>
-<plugin id="org.eclipse.jst.pagedesigner.jsf.ui" fragment="false"/>
-<plugin id="org.eclipse.jst.pagedesigner.jsp.core" fragment="false"/>
-<plugin id="org.eclipse.jst.jsf.doc.dev" fragment="false"/>
-</component>
-
-
-
-
-
-
-
diff --git a/assembly/plugins/org.eclipse.jsf.branding/eclipse32.gif b/assembly/plugins/org.eclipse.jsf.branding/eclipse32.gif
deleted file mode 100644
index e6ad7cc..0000000
--- a/assembly/plugins/org.eclipse.jsf.branding/eclipse32.gif
+++ /dev/null
Binary files differ
diff --git a/assembly/plugins/org.eclipse.jsf.branding/eclipse32.png b/assembly/plugins/org.eclipse.jsf.branding/eclipse32.png
deleted file mode 100644
index 568fac1..0000000
--- a/assembly/plugins/org.eclipse.jsf.branding/eclipse32.png
+++ /dev/null
Binary files differ
diff --git a/assembly/plugins/org.eclipse.jsf.branding/plugin.properties b/assembly/plugins/org.eclipse.jsf.branding/plugin.properties
deleted file mode 100644
index 2b7a864..0000000
--- a/assembly/plugins/org.eclipse.jsf.branding/plugin.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-###############################################################################
-# Copyright (c) 2006 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-# IBM Corporation - initial API and implementation
-###############################################################################
-
-plugin.Name=JavaServer Faces Tools
-plugin.Provider=Eclipse.org
\ No newline at end of file
diff --git a/jsf/features/org.eclipse.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 9e195c1..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.0.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 1bba7c4..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.0.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 f341cb0..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.0.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 94c5759..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.0.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 ec655a1..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.0.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 d65e4ae..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.apache.trinidad.tagsupport/src/org/eclipse/jst/jsf/apache/trinidad/tagsupport/messages.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
-###############################################################################
-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 95845ff..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.0.qualifier
-Bundle-Activator: org.eclipse.jst.jsf.common.runtime.internal.JSFCommonRuntimePlugin
-Require-Bundle: org.eclipse.core.runtime
-Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: J2SE-1.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 6cc80f1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common.runtime/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
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.properties
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 f4f775c..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.0.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 ee8a569..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeInfoCache.java
+++ /dev/null
@@ -1,600 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, 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) {
-                        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 c15e2bc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainLoadingStrategy.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.internal;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-/**
- * 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) {		
-		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)){
-					assistant.setSourceModelProvider(mds);
-					translator.translate(assistant);
-				}				
-			}
-		}
-		assistant.setMergeComplete();
-	}
-	
-	/**
-	 * @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 f0acd69..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 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 bcd9338..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
-	 */
-	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 9e5c4a6..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModel.java
+++ /dev/null
@@ -1,123 +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 void load(){
-		strategy.load(this);
-	}
-	
-	/**
-	 * 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 37b9e16..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModelContextImpl.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 org.eclipse.jst.jsf.common.metadata.query.IMetaDataModelContext;
-
-/**
- * Simple implementation of {@link IMetaDataModelContext}
- *
- */
-public class MetaDataModelContextImpl implements IMetaDataModelContext {
-	private String _domain;
-	
-	/**
-	 * Constructor
-	 * @param domain id
-	 */
-	public MetaDataModelContextImpl(String domain){
-		_domain = domain;
-	}
-	
-	public String getDomainID() {
-		return _domain;
-	}
-
-	public Object getAdapter(Class adapter) {
-		if (adapter.equals(IMetaDataModelContext.class))
-			return this;
-		return null;
-	}
-
-}
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 342e1c2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModelManager.java
+++ /dev/null
@@ -1,256 +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.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-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;
-	private ModelMap models; 
-	private 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(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(IProject project) {
-		this.project = project;
-		init();
-	}
-	
-	/**
-	 * @param project
-	 * @return MetaDataModelManager instance for the project
-	 */
-	protected static MetaDataModelManager getFromSessionProperty(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.
-	 */
-	protected 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
-	 */
-	protected 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$
-		}
-	}
-	
-	private synchronized void init() {
-		models = new ModelMap();	
-		setAsSessionProperty();
-	}
-	
-	
-	/**
-	 * Will locate the cached MetaDataModel.   Sets the model context in the model.
-	 * @param modelContext
-	 * @return the MetaDataModel for the given ITaglibDomainMetaDataModelContext
-	 */
-	public synchronized MetaDataModel getModel(final ITaglibDomainMetaDataModelContext modelContext){
-		ModelKeyDescriptor modelKeyDescriptor = StandardModelFactory.getInstance().createModelKeyDescriptor(modelContext);
-		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);
-		
-		return model;
-	}
-	
-	private void addModel(MetaDataModel model) {
-		
-		if (model != null)
-			models.put(model.getModelKey(), 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){
-			//a project is closing - release and cleanup
-			final IProject aProject = (IProject)event.getResource();
-			if (aProject == this.project){
-				SafeRunnable.run(new ISafeRunnable(){
-
-					public void handleException(Throwable exception) {
-						// FIXME: what to do here?
-						
-					}
-
-					public void run() throws Exception {
-						for (Iterator it=models.getModels().iterator();it.hasNext();){
-							MetaDataModel model = (MetaDataModel)it.next();
-//							System.out.println("kill mmModel: "+model.toString());
-							models.remove(model);
-							model.cleanup();					
-						}
-						removeAsSessionProperty(project);
-					}					
-				});			
-			}
-		}
-		
-	}
-	
-	private synchronized MetaDataModel loadMetadata(ModelKeyDescriptor modelKeyDescriptor){
-		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;
-	}
-
-	/**
-	 * Map of models keyed by ModelKeyDescriptor (.toString())
-	 *
-	 */
-	private class ModelMap{
-		private HashMap /*<String, MetaDataModel>*/ map;
-		
-		ModelMap(){
-			map = new HashMap/*<String, MetaDataModel>*/();
-		}
-		
-		/**
-		 * @param modelKeyDescriptor
-		 * @param model adds model to the map using the given key descriptor
-		 */
-		public void put(ModelKeyDescriptor modelKeyDescriptor, MetaDataModel model){
-			String key = modelKeyDescriptor.toString();
-			map.put(key, model);
-		}
-		
-		/**
-		 * @param modelKeyDescriptor
-		 * @return MetaDataModel for this ModelKeyDescriptor.  May return null.
-		 */
-		public synchronized MetaDataModel get(ModelKeyDescriptor modelKeyDescriptor){
-			String key = modelKeyDescriptor.toString();
-			return (MetaDataModel)map.get(key);
-		}
-		
-		/**
-		 * @param model from the map
-		 */
-		public void remove(MetaDataModel model){
-			map.remove(model.getModelKey().toString());
-		}
-		/**
-		 * @return models in this map as a Set
-		 */
-		public Set getModels(){
-			Set ret = new HashSet();
-			for (Iterator it=map.entrySet().iterator();it.hasNext();){
-				Map.Entry entry = (Map.Entry)it.next();
-				ret.add(entry.getValue());
-			}
-			return ret;
-		}
-	}
-
-
-}
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 f24b0cb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModelMergeAssistantImpl.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:
- *    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){			
-			mmTrait = 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)
-			processIncludeGroups(model);		
-	}
-	
-	/**
-	 * 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 b082277..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/ModelKeyDescriptor.java
+++ /dev/null
@@ -1,70 +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 IProject project;
-	private String domain;
-	private String uri;
-	private 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;
-		StringBuffer buf = new StringBuffer(domain);
-		buf.append(":");
-		buf.append(uri);
-		key = buf.toString();
-	}
-	
-	/**
-	 * @return domain id
-	 */
-	public String getDomain(){
-		return domain;
-	}
-	
-	/**
-	 * @return model uri
-	 */
-	public String getUri(){
-		return uri;
-	}
-
-	/**
-	 * @return project
-	 */
-	public IProject getProject(){
-		return project;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public 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 58788dc..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/ResourceBundleHelper.java
+++ /dev/null
@@ -1,72 +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 class ResourceBundleHelper {
-
-	/**
-	 * @param resourceURL
-	 * @return ResourceBundle
-	 * @throws MalformedURLException - may return null
-	 * @throws IOException
-	 */
-	public static ResourceBundle getResourceBundle(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(URL resourceURL, Locale targetLocale) throws MalformedURLException, IOException {
-		// try to load bundle from the location specified in the resourceURL
-		//
-		String protocol	= resourceURL.getProtocol();
-		String host		= resourceURL.getHost();
-		String file		= resourceURL.getFile();
-		IPath path 		= new Path(file);
-		
-		String dir = "./";
-		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
-		//         
-		URL[] classpath = new URL[1];
-		classpath[0] = FileLocator.resolve(new URL(protocol, host, dir));
-		ClassLoader resourceLoader = new URLClassLoader(classpath, null);
-
-		return ResourceBundle.getBundle(bundleName, targetLocale, resourceLoader);
-	}
-}
-
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 4cb134e..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
- *
- */
-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 92ae691..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataFilesTranslator.java
+++ /dev/null
@@ -1,81 +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.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);
-		}			
-	}
-	
-	/**
-	 * 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 a2cddc7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardModelFactory.java
+++ /dev/null
@@ -1,190 +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.Iterator;
-import java.util.Map;
-
-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.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 
- *
- * see Model
- */
-public class StandardModelFactory {
-	private static StandardModelFactory INSTANCE;
-	private static boolean DEBUG_MD_LOAD = 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();
-			}
-		}
-		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); 		
-		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);
-	}
-
-
-	static class StandardModelErrorMessageFactory {
-		
-		/**
-		 * 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);
-				JSFCommonPlugin.log(IStatus.ERROR, msg);
-//				System.out.println(msg);
-			}
-			else {
-				JSFCommonPlugin.log(IStatus.ERROR, diagnostic.toString());//do better???
-//				System.out.println(diagnostic.toString());	
-			}
-		}
-
-		private static String createMessage(XMIException ex) {
-			
-			StringBuffer buf = new StringBuffer("Metadata Load Error: ")
-				.append(ex.getClass().getSimpleName()).append(": ");
-			
-			if (ex instanceof PackageNotFoundException)
-				buf.append(((PackageNotFoundException)ex).uri());			
-			else if (ex instanceof ClassNotFoundException)
-				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 = ")
-				.append(ex.getLine()).append(": Column = ").append(ex.getColumn());
-			return buf.toString();
-		}
-	}
-}
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 8f3813a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/TaglibDomainMetaDataModelContextImpl.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:
- *    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 IProject _project;
-	private String _uri;
-	
-	/**
-	 * Constructor
-	 * @param project
-	 * @param domain
-	 * @param uri
-	 */
-	public TaglibDomainMetaDataModelContextImpl(String domain, IProject project, 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);
-	}
-
-}
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 804e368..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 (rawValue == null){
-				result = rawValue;
-			}
-		}
-		return result == null ? null : result.trim();
-	}
-
-	//will return null if there is an IOException with ResourceBundle
-	private static String getNLSPropertyValue(Trait trait, 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 616aaf0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/TraitImpl.java
+++ /dev/null
@@ -1,323 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: TraitImpl.java,v 1.7 2008/02/01 22:16:42 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(@SuppressWarnings("hiding") Object value){
-		if (!(value instanceof String))
-			return super.equals(value);
-		
-		String key = (String)value;
-		if (key.equals(getId()))
-			return true;
-		
-		return false;
-	}
-} //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 7af2b51..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/util/MetadataResourceImpl.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id: MetadataResourceImpl.java,v 1.9 2008/02/01 20:20:47 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.Map;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EPackage;
-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.XMLHelperImpl;
-import org.eclipse.emf.ecore.xmi.impl.XMLLoadImpl;
-import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl;
-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;
-
-/**
- * <!-- 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();
-	}
-
-
-	/**
-	 * Constructorb
-	 * @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) {
-		Object aRoot = resource.getContents().get(0);
-		if (aRoot instanceof Model){			
-			setModelKeyInTraits((Model)aRoot, (Model)aRoot);
-		}
-	}
-
-	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
-	 *
-	 */
-	private 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
-		}
-		
-	}
-} //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 341e4c8..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 e584233..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/util/JDTBeanIntrospector.java
+++ /dev/null
@@ -1,212 +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())
-				&& !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 85b7f47..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/util/TypeUtil.java
+++ /dev/null
@@ -1,609 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and 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.IStatus;
-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++)
-        {
-            IType type = superTypes[i];
-            
-            // XXX: this is a partial workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=212225
-            // In certain cases, unresolved type names may cause resolveType to
-            // throw array out of bounds.
-            try
-            {
-            	resolved = type.resolveType(fullyQualifiedName);
-            }
-            catch (ArrayIndexOutOfBoundsException ae)
-            {
-            	resolved = null;
-            	JSFCommonPlugin.log(IStatus.WARNING, "Known issue detected.  See https://bugs.eclipse.org/bugs/show_bug.cgi?id=212225");
-            }
-            
-            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/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 462d0cb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IMapTypeDescriptorImpl.java
+++ /dev/null
@@ -1,394 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and 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 java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-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;
-
-    /**
-     * 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();
-        final Set keys = source.keySet();
-        final Map segmentMap = processSegments(keys, source);
-        list.addAll(segmentMap.values());
-        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 Set  keys, final Map source)
-    {
-        final Map segmentMap = new HashMap();
-        
-        for (final Iterator it = keys.iterator(); it.hasNext();)
-        {
-            final String key = (String) it.next();
-            final String segments[] = key.split("\\."); //$NON-NLS-1$
-            
-            IPropertySymbol  property = 
-                (IPropertySymbol) segmentMap.get(segments[0]);
-            
-            if (property == null)
-            {
-                final Object propValue = source.get(key);
-                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
-                    {
-                        String className = propValue.getClass().getName();
-                        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), source.get(key));
-                }
-            }
-        }
-        
-        return segmentMap;
-    }
-
-    
-    
-    /**
-     * <!-- 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/META-INF/MANIFEST.MF b/jsf/plugins/org.eclipse.jst.jsf.core/META-INF/MANIFEST.MF
index 5dc60d1..dee9295 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/META-INF/MANIFEST.MF
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %plugin.name
 Bundle-SymbolicName: org.eclipse.jst.jsf.core; singleton:=true
-Bundle-Version: 1.1.0.qualifier
+Bundle-Version: 1.1.100.qualifier
 Bundle-Activator: org.eclipse.jst.jsf.core.internal.JSFCorePlugin
 Bundle-Vendor: %plugin.provider
 Bundle-Localization: plugin
@@ -109,7 +109,7 @@
    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.core.tests",
+ 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,
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
index 0ae9104..6f51617 100644
--- 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
@@ -7,7 +7,7 @@
  *
  * Contributors:
  *    Cameron Bateman/Oracle - initial API and implementation
- *    
+ *
  ********************************************************************************/
 package org.eclipse.jst.jsf.validation.internal.appconfig;
 
@@ -20,10 +20,12 @@
 
 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;
@@ -37,11 +39,14 @@
 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.IValidatorJob;
+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;
@@ -49,42 +54,64 @@
 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 implements IValidatorJob {
+public class AppConfigValidator extends AbstractValidator implements IValidator {
 
-    public ISchedulingRule getSchedulingRule(IValidationContext helper) {
+    @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;
     }
 
-    public IStatus validateInJob(IValidationContext helper, IReporter reporter)
+    /**
+     * @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 (ValidationException e) {
+        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(IReporter reporter) {
+    public void cleanup(final IReporter reporter) {
         // no cleanup
 
     }
 
-    public void validate(IValidationContext helper, IReporter reporter)
-            throws ValidationException 
+    public void validate(final IValidationContext helper, final IReporter reporter)
+            throws ValidationException
     {
-        String[] uris = helper.getURIs();
-        IWorkspaceRoot wsRoot = ResourcesPlugin.getWorkspace().getRoot();
+        final String[] uris = helper.getURIs();
+        final IWorkspaceRoot wsRoot = ResourcesPlugin.getWorkspace().getRoot();
         if (uris.length > 0) {
             IFile currentFile = null;
 
@@ -101,7 +128,7 @@
                 }
             }
         }
-        
+
         // copied from JSPValidator TODO: perhaps just use app config locator?
 //        else {
 //
@@ -134,20 +161,20 @@
 //        }
     }
 
-    private void validateFile(IFile file, IReporter reporter)
+    private void validateFile(final IFile file, final IReporter reporter)
     {
         FacesConfigArtifactEdit  facesConfigEdit = null;
-        
+
         try
         {
-            IPath path = JSFAppConfigUtils.getWebContentFolderRelativePath(file);
+            final IPath path = JSFAppConfigUtils.getWebContentFolderRelativePath(file);
             facesConfigEdit = FacesConfigArtifactEdit.
                 getFacesConfigArtifactEditForRead(file.getProject(), path.toString());
-            
+
             if (facesConfigEdit != null
                     && facesConfigEdit.getFacesConfig()!=null)
             {
-                String version = validateVersioning(file, facesConfigEdit, reporter);
+                final String version = validateVersioning(file, facesConfigEdit, reporter);
                 validateModel(file, facesConfigEdit,reporter, version);
             }
         }
@@ -159,38 +186,38 @@
             }
         }
     }
-    
+
     /**
      * 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(IFile file, FacesConfigArtifactEdit facesConfigEdit, IReporter reporter)
+    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, 
+                    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) 
+                if (IJSFCoreConstants.FACET_VERSION_1_1.equals(appConfigFileVersion)
                         || IJSFCoreConstants.FACET_VERSION_1_0.equals(appConfigFileVersion))
                 {
-                    reporter.addMessage(this, 
+                    reporter.addMessage(this,
                         DiagnosticFactory
                             .create_APP_CONFIG_IS_OLDER_THAN_JSF_VERSION(file
                                     , appConfigFileVersion, projectVersion));
@@ -200,21 +227,21 @@
         }
         return appConfigFileVersion;
     }
-    
+
     /**
      * @param facesConfigEdit
      * @return the version of the app config file or null if not determinant
      */
-    private String getAppConfigFileVersion(FacesConfigArtifactEdit facesConfigEdit)
+    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)
         {
@@ -227,52 +254,52 @@
         }
         else
         {
-            NodeList rootNodes = domModel.getDocument().getChildNodes();
-            
+            final NodeList rootNodes = domModel.getDocument().getChildNodes();
+
             for (int i = 0; i < rootNodes.getLength(); i++)
             {
-                Node node = rootNodes.item(i);
+                final Node node = rootNodes.item(i);
                 if (node.getNodeType() == Node.ELEMENT_NODE
                         && "faces-config".equals(node.getLocalName()))
                 {
-                    NamedNodeMap map = node.getAttributes();
+                    final NamedNodeMap map = node.getAttributes();
                     // the most accurate thing is the version
-                    Node versionAttrib = map.getNamedItem("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, 
+
+    private void validateModel(final IFile file,
+                               final FacesConfigArtifactEdit facesConfigEdit,
                                final IReporter reporter,
                                final String version)
     {
         final FacesConfigType facesConfigType = facesConfigEdit.getFacesConfig();
-        FacesConfigValidator validator = new FacesConfigValidator(version);
-        List messages = new ArrayList();
+        final FacesConfigValidator validator = new FacesConfigValidator(version);
+        final List messages = new ArrayList();
         validator.validate(facesConfigType, messages, file);
-        
+
         for (final Iterator it = messages.iterator(); it.hasNext();)
         {
-            IMessage message = (IMessage) it.next();
+            final IMessage message = (IMessage) it.next();
             reporter.addMessage(this, message);
         }
     }
-    
+
     /**
      * @param project
      * @return the version string for the JSF facet on project
@@ -283,28 +310,28 @@
         try
         {
             final IFacetedProject facetedProject = ProjectFacetsManager.create(project);
-            Set facets = facetedProject.getProjectFacets();
-            
+            final Set facets = facetedProject.getProjectFacets();
+
             for (final Iterator it = facets.iterator(); it.hasNext();)
             {
-                IProjectFacetVersion  facetVersion = 
+                final IProjectFacetVersion  facetVersion =
                     (IProjectFacetVersion) it.next();
-                
+
                 if (IJSFCoreConstants.JSF_CORE_FACET_ID.equals(facetVersion.getProjectFacet().getId()))
                 {
                     return facetVersion.getVersionString();
                 }
             }
         }
-        catch (CoreException ce)
+        catch (final CoreException ce)
         {
             JSFCorePlugin.log(ce, "Problem loading faceted project");
             // fall-through and return null
         }
         return null;
     }
-    
-    private String extractVersionFromPublicId(DocumentType docType)
+
+    private String extractVersionFromPublicId(final DocumentType docType)
     {
         final String publicId = docType.getPublicId();
         final String publicIdRegex = "-\\/\\/(.*)\\/\\/(.*)\\/\\/.*";
@@ -312,26 +339,26 @@
         if (publicId != null)
         {
             final Pattern pattern = Pattern.compile(publicIdRegex);
-            Matcher matcher = pattern.matcher(publicId);
+            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;
                 }
             }
@@ -340,14 +367,14 @@
         return null;
     }
 
-    private String extractVersionFromSystemId(DocumentType docType) 
+    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);
-            Matcher matcher = pattern.matcher(systemId);
+            final Matcher matcher = pattern.matcher(systemId);
 
             if (matcher.matches())
             {
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 14a4a0b..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.0.qualifier
-Bundle-Activator: org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin
-Bundle-Vendor: %plugin.provider
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jdt.core;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.help;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.gef;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.wst.xml.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.sse.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.xml.ui;bundle-version="[1.0.100,1.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 7fc983a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/plugin.properties
+++ /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
-############################################################################
-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
-
-cheatsheet.pagefloweditor.name = Pageflow Editor Cheat Sheet
-cheatsheet.pagefloweditor.description = Cheat Sheet for using the Pageflow 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 6e7a04f..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="Faces Configuration Editor"/>
-     <category
-           id="org.eclipse.jst.jsf"
-           name="JSF Development">
-     </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 bb5d872..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/EditorMessages.java
+++ /dev/null
@@ -1,1554 +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;
-
-	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 35e8d68..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/FacesConfigEditor.java
+++ /dev/null
@@ -1,1373 +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$
-
-	/**
-	 * 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)
-            {
-                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);
-		}
-	}
-
-	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 8a82240..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/FacesConfigMasterDetailPage.java
+++ /dev/null
@@ -1,383 +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 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 cc092c0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/ManagedBeanPage.java
+++ /dev/null
@@ -1,198 +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);
-	}
-
-	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 b0026c9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/OthersPage.java
+++ /dev/null
@@ -1,763 +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.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.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.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.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 {
-
-    /**
-     * The id of this page in the faces-config editor.
-     */
-	public static final String PAGE_ID = "org.eclipse.jst.jsf.facesconfig.ui.page.OthersPage";
-
-	private final static Image BANNER_IMAGE = EditorPlugin.getDefault()
-			.getImage("form_banner.gif");
-
-	private List leftSections;
-
-	private List rightSections;
-
-	private Object input;
-
-	private List selectionChangedListeners = new ArrayList();
-
-	private IPropertySheetPage propertySheetPage;
-
-	private IContentOutlinePage contentOutlinePage;
-
-	private ISelection currentSelection;
-
-	/**
-	 * Constructor of OthersPage;
-	 * 
-	 * @param editor
-	 *            the facesconfig editor;
-	 */
-	public OthersPage(FacesConfigEditor editor) {
-		super(editor, "OthersPage",
-				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);
-	}
-
-	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(new FacesConfigOthersAdapter());
-			setInputForApplicationSections(facesConfig);
-			setInputForFactorySections(facesConfig);
-			setInputForLifecycleSections(facesConfig);
-		}
-	}
-
-	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()) {
-					resetApplicationInput();
-				} else if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getFacesConfigType_Factory()) {
-					resetFactoryInput();
-				} else if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getFacesConfigType_Lifecycle()) {
-					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;
-
-			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 (!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 adab231..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/page/OverviewPage.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is 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 {
-
-	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
-	}
-}
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 b6d6199..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/PageflowMessages.java
+++ /dev/null
@@ -1,444 +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;
-
-	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 6d0cff7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowContainerEditPart.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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;
-
-/**
- * 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:
-					refreshChildren();
-					break;
-				case Notification.SET:
-					refreshVisuals();
-					break;
-				}
-				super.notifyChanged(notification);
-			}
-		};
-	}
-
-}
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 0ff56f2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowEditPart.java
+++ /dev/null
@@ -1,387 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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;
-
-/**
- * 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:
-					refreshChildren();
-					break;
-
-				case Notification.SET:
-					refreshChildren();
-					refreshVisuals();
-					break;
-				case FC2PFTransformer.MY_NOTIFICATION_TYPE1:
-					restore((Pageflow) getModel());
-					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) {
-		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 1f32692..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowElementEditPart.java
+++ /dev/null
@@ -1,346 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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.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) {
-			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(this,
-					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 b6f50c7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowElementTreeEditPart.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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.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:
-			refreshChildren();
-			break;
-
-		case Notification.SET:
-			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 3e77961..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowLinkEditPart.java
+++ /dev/null
@@ -1,471 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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.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);
-				}
-
-				refreshVisuals();
-				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();
-		}
-	}
-
-	/**
-	 * 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() {
-		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 e28f040..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/editpart/PageflowNodeEditPart.java
+++ /dev/null
@@ -1,482 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available 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;
-
-/**
- * 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) {
-						refreshTargetConnections();
-						refreshSourceConnections();
-						validate();
-					}
-					break;
-
-				case Notification.SET:
-					int featureId = notification
-							.getFeatureID(PageflowPackage.class);
-					if (needValidation(featureId)) {
-						validate();
-					}
-					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 36c2acb..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/pageflow/synchronization/PFBatchAdapter.java
+++ /dev/null
@@ -1,55 +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;
-
-/**
- * @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(Notification msg) {
-		if (!isNeedPostpone(msg)) {
-			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 8d47489..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/AbstractFacesConfigSection.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.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 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 9c0f27e..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ComponentGeneralSection.java
+++ /dev/null
@@ -1,403 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.facesconfig.ui.section;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.impl.AdapterImpl;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ClassButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.LayoutUtil;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentClassType;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentType;
-import org.eclipse.jst.jsf.facesconfig.emf.ComponentTypeType;
-import org.eclipse.jst.jsf.facesconfig.emf.DescriptionType;
-import org.eclipse.jst.jsf.facesconfig.emf.DisplayNameType;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigFactory;
-import org.eclipse.jst.jsf.facesconfig.emf.FacesConfigPackage;
-import org.eclipse.jst.jsf.facesconfig.ui.EditorMessages;
-import org.eclipse.jst.jsf.facesconfig.ui.IFacesConfigConstants;
-import org.eclipse.jst.jsf.facesconfig.ui.page.IFacesConfigPage;
-import org.eclipse.jst.jsf.facesconfig.ui.util.ModelUtil;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * The sections that used for displaying and editing the general information of
- * a component, the information includs display name, description, component
- * type and component class.
- * 
- * @author sfshi
- * 
- */
-public class ComponentGeneralSection extends AbstractFacesConfigSection {
-
-	private StringDialogField displayNameField;
-
-	private StringDialogField descriptionField;
-
-	private StringDialogField componentTypeField;
-
-	private ClassButtonDialogField componentClassField;
-
-	private ComponentGeneralAdapter componentGeneralAdapter;
-
-	/**
-	 * 
-	 * @param parent
-	 * @param managedForm
-	 * @param page
-	 * @param toolkit
-	 */
-	public ComponentGeneralSection(Composite parent, IManagedForm managedForm,
-			IFacesConfigPage page, FormToolkit toolkit) {
-		super(parent, managedForm, page, toolkit, null, null);
-		getSection()
-				.setText(EditorMessages.ComponentGeneralSection_Name);
-		getSection().setDescription(
-				EditorMessages.ComponentGeneralSection_Description);
-	}
-
-	/**
-	 * Create the UI fields.
-	 */
-	protected void createContents(Composite container, FormToolkit toolkit) {
-		int numberOfColumns = 4;
-		GridLayout layout = new GridLayout(numberOfColumns, false);
-		container.setLayout(layout);
-		GridData td = new GridData(GridData.FILL_HORIZONTAL);
-		container.setLayoutData(td);
-
-		toolkit.paintBordersFor(container);
-		displayNameField = new StringDialogField();
-		displayNameField
-				.setLabelText(EditorMessages.ComponentGeneralSection_Label_DisplayName);
-		displayNameField.doFillIntoGrid(toolkit, container, numberOfColumns);
-
-		displayNameField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-
-					public void dialogFieldApplied(DialogField field) {
-						String newDisplayNameValue = ((StringDialogField) field)
-								.getText().trim();
-						Command cmd = null;
-						ComponentType component = (ComponentType) getInput();
-						EditingDomain editingDomain = getEditingDomain();
-						if (component.getDisplayName().size() > 0) {
-							DisplayNameType displayName = (DisplayNameType) component
-									.getDisplayName().get(0);
-							cmd = SetCommand.create(editingDomain, displayName,
-									FacesConfigPackage.eINSTANCE
-											.getDisplayNameType_TextContent(),
-									newDisplayNameValue);
-						} else {
-							DisplayNameType displayNameType = FacesConfigFactory.eINSTANCE
-									.createDisplayNameType();
-							displayNameType.setTextContent(newDisplayNameValue);
-
-							/** For the new displayname object, add the adapter. */
-							displayNameType.eAdapters().add(
-									getComponentGeneralAdapter());
-							cmd = AddCommand.create(editingDomain, component,
-									FacesConfigPackage.eINSTANCE
-											.getComponentType_DisplayName(),
-									displayNameType);
-						}
-						if (cmd.canExecute()) {
-							editingDomain.getCommandStack().execute(cmd);
-						}
-					}
-
-				});
-
-		descriptionField = new StringDialogField(2);
-		descriptionField
-				.setLabelText(EditorMessages.ComponentGeneralSection_Label_Description);
-		descriptionField.doFillIntoGrid(toolkit, container, numberOfColumns);
-
-		descriptionField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						String newDescriptionValue = ((StringDialogField) field)
-								.getText().trim();
-
-						newDescriptionValue = ModelUtil
-								.escapeEntities(newDescriptionValue);
-						Command cmd = null;
-						ComponentType component = (ComponentType) getInput();
-						EditingDomain editingDomain = getEditingDomain();
-						if (component.getDescription().size() > 0) {
-							DescriptionType description = (DescriptionType) component
-									.getDescription().get(0);
-							cmd = SetCommand.create(editingDomain, description,
-									FacesConfigPackage.eINSTANCE
-											.getDescriptionType_TextContent(),
-									newDescriptionValue);
-						} else {
-							DescriptionType description = FacesConfigFactory.eINSTANCE
-									.createDescriptionType();
-							description.setTextContent(newDescriptionValue);
-							/** For the new description object, add the adapter. */
-							description.eAdapters().add(
-									getComponentGeneralAdapter());
-
-							cmd = AddCommand.create(editingDomain, component,
-									FacesConfigPackage.eINSTANCE
-											.getComponentType_Description(),
-									description);
-						}
-						if (cmd.canExecute()) {
-							editingDomain.getCommandStack().execute(cmd);
-						}
-					}
-				});
-
-		componentTypeField = new StringDialogField();
-		componentTypeField
-				.setLabelText(EditorMessages.ComponentGeneralSection_Label_ComponentType);
-		componentTypeField.doFillIntoGrid(toolkit, container, numberOfColumns);
-		componentTypeField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						ComponentTypeType componentType = FacesConfigFactory.eINSTANCE
-								.createComponentTypeType();
-						componentType
-								.setTextContent(((StringDialogField) field)
-										.getText());
-
-						EditingDomain editingDomain = getEditingDomain();
-						if (editingDomain != null) {
-							Command command = SetCommand.create(editingDomain,
-									getInput(), FacesConfigPackage.eINSTANCE
-											.getComponentType_ComponentType(),
-									componentType);
-							if (command.canExecute()) {
-								editingDomain.getCommandStack()
-										.execute(command);
-							}
-						}
-					}
-				});
-
-		componentClassField = new ClassButtonDialogField(null);
-		componentClassField
-				.setLabelText(EditorMessages.ComponentGeneralSection_Label_ComponentClass);
-		componentClassField.doFillIntoGrid(toolkit, container, numberOfColumns);
-		LayoutUtil.setHorizontalGrabbing(componentClassField.getTextControl(
-				toolkit, container));
-		componentClassField.setProject((IProject) getPage().getEditor()
-				.getAdapter(IProject.class));
-		componentClassField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-
-						ComponentClassType componentClass = FacesConfigFactory.eINSTANCE
-								.createComponentClassType();
-						componentClass
-								.setTextContent(((StringDialogField) field)
-										.getText());
-						EditingDomain editingDomain = getEditingDomain();
-						if (editingDomain != null) {
-							Command command = SetCommand.create(editingDomain,
-									getInput(), FacesConfigPackage.eINSTANCE
-											.getComponentType_ComponentClass(),
-									componentClass);
-							if (command.canExecute()) {
-								editingDomain.getCommandStack()
-										.execute(command);
-							}
-						}
-
-					}
-				});
-		componentClassField
-				.setSuperClassName(IFacesConfigConstants.COMPONENT_SUPER_CLASS);
-	}
-
-	/**
-	 * 
-	 */
-	public void refreshAll() {
-		refresh();
-	}
-
-	/**
-	 * Refresh the content on this section.
-	 */
-	public void refresh() {
-		super.refresh();
-		Object input = this.getInput();
-		if (input instanceof ComponentType) {
-			ComponentType component = (ComponentType) input;
-
-			if (component.getDisplayName().size() > 0) {
-				DisplayNameType displayName = (DisplayNameType) component
-						.getDisplayName().get(0);
-				displayNameField.setTextWithoutUpdate(displayName
-						.getTextContent());
-			} else {
-				displayNameField.setTextWithoutUpdate("");
-			}
-
-			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("");
-			}
-
-			if (component.getComponentType() != null) {
-				componentTypeField.setTextWithoutUpdate(component
-						.getComponentType().getTextContent());
-			} else {
-				componentTypeField.setTextWithoutUpdate("");
-			}
-
-			if (component.getComponentClass() != null) {
-				componentClassField.setTextWithoutUpdate(component
-						.getComponentClass().getTextContent());
-			} else {
-				componentClassField.setTextWithoutUpdate("");
-			}
-		}
-	}
-
-	/**
-	 * Add ComponentGeneralAdapter onto <component> and the first <display-name>
-	 * and <description> elements.
-	 */
-	protected void addAdaptersOntoInput(Object newInput) {
-		ComponentType component = (ComponentType) newInput;
-		if (EcoreUtil.getExistingAdapter(component,
-				ComponentGeneralSection.class) == null) {
-
-			component.eAdapters().add(getComponentGeneralAdapter());
-		}
-
-		if (component.getDisplayName().size() > 0) {
-			DisplayNameType displayName = (DisplayNameType) component
-					.getDisplayName().get(0);
-			if (EcoreUtil.getExistingAdapter(displayName,
-					ComponentGeneralSection.class) == null) {
-
-				displayName.eAdapters().add(getComponentGeneralAdapter());
-			}
-		}
-
-		if (component.getDescription().size() > 0) {
-			DescriptionType description = (DescriptionType) component
-					.getDescription().get(0);
-			if (EcoreUtil.getExistingAdapter(description,
-					ComponentGeneralSection.class) == null) {
-
-				description.eAdapters().add(getComponentGeneralAdapter());
-			}
-		}
-	}
-
-	/**
-	 * Remove ComponentGeneralAdapter from <component> and the first
-	 * <display-name> and <description> elements.
-	 */
-	protected void removeAdaptersFromInput(Object oldInput) {
-		ComponentType component = (ComponentType) oldInput;
-		if (EcoreUtil.getExistingAdapter(component,
-				ComponentGeneralSection.class) != null) {
-			component.eAdapters().remove(getComponentGeneralAdapter());
-		}
-		if (component.getDisplayName().size() > 0) {
-			DisplayNameType displayName = (DisplayNameType) component
-					.getDisplayName().get(0);
-			if (EcoreUtil.getExistingAdapter(displayName,
-					ComponentGeneralSection.class) != null) {
-
-				displayName.eAdapters().remove(getComponentGeneralAdapter());
-			}
-		}
-
-		if (component.getDescription().size() > 0) {
-			DescriptionType description = (DescriptionType) component
-					.getDescription().get(0);
-			if (EcoreUtil.getExistingAdapter(description,
-					ComponentGeneralSection.class) != null) {
-
-				description.eAdapters().remove(getComponentGeneralAdapter());
-			}
-		}
-	}
-
-	/**
-	 * 
-	 * @return
-	 */
-	private Adapter getComponentGeneralAdapter() {
-
-		if (componentGeneralAdapter == null) {
-			componentGeneralAdapter = new ComponentGeneralAdapter();
-		}
-		return componentGeneralAdapter;
-	}
-
-	/**
-	 * The adapter that will be added onto <component> element, to listen the
-	 * events of the children that are displayed in this section, notify the
-	 * section to refresh.
-	 * 
-	 * @author sfshi
-	 * 
-	 */
-	class ComponentGeneralAdapter extends AdapterImpl {
-
-		public boolean isAdapterForType(Object type) {
-			if (type == ComponentGeneralSection.class)
-				return true;
-			return false;
-		}
-
-		public void notifyChanged(Notification msg) {
-
-			if (msg.getEventType() == Notification.ADD
-					|| msg.getEventType() == Notification.REMOVE
-					|| msg.getEventType() == Notification.SET) {
-				if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getComponentType_ComponentClass()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getComponentType_ComponentType()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getComponentType_DisplayName()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getComponentType_Description()) {
-					refresh();
-				} else if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getDisplayNameType_TextContent()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getDescriptionType_TextContent()) {
-					refresh();
-				}
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ComponentMasterSection.java b/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ComponentMasterSection.java
deleted file mode 100644
index 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 baf6097..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ConverterGeneralSection.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.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.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) {
-			ConverterType Converter = (ConverterType) input;
-
-			if (Converter.getDisplayName().size() > 0) {
-				DisplayNameType displayName = (DisplayNameType) Converter
-						.getDisplayName().get(0);
-				displayNameField.setTextWithoutUpdate(displayName
-						.getTextContent());
-			} else {
-				displayNameField.setTextWithoutUpdate("");
-			}
-
-			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("");
-			}
-
-			if (Converter.getConverterId() != null) {
-				converterIdField.setTextWithoutUpdate(Converter
-						.getConverterId().getTextContent());
-			} else {
-				converterIdField.setTextWithoutUpdate("");
-			}
-
-			if (Converter.getConverterForClass() != null) {
-				converterForClassField.setTextWithoutUpdate(Converter
-						.getConverterForClass().getTextContent());
-			} else {
-				converterForClassField.setTextWithoutUpdate("");
-			}
-
-			if (Converter.getConverterClass() != null) {
-				converterClassField.setTextWithoutUpdate(Converter
-						.getConverterClass().getTextContent());
-			} else {
-				converterClassField.setTextWithoutUpdate("");
-			}
-
-		}
-	}
-
-	/**
-	 * 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()) {
-					refresh();
-				} else if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getDisplayNameType_TextContent()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getDescriptionType_TextContent()) {
-					refresh();
-				}
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/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 baa845c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/FacesConfigMasterSection.java
+++ /dev/null
@@ -1,320 +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);
-	}
-
-	/**
-	 * 
-	 */
-	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 5183648..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/LocaleConfigSection.java
+++ /dev/null
@@ -1,380 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is 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.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.forms.IManagedForm;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * @author Zhi-peng Zhang, sfshi
- * @version
- */
-public class LocaleConfigSection extends ApplicationSection implements
-		ICheckStateListener {
-	/**
-	 * 
-	 * @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);
-	}
-
-	/**
-	 * 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);
-				}
-			}
-		}
-	}
-
-	/**
-	 * 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 (EcoreUtil.getExistingAdapter(application,
-					LocaleConfigSection.class) == null) {
-				application.eAdapters().add(new LocaleConfigAdapter());
-			}
-			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.
-					 */
-					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 f65d6b9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ManagedBeanGeneralSection.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.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.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) {
-			ManagedBeanType component = (ManagedBeanType) input;
-
-			if (component.getManagedBeanName() != null) {
-				mbNameField.setTextWithoutUpdate(component.getManagedBeanName()
-						.getTextContent());
-			} else {
-				mbNameField.setTextWithoutUpdate("");
-			}
-
-			if (component.getManagedBeanClass() != null) {
-				mbClassField.setTextWithoutUpdate(component
-						.getManagedBeanClass().getTextContent());
-			} else {
-				mbClassField.setTextWithoutUpdate("");
-			}
-
-			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()) {
-					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 1289f41..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ManagedBeanMasterSection.java
+++ /dev/null
@@ -1,354 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is 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) {
-		super.removeAdaptersFromInput(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());
-			}
-		}
-	}
-
-	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());
-					}
-
-					Runnable run = new Runnable() {
-
-						public void run() {
-							getStructuredViewer().refresh(true);
-							IStructuredSelection selection = new StructuredSelection(
-									mbean);
-							getStructuredViewer().setSelection(selection);
-						}
-
-					};
-					PlatformUI.getWorkbench().getDisplay().asyncExec(run);
-				} else if (msg.getEventType() == Notification.REMOVE) {
-
-					Runnable run = new Runnable() {
-						public void run() {
-							getStructuredViewer().refresh(true);
-						}
-
-					};
-					PlatformUI.getWorkbench().getDisplay().asyncExec(run);
-				}
-
-				else if (msg.getEventType() == Notification.SET) {
-					final Object mbean = msg.getNewValue();
-					Runnable run = new Runnable() {
-						public void run() {
-							getStructuredViewer().refresh(mbean, true);
-						}
-
-					};
-					PlatformUI.getWorkbench().getDisplay().asyncExec(run);
-				}
-			}
-
-			if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-					.getManagedBeanType_ManagedBeanClass()
-					|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-							.getManagedBeanType_ManagedBeanName()) {
-
-				final Object bean = msg.getNotifier();
-
-				Runnable run = new Runnable() {
-
-					public void run() {
-						getStructuredViewer().refresh(bean, true);
-					}
-
-				};
-				PlatformUI.getWorkbench().getDisplay().asyncExec(run);
-
-			} else if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-					.getManagedBeanType_ManagedBeanScope()) {
-
-				final Object mbean = msg.getNotifier();
-
-				Runnable run1 = new Runnable() {
-
-					public void run() {
-						getStructuredViewer().refresh();
-						IStructuredSelection selection = new StructuredSelection(
-								mbean);
-						getStructuredViewer().setSelection(selection);
-					}
-
-				};
-				PlatformUI.getWorkbench().getDisplay().asyncExec(run1);
-			}
-
-		}
-	}
-
-}
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 1d1d312..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OthersPageBaseSection.java
+++ /dev/null
@@ -1,315 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is 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);
-	}
-
-	/*
-	 * (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 973c4f0..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewNavigationSection.java
+++ /dev/null
@@ -1,381 +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.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 ? ""
-							: ((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;
-			}
-
-			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 (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)
-					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();
-					tableViewer.refresh(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();
-					tableViewer.refresh(navigationCase);
-				}
-				return;
-			}
-
-		}
-	}
-}
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 573987f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/OverviewOthersSection.java
+++ /dev/null
@@ -1,350 +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.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() {
-
-		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) {
-					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 399f547..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/RenderkitGeneralSection.java
+++ /dev/null
@@ -1,399 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is 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.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) {
-			RenderKitType Renderkit = (RenderKitType) input;
-
-			if (Renderkit.getDisplayName().size() > 0) {
-				DisplayNameType displayName = (DisplayNameType) Renderkit
-						.getDisplayName().get(0);
-				displayNameField.setTextWithoutUpdate(displayName
-						.getTextContent());
-			} else {
-				displayNameField.setTextWithoutUpdate("");
-			}
-
-			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("");
-			}
-
-			if (Renderkit.getRenderKitId() != null) {
-				renderkitIdField.setTextWithoutUpdate(Renderkit
-						.getRenderKitId().getTextContent());
-			} else {
-				renderkitIdField.setTextWithoutUpdate("");
-			}
-
-			if (Renderkit.getRenderKitClass() != null) {
-				renderkitClassField.setTextWithoutUpdate(Renderkit
-						.getRenderKitClass().getTextContent());
-			} else {
-				renderkitClassField.setTextWithoutUpdate("");
-			}
-		}
-	}
-
-	/**
-	 * 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()) {
-					refresh();
-				} else if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getDisplayNameType_TextContent()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getDescriptionType_TextContent()) {
-					refresh();
-				}
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/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 649b7f7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/ValidatorGeneralSection.java
+++ /dev/null
@@ -1,400 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2005 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is 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.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) {
-			ValidatorType validator = (ValidatorType) input;
-
-			if (validator.getDisplayName().size() > 0) {
-				DisplayNameType displayName = (DisplayNameType) validator
-						.getDisplayName().get(0);
-				displayNameField.setTextWithoutUpdate(displayName
-						.getTextContent());
-			} else {
-				displayNameField.setTextWithoutUpdate("");
-			}
-
-			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("");
-			}
-
-			if (validator.getValidatorId() != null) {
-				validatorIDField.setTextWithoutUpdate(validator
-						.getValidatorId().getTextContent());
-			} else {
-				validatorIDField.setTextWithoutUpdate("");
-			}
-
-			if (validator.getValidatorClass() != null) {
-				validatorClassField.setTextWithoutUpdate(validator
-						.getValidatorClass().getTextContent());
-			} else {
-				validatorClassField.setTextWithoutUpdate("");
-			}
-		}
-	}
-
-	/**
-	 * 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()) {
-					refresh();
-				} else if (msg.getFeature() == FacesConfigPackage.eINSTANCE
-						.getDisplayNameType_TextContent()
-						|| msg.getFeature() == FacesConfigPackage.eINSTANCE
-								.getDescriptionType_TextContent()) {
-					refresh();
-				}
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.facesconfig.ui/src/org/eclipse/jst/jsf/facesconfig/ui/section/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 9ab174c..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.0.qualifier
-Bundle-Activator: org.eclipse.jst.jsf.facesconfig.FacesConfigPlugin$Implementation
-Bundle-Vendor: %plugin.provider
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jst.j2ee;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.emf.ecore.xmi;bundle-version="[2.2.0,3.0.0)",
- org.eclipse.wst.common.emf;bundle-version="[1.1.103,2.0.0)",
- org.eclipse.emf.edit.ui;bundle-version="[2.2.0,3.0.0)",
- org.eclipse.wst.xml.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.common.uriresolver;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.sse.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.common.emfworkbench.integration;bundle-version="[1.1.0,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 6c9c099..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.facesconfig/facesconfig/org/eclipse/jst/jsf/facesconfig/edit/provider/ManagedBeanTypeItemProvider.java
+++ /dev/null
@@ -1,351 +0,0 @@
-/***************************************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others. 
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * 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 f6ba66c..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.0.qualifier
-Bundle-Localization: plugin
-Bundle-Activator: org.eclipse.jst.jsf.standard.tagsupport.StandardTagSupportPlugin
-Require-Bundle: org.eclipse.ui;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jst.jsf.common;bundle-version="[1.0.0,2.0.0)",
- org.eclipse.emf.ecore.xmi;bundle-version="[2.2.0,3.0.0)"
-Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Export-Package: org.eclipse.jst.jsf.standard.tagsupport;x-internal:=true
-Bundle-Vendor: %pluginProvider
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/about.html b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/about.html
deleted file mode 100644
index 8e56059..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June, 2008</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-</body>
-</html>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/build.properties b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/build.properties
deleted file mode 100644
index aa99bac..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/build.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2008 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               metadata/,\
-               plugin.properties,\
-               about.html,\
-               icons/
-javacSource=1.5
-javacTarget=1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/icons/palette/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/META-INF/MANIFEST.MF b/jsf/plugins/org.eclipse.jst.jsf.ui/META-INF/MANIFEST.MF
index d328deb..00ebb44 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/META-INF/MANIFEST.MF
+++ b/jsf/plugins/org.eclipse.jst.jsf.ui/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %plugin.name
 Bundle-SymbolicName: org.eclipse.jst.jsf.ui; singleton:=true
-Bundle-Version: 1.1.0.qualifier
+Bundle-Version: 1.1.100.qualifier
 Bundle-Activator: org.eclipse.jst.jsf.ui.internal.JSFUiPlugin
 Bundle-Vendor: %plugin.provider
 Bundle-Localization: plugin
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 86ded0f..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.0.qualifier
-Bundle-Activator: org.eclipse.jst.pagedesigner.jsf.ui.JSFUIPlugin
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.jst.jsf.facesconfig;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.jst.pagedesigner;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.jst.pagedesigner.jsp.core;bundle-version="[1.1.0,2.0.0)",
- org.eclipse.wst.common.modulecore;bundle-version="[1.1.0,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 bd2ed89..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFAddActionGroup.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http:// www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.jsf.ui.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().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().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();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/.classpath b/jsf/plugins/org.eclipse.jst.pagedesigner/.classpath
deleted file mode 100644
index 472ee29..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/.cvsignore b/jsf/plugins/org.eclipse.jst.pagedesigner/.cvsignore
deleted file mode 100644
index f9eb27a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/.cvsignore
+++ /dev/null
@@ -1,3 +0,0 @@
-build.xml
-@dot
-javaCompiler...args
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/.project b/jsf/plugins/org.eclipse.jst.pagedesigner/.project
deleted file mode 100644
index 290ca26..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/.project
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.pagedesigner</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.jem.beaninfo.BeanInfoNature</nature>
-	</natures>
-</projectDescription>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/.settings/org.eclipse.core.resources.prefs b/jsf/plugins/org.eclipse.jst.pagedesigner/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index f2dd42a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Sun May 27 16:04:56 EDT 2007
-eclipse.preferences.version=1
-encoding/<project>=ISO-8859-1
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/.settings/org.eclipse.jdt.core.prefs b/jsf/plugins/org.eclipse.jst.pagedesigner/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index fc050cb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,81 +0,0 @@
-#Fri Dec 14 11:18:54 PST 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.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.pagedesigner/.settings/org.eclipse.jdt.ui.prefs b/jsf/plugins/org.eclipse.jst.pagedesigner/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 82eb6c1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Fri Apr 06 18:25:15 PDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates/>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/.settings/org.eclipse.pde.prefs b/jsf/plugins/org.eclipse.jst.pagedesigner/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index 6a74a22..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,22 +0,0 @@
-#Fri May 30 11:58:12 PDT 2008
-compilers.f.unresolved-features=1
-compilers.f.unresolved-plugins=1
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=1
-compilers.p.discouraged-class=1
-compilers.p.internal=1
-compilers.p.missing-packages=0
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=0
-compilers.p.unknown-attribute=1
-compilers.p.unknown-class=1
-compilers.p.unknown-element=1
-compilers.p.unknown-identifier=1
-compilers.p.unknown-resource=1
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.s.create-docs=false
-compilers.s.doc-folder=doc
-compilers.s.open-tags=1
-eclipse.preferences.version=1
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/META-INF/MANIFEST.MF b/jsf/plugins/org.eclipse.jst.pagedesigner/META-INF/MANIFEST.MF
deleted file mode 100644
index e6b7e26..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,125 +0,0 @@
-Manifest-Version: 1.0
-Bundle-SymbolicName: org.eclipse.jst.pagedesigner;singleton:=true
-Bundle-Name: %pluginName
-Bundle-Version: 1.1.0.qualifier
-Bundle-Activator: org.eclipse.jst.pagedesigner.PDPlugin
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.debug.ui;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.emf.ecore;bundle-version="[2.2.0,3.0.0)",
- org.eclipse.gef;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jface.text;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.ui.workbench.texteditor;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.wst.common.ui;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.common.uriresolver;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.sse.ui;bundle-version="[1.0.101,1.2.0)",
- org.eclipse.jst.j2ee;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.jst.jsp.core;bundle-version="[1.1.0,1.3.0)",
- org.eclipse.jst.jsp.ui;bundle-version="[1.1.0,1.3.0)",
- org.eclipse.jst.j2ee.web;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.jst.pagedesigner.jsp.core;bundle-version="[1.0.0,2.0.0)",
- org.eclipse.jst.jsf.common.ui;bundle-version="[1.0.0,2.0.0)",
- org.eclipse.ui.ide;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jdt.ui;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jst.jsf.common;bundle-version="[1.0.0,2.0.0)",
- org.eclipse.jst.jsf.core;bundle-version="[1.0.0,2.0.0)",
- org.eclipse.jdt.core;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.wst.html.ui;bundle-version="[1.0.100,1.1.0)",
- org.eclipse.wst.css.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.html.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.xml.ui;bundle-version="[1.0.100,1.1.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)",
- javax.servlet;bundle-version="[2.4.0,3.0.0)",
- org.apache.commons.el;bundle-version="[1.0.0,2.0.0)",
- javax.servlet.jsp;bundle-version="[2.0.0,3.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;x-internal:=true,
- org.eclipse.jst.pagedesigner.actions.container;x-internal:=true,
- org.eclipse.jst.pagedesigner.actions.link;x-internal:=true,
- org.eclipse.jst.pagedesigner.actions.menuextension;x-internal:=true,
- org.eclipse.jst.pagedesigner.actions.range;x-internal:=true,
- org.eclipse.jst.pagedesigner.actions.single;x-internal:=true,
- org.eclipse.jst.pagedesigner.actions.table;x-internal:=true,
- org.eclipse.jst.pagedesigner.adapters;x-internal:=true,
- org.eclipse.jst.pagedesigner.adapters.internal;x-internal:=true,
- org.eclipse.jst.pagedesigner.commands;x-internal:=true,
- org.eclipse.jst.pagedesigner.commands.html;x-internal:=true,
- org.eclipse.jst.pagedesigner.commands.nav;x-internal:=true,
- org.eclipse.jst.pagedesigner.commands.range;x-internal:=true,
- org.eclipse.jst.pagedesigner.commands.single;x-internal:=true,
- org.eclipse.jst.pagedesigner.converter,
- org.eclipse.jst.pagedesigner.converter.html;x-internal:=true,
- org.eclipse.jst.pagedesigner.converter.jsp;x-internal:=true,
- org.eclipse.jst.pagedesigner.css2;x-internal:=true,
- org.eclipse.jst.pagedesigner.css2.border;x-internal:=true,
- org.eclipse.jst.pagedesigner.css2.color;x-internal:=true,
- org.eclipse.jst.pagedesigner.css2.font;x-internal:=true,
- org.eclipse.jst.pagedesigner.css2.layout;x-internal:=true,
- org.eclipse.jst.pagedesigner.css2.layout.table;x-internal:=true,
- org.eclipse.jst.pagedesigner.css2.list;x-internal:=true,
- org.eclipse.jst.pagedesigner.css2.marker;x-internal:=true,
- org.eclipse.jst.pagedesigner.css2.property;x-internal:=true,
- org.eclipse.jst.pagedesigner.css2.provider;x-internal:=true,
- org.eclipse.jst.pagedesigner.css2.style;x-internal:=true,
- org.eclipse.jst.pagedesigner.css2.value;x-internal:=true,
- org.eclipse.jst.pagedesigner.css2.widget;x-internal:=true,
- org.eclipse.jst.pagedesigner.dnd;x-internal:=true,
- org.eclipse.jst.pagedesigner.dnd.internal;x-internal:=true,
- org.eclipse.jst.pagedesigner.dom;x-internal:=true,
- org.eclipse.jst.pagedesigner.dom.html;x-internal:=true,
- org.eclipse.jst.pagedesigner.dtmanager,
- org.eclipse.jst.pagedesigner.dtmanager.converter,
- org.eclipse.jst.pagedesigner.dtmanager.converter.internal;x-friends:="org.eclipse.jst.pagedesigner.jsf.ui",
- org.eclipse.jst.pagedesigner.dtmanager.converter.operations,
- org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;x-friends:="org.eclipse.jst.pagedesigner.tests",
- org.eclipse.jst.pagedesigner.dtmanager.dtinfo,
- org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl;x-internal:=true,
- org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.util;x-internal:=true,
- org.eclipse.jst.pagedesigner.editors;x-internal:=true,
- org.eclipse.jst.pagedesigner.editors.actions;x-internal:=true,
- org.eclipse.jst.pagedesigner.editors.pagedesigner;x-internal:=true,
- org.eclipse.jst.pagedesigner.editors.palette;x-internal:=true,
- org.eclipse.jst.pagedesigner.editors.palette.impl;x-internal:=true,
- org.eclipse.jst.pagedesigner.editors.properties,
- org.eclipse.jst.pagedesigner.editors.properties.internal;x-internal:=true,
- org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections,
- org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl;x-internal:=true,
- org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.util;x-internal:=true,
- org.eclipse.jst.pagedesigner.editpolicies;x-internal:=true,
- org.eclipse.jst.pagedesigner.elementedit;x-internal:=true,
- org.eclipse.jst.pagedesigner.elementedit.html;x-internal:=true,
- org.eclipse.jst.pagedesigner.elementedit.jsp;x-internal:=true,
- org.eclipse.jst.pagedesigner.extensionpoint,
- org.eclipse.jst.pagedesigner.figurehandler;x-internal:=true,
- org.eclipse.jst.pagedesigner.itemcreation;x-internal:=true,
- org.eclipse.jst.pagedesigner.itemcreation.command;x-internal:=true,
- org.eclipse.jst.pagedesigner.itemcreation.customizer;x-internal:=true,
- org.eclipse.jst.pagedesigner.itemcreation.internal;x-internal:=true,
- org.eclipse.jst.pagedesigner.meta;x-internal:=true,
- org.eclipse.jst.pagedesigner.meta.internal;x-internal:=true,
- org.eclipse.jst.pagedesigner.parts;x-internal:=true,
- org.eclipse.jst.pagedesigner.preview;x-internal:=true,
- org.eclipse.jst.pagedesigner.properties;x-friends:="org.eclipse.jst.pagedesigner.tests",
- org.eclipse.jst.pagedesigner.properties.attrgroup;x-friends:="org.eclipse.jst.pagedesigner.tests",
- org.eclipse.jst.pagedesigner.properties.celleditors;x-friends:="org.eclipse.jst.pagedesigner.tests",
- org.eclipse.jst.pagedesigner.properties.dialogfields;x-internal:=true,
- org.eclipse.jst.pagedesigner.properties.internal;x-friends:="org.eclipse.jst.pagedesigner.tests",
- org.eclipse.jst.pagedesigner.range;x-internal:=true,
- org.eclipse.jst.pagedesigner.requests;x-internal:=true,
- org.eclipse.jst.pagedesigner.tableedit;x-internal:=true,
- org.eclipse.jst.pagedesigner.tools;x-internal:=true,
- org.eclipse.jst.pagedesigner.ui.common;x-internal:=true,
- org.eclipse.jst.pagedesigner.ui.common.sash;x-internal:=true,
- org.eclipse.jst.pagedesigner.ui.dialogfields;x-internal:=true,
- org.eclipse.jst.pagedesigner.ui.dialogs;x-internal:=true,
- org.eclipse.jst.pagedesigner.utils;x-internal:=true,
- org.eclipse.jst.pagedesigner.validation.caret;x-internal:=true,
- org.eclipse.jst.pagedesigner.viewer;x-internal:=true
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-
-
-
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/about.html b/jsf/plugins/org.eclipse.jst.pagedesigner/about.html
deleted file mode 100644
index 90bd74d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June, 2008</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-</body>
-</html>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/build.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/build.properties
deleted file mode 100644
index a18d5dc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/build.properties
+++ /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
-###############################################################################
-jars.compile.order = .
-source.. = src/
-output.. = bin/
-bin.includes = .,\
-               META-INF/,\
-               icons/,\
-               plugin.properties,\
-               plugin.xml,\
-               schema/,\
-               about.html,\
-               default.properties
-javacSource=1.5
-javacTarget=1.5
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/default.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/default.properties
deleted file mode 100644
index d6297e4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/default.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-# This file contains all the Default Preference Settings
-
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/LineBreak.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/LineBreak.gif
deleted file mode 100644
index b468685..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/LineBreak.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/MoveHandle.png b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/MoveHandle.png
deleted file mode 100644
index 679ef99..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/MoveHandle.png
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Binding.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Binding.gif
deleted file mode 100644
index 6638a99..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Binding.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Binding_disabled.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Binding_disabled.gif
deleted file mode 100644
index c5064fd..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Binding_disabled.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Plugin.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Plugin.gif
deleted file mode 100644
index 471b1b5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Plugin.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_bold.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_bold.gif
deleted file mode 100644
index f814851..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_bold.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_bold_disabled.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_bold_disabled.gif
deleted file mode 100644
index 639de46..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_bold_disabled.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_designer.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_designer.gif
deleted file mode 100644
index fdfcae0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_designer.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_hsplit.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_hsplit.gif
deleted file mode 100644
index 4dae95d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_hsplit.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_italic.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_italic.gif
deleted file mode 100644
index fb765fe..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_italic.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_italic_disabled.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_italic_disabled.gif
deleted file mode 100644
index 7475315..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_italic_disabled.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_largefont.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_largefont.gif
deleted file mode 100644
index 39afd38..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_largefont.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_largefont_disabled.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_largefont_disabled.gif
deleted file mode 100644
index fe38ccb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_largefont_disabled.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_paragraph.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_paragraph.gif
deleted file mode 100644
index b129090..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_paragraph.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_smallfont.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_smallfont.gif
deleted file mode 100644
index f0b4eba..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_smallfont.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_smallfont_disabled.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_smallfont_disabled.gif
deleted file mode 100644
index c02528a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_smallfont_disabled.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_source.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_source.gif
deleted file mode 100644
index 86986df..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_source.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_underline.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_underline.gif
deleted file mode 100644
index b8ac977..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_underline.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_underline_disabled.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_underline_disabled.gif
deleted file mode 100644
index f06517b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_underline_disabled.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_vsplit.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_vsplit.gif
deleted file mode 100644
index 6564d07..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_Toolbar_vsplit.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_nopic.jpg b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_nopic.jpg
deleted file mode 100644
index f98b233..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/PD_nopic.jpg
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/newsuade_wiz.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/newsuade_wiz.gif
deleted file mode 100644
index ecd75f4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/newsuade_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/large/PD_Palette_Default.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/large/PD_Palette_Default.gif
deleted file mode 100644
index a320fcb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/large/PD_Palette_Default.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Default.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Default.gif
deleted file mode 100644
index 5e7fb33..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Default.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Export.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Export.gif
deleted file mode 100644
index 095beb0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Export.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Export_Disabled.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Export_Disabled.gif
deleted file mode 100644
index 04800a6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Export_Disabled.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Export_Hover.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Export_Hover.gif
deleted file mode 100644
index 095beb0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Export_Hover.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Import.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Import.gif
deleted file mode 100644
index 0af6903..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Import.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Import_Disabled.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Import_Disabled.gif
deleted file mode 100644
index 5c828d4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Import_Disabled.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Import_Hover.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Import_Hover.gif
deleted file mode 100644
index 0af6903..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/palette/GENERIC/small/PD_Palette_Import_Hover.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/pin_down.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/pin_down.gif
deleted file mode 100644
index e85fa90..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/pin_down.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/pin_up.gif b/jsf/plugins/org.eclipse.jst.pagedesigner/icons/pin_up.gif
deleted file mode 100644
index 5eeef33..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/icons/pin_up.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/model/DTInfo.ecore b/jsf/plugins/org.eclipse.jst.pagedesigner/model/DTInfo.ecore
deleted file mode 100644
index 7343bdf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/model/DTInfo.ecore
+++ /dev/null
@@ -1,84 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ecore:EPackage xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="dtinfo"
-    nsURI="http://org.eclipse.jsf.pagedesigner/dtinfo.ecore" nsPrefix="dti">
-  <eClassifiers xsi:type="ecore:EClass" name="DTInfo">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="tagConvertInfo" lowerBound="1"
-        eType="#//TagConvertInfo" containment="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="tag-convert-info"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="tagDecorateInfos" upperBound="-1"
-        eType="#//TagDecorateInfo" containment="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="tag-decorate-info"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="TagConvertInfo">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="operations" upperBound="-1"
-        eType="#//Operation" containment="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="operation"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Operation">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
-        iD="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="parameters" upperBound="-1"
-        eType="#//Parameter" containment="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="parameter"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="operations" upperBound="-1"
-        eType="#//Operation" containment="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="operation"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Parameter">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="TagDecorateInfo">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"
-        iD="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="minHeight" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="minWidth" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="multiLevel" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
-        defaultValueLiteral="false"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="needBorderDecorator" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
-        defaultValueLiteral="false"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="needTableDecorator" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
-        defaultValueLiteral="false"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="nonVisual" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
-        defaultValueLiteral="false"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="nonVisualImagePath" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="resolveChildText" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
-        defaultValueLiteral="false"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="resolveAttributeValue"
-        eType="#//ResolveAttributeValue" containment="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="resolve-attribute-value"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="setNonVisualChildElements"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean" defaultValueLiteral="false"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="widget" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
-        defaultValueLiteral="false"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="ResolveAttributeValue">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="attributeName" lowerBound="1"
-        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-  </eClassifiers>
-</ecore:EPackage>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/model/DTInfo.genmodel b/jsf/plugins/org.eclipse.jst.pagedesigner/model/DTInfo.genmodel
deleted file mode 100644
index a85b144..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/model/DTInfo.genmodel
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<genmodel:GenModel xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" copyrightText="Copyright (c) 2007 Oracle Corporation"
-    modelDirectory="/org.eclipse.jst.pagedesigner/src" editDirectory="/org.eclipse.jst.pagedesigner/src"
-    editorDirectory="/org.eclipse.jst.pagedesigner/src" modelPluginID="org.eclipse.jst.pagedesigner"
-    modelName="DTInfo" editPluginClass="org.eclipse.jst.pagedesigner.PDPlugin" editorPluginClass="org.eclipse.jst.pagedesigner.PDPlugin"
-    testsDirectory="/org.eclipse.jst.pagedesigner/src" testSuiteClass="org.eclipse.jst.pagedesigner.PDPlugin"
-    importerID="org.eclipse.emf.importer.ecore">
-  <foreignModel>DTInfo.ecore</foreignModel>
-  <genPackages prefix="DTInfo" basePackage="org.eclipse.jst.pagedesigner.dtmanager"
-      disposableProviderFactory="true" classPackageSuffix="internal.impl" utilityPackageSuffix="internal.util"
-      providerPackageSuffix="internal.provider" presentationPackageSuffix="internal.presentation"
-      testsPackageSuffix="internal.tests" generateExampleClass="false" ecorePackage="DTInfo.ecore#/">
-    <genClasses ecoreClass="DTInfo.ecore#//DTInfo">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference DTInfo.ecore#//DTInfo/tagConvertInfo"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference DTInfo.ecore#//DTInfo/tagDecorateInfos"/>
-    </genClasses>
-    <genClasses ecoreClass="DTInfo.ecore#//TagConvertInfo">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference DTInfo.ecore#//TagConvertInfo/operations"/>
-    </genClasses>
-    <genClasses image="false" ecoreClass="DTInfo.ecore#//Operation">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute DTInfo.ecore#//Operation/id"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference DTInfo.ecore#//Operation/parameters"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference DTInfo.ecore#//Operation/operations"/>
-    </genClasses>
-    <genClasses ecoreClass="DTInfo.ecore#//Parameter">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute DTInfo.ecore#//Parameter/value"/>
-    </genClasses>
-    <genClasses ecoreClass="DTInfo.ecore#//TagDecorateInfo">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute DTInfo.ecore#//TagDecorateInfo/id"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute DTInfo.ecore#//TagDecorateInfo/minHeight"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute DTInfo.ecore#//TagDecorateInfo/minWidth"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute DTInfo.ecore#//TagDecorateInfo/multiLevel"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute DTInfo.ecore#//TagDecorateInfo/needBorderDecorator"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute DTInfo.ecore#//TagDecorateInfo/needTableDecorator"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute DTInfo.ecore#//TagDecorateInfo/nonVisual"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute DTInfo.ecore#//TagDecorateInfo/nonVisualImagePath"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute DTInfo.ecore#//TagDecorateInfo/resolveChildText"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference DTInfo.ecore#//TagDecorateInfo/resolveAttributeValue"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute DTInfo.ecore#//TagDecorateInfo/setNonVisualChildElements"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute DTInfo.ecore#//TagDecorateInfo/widget"/>
-    </genClasses>
-    <genClasses ecoreClass="DTInfo.ecore#//ResolveAttributeValue">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute DTInfo.ecore#//ResolveAttributeValue/attributeName"/>
-    </genClasses>
-  </genPackages>
-</genmodel:GenModel>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/model/QuickEditTabSections.ecore b/jsf/plugins/org.eclipse.jst.pagedesigner/model/QuickEditTabSections.ecore
deleted file mode 100644
index 5b3c237..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/model/QuickEditTabSections.ecore
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ecore:EPackage xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="quickedittabsections"
-    nsURI="http://org.eclipse.jsf.pagedesigner/QuickEditTabSections.ecore" nsPrefix="qe">
-  <eClassifiers xsi:type="ecore:EClass" name="QuickEditTabSections">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="sections" upperBound="-1"
-        eType="#//SectionInfo" containment="true">
-      <eAnnotations source="http:///org/eclipse/emf/ecore/util/ExtendedMetaData">
-        <details key="kind" value="element"/>
-        <details key="name" value="section"/>
-      </eAnnotations>
-    </eStructuralFeatures>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="SectionInfo">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="type" unique="false" eType="#//SECTION_TYPE"
-        defaultValueLiteral="ATTRIBUTE"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EEnum" name="SECTION_TYPE">
-    <eLiterals name="ATTRIBUTE"/>
-    <eLiterals name="SECTION" value="1"/>
-  </eClassifiers>
-</ecore:EPackage>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/model/QuickEditTabSections.genmodel b/jsf/plugins/org.eclipse.jst.pagedesigner/model/QuickEditTabSections.genmodel
deleted file mode 100644
index 4aed6be..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/model/QuickEditTabSections.genmodel
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<genmodel:GenModel xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" copyrightText="Copyright (c) 2007 Oracle Corporation"
-    modelDirectory="/org.eclipse.jst.pagedesigner/src" editDirectory="/org.eclipse.jst.pagedesigner/src"
-    editorDirectory="/org.eclipse.jst.pagedesigner/src" modelPluginID="org.eclipse.jst.pagedesigner"
-    modelName="QuickEditTabSections" editPluginClass="org.eclipse.jst.pagedesigner.PDPlugin"
-    editorPluginClass="/org.eclipse.jst.pagedesigner.PDPlugin" importerID="org.eclipse.emf.importer.ecore"
-    complianceLevel="5.0" providerRootExtendsClass="">
-  <foreignModel>QuickEditTabSections.ecore</foreignModel>
-  <genPackages prefix="QuickEditTabSections" basePackage="org.eclipse.jst.pagedesigner.editors.properties"
-      disposableProviderFactory="true" classPackageSuffix="internal.impl" utilityPackageSuffix="internal.util"
-      providerPackageSuffix="internal.provider" presentationPackageSuffix="internal.presentation"
-      testsPackageSuffix="internal.tests" generateExampleClass="false" multipleEditorPages="false"
-      generateModelWizard="false" ecorePackage="QuickEditTabSections.ecore#/">
-    <genEnums typeSafeEnumCompatible="false" ecoreEnum="QuickEditTabSections.ecore#//SECTION_TYPE">
-      <genEnumLiterals ecoreEnumLiteral="QuickEditTabSections.ecore#//SECTION_TYPE/ATTRIBUTE"/>
-      <genEnumLiterals ecoreEnumLiteral="QuickEditTabSections.ecore#//SECTION_TYPE/GROUP"/>
-    </genEnums>
-    <genClasses ecoreClass="QuickEditTabSections.ecore#//QuickEditTabSections">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference QuickEditTabSections.ecore#//QuickEditTabSections/sections"/>
-    </genClasses>
-    <genClasses image="false" ecoreClass="QuickEditTabSections.ecore#//Section">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute QuickEditTabSections.ecore#//Section/id"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute QuickEditTabSections.ecore#//Section/type"/>
-    </genClasses>
-  </genPackages>
-</genmodel:GenModel>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/plugin.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/plugin.properties
deleted file mode 100644
index 89fd6fd..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/plugin.properties
+++ /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
-###############################################################################
-####################################################
-# Plugin XML information.
-####################################################
-pluginName=JavaServer Faces Tools - Web Page Editor
-providerName=Eclipse.org
-
-editor.binding.context.name=Using Web Page Editor
-editor.binding.context.description=Key binding context when using the web page editor
-# ====================================================================
-
-
-editor.name.0 = Web Page Editor
-category.name.0 = Web Page Editor Layout
-command.name.0 = Vertical Layout
-command.name.1 = Horizontal Layout
-command.name.2 = Graphical Designer
-command.name.3 = Source Code
-
-extension-point.name.0 = Web Page Editor Extension
-extension-point.name.1 = property contributor
-extension-point.name.2 = popupMenu Contributor
-extension-point.name.3 = Content Model Meta Data
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/plugin.xml b/jsf/plugins/org.eclipse.jst.pagedesigner/plugin.xml
deleted file mode 100644
index f8907af..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/plugin.xml
+++ /dev/null
@@ -1,205 +0,0 @@
-<?eclipse version="3.0"?>
-<plugin>
-	<extension-point id="pageDesignerExtension" name="%extension-point.name.0" schema="schema/pageDesignerExtension.exsd" />
-	<extension-point id="propertyContributor" name="%extension-point.name.1" schema="schema/propertyContributor.exsd" />
-	<extension-point id="popupMenuContributor" name="%extension-point.name.2" schema="schema/popupMenuContributor.exsd"/>
-	<extension-point id="cmRegistry" name="%extension-point.name.3" schema="schema/cmRegistry.exsd"/>
-
-	<extension point="org.eclipse.ui.editors">
-		<editor class="org.eclipse.jst.pagedesigner.editors.HTMLEditor"
-			contributorClass="org.eclipse.jst.pagedesigner.editors.actions.PageDesignerActionBarContributor2"
-			default="false"
-			extensions="jsp,jspx,jsf,html,htm,xhtml"
-			icon="icons/PD_Plugin.gif"
-			id="org.eclipse.jst.pagedesigner.PageDesignerEditor"
-			name="%editor.name.0">
-		</editor>
-	</extension>
-
-	<extension point="org.eclipse.ui.actionSetPartAssociations">
-    	<actionSetPartAssociation targetID="org.eclipse.debug.ui.launchActionSet">
-        	<part id="org.eclipse.jst.pagedesigner.PageDesignerEditor"/>
-    	</actionSetPartAssociation>
-	</extension>
-
-	<extension point="org.eclipse.core.runtime.adapters">
-		<factory
-			class="org.eclipse.jst.pagedesigner.utils.UriAdapterFactory"
-			adaptableType="org.eclipse.core.resources.IProject">
-			<adapter type="org.eclipse.wst.sse.core.internal.util.URIResolver" />
-		</factory>
-	</extension>
-
-	 <extension
-       point="org.eclipse.ui.views.properties.tabbed.propertyTabs">
-		<propertyTabs
-			contributorId="org.eclipse.jst.pagedesigner.tabPropertyContributor">
-			<propertyTab label="Quick Edit" category="Quick Edit" id="org.eclipse.jst.pagedesigner.tabQuickEdit" />
-			<propertyTab label="Attributes" category="Attributes" id="org.eclipse.jst.pagedesigner.tabAttributes" />
-		</propertyTabs>
- 	</extension>
- 	
-  	<extension
-        point="org.eclipse.ui.views.properties.tabbed.propertySections">
-		<propertySections 
-			contributorId="org.eclipse.jst.pagedesigner.tabPropertyContributor">
-			<propertySection
-         		afterSection="top"
-         		class="org.eclipse.jst.pagedesigner.properties.AllPropertySection"
-         		id="section.allproperty"
-        	 	tab="org.eclipse.jst.pagedesigner.tabAttributes">
-  			 </propertySection>
-		</propertySections>
-	</extension>
-
-	<extension point="org.eclipse.jst.pagedesigner.pageDesignerExtension">
-		<linkCreator class="org.eclipse.jst.pagedesigner.actions.link.HtmlLinkCreator" linkIdentifier="Html Link"/>
-  <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.AppendChildElementOperation"
-        id="AppendChildElementOperation">
-  </tagTransformOperation>
-    <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.AppendChildTextFromXPathOperation"
-        id="AppendChildTextFromXPathOperation">
-  </tagTransformOperation>
-    <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.AppendChildTextOperation"
-        id="AppendChildTextOperation">
-  </tagTransformOperation>
-    <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.ConvertAttributeToTextOperation"
-        id="ConvertAttributeToTextOperation">
-  </tagTransformOperation>
-    <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.CopyAllAttributesOperation"
-        id="CopyAllAttributesOperation">
-  </tagTransformOperation>
-    <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.CopyAttributeOperation"
-        id="CopyAttributeOperation">
-  </tagTransformOperation>
-    <tagTransformOperation
-          class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.CopyAttributeWithRenameOperation"
-          id="CopyAttributeWithRenameOperation">
-    </tagTransformOperation>
-    <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.CopyChildrenOperation"
-        id="CopyChildrenOperation">
-  </tagTransformOperation>
-    <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.CreateAttributeFromXPathOperation"
-        id="CreateAttributeFromXPathOperation">
-  </tagTransformOperation>
-    <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.CreateAttributeOperation"
-        id="CreateAttributeOperation">
-  </tagTransformOperation>
-      <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.CreateElementOperation"
-        id="CreateElementOperation">
-  </tagTransformOperation>
-      <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.IfNotOperation"
-        id="IfNotOperation">
-  </tagTransformOperation>
-      <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.IfOperation"
-        id="IfOperation">
-  </tagTransformOperation>
-      <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.IterateOverElementsOperation"
-        id="IterateOverElementsOperation">
-  </tagTransformOperation>
-      <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.MakeParentElementCurrentOperation"
-        id="MakeParentElementCurrentOperation">
-  </tagTransformOperation>
-      <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.RemoveAttributeOperation"
-        id="RemoveAttributeOperation">
-  </tagTransformOperation>
-      <tagTransformOperation
-        class="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.RenameAttributeOperation"
-        id="RenameAttributeOperation">
-  </tagTransformOperation>
-	</extension>
-	
-	<extension id="org.eclipse.jst.pagedesigner.commands" point="org.eclipse.ui.commands">
-		<category id="org.eclipse.jst.pagedesigner.pagelayout" name="%category.name.0"/>
-		<command categoryId="org.eclipse.jst.pagedesigner.pagelayout"
-			id="org.eclipse.jst.pagedesigner.vertical"
-			name="%command.name.0"/>
-		<command categoryId="org.eclipse.jst.pagedesigner.pagelayout" 
-			id="org.eclipse.jst.pagedesigner.horizotal"
-			name="%command.name.1"/>
-		<command categoryId="org.eclipse.jst.pagedesigner.pagelayout"
-			id="org.eclipse.jst.pagedesigner.design"
-			name="%command.name.2"/>
-		<command categoryId="org.eclipse.jst.pagedesigner.pagelayout"
-			id="org.eclipse.jst.pagedesigner.source"
-			name="%command.name.3"/>
-	</extension>
-	
-	<extension point="org.eclipse.ui.bindings">
-		<key commandId="org.eclipse.jst.pagedesigner.vertical"
-			schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-			contextId="org.eclipse.jst.pagedesigner.editorContext"
-			sequence="M1+M2+F9"/>
-		<key commandId="org.eclipse.jst.pagedesigner.horizotal"
-			schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-			contextId="org.eclipse.jst.pagedesigner.editorContext"
-			sequence="M1+M2+F10"/>
-		<key commandId="org.eclipse.jst.pagedesigner.design"
-			schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-			contextId="org.eclipse.jst.pagedesigner.editorContext"
-			sequence="M1+M2+F11"/>
-		<key commandId="org.eclipse.jst.pagedesigner.source"
-			schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
-			contextId="org.eclipse.jst.pagedesigner.editorContext"
-			sequence="M1+M2+F12"/>
-	</extension>
-	
-	<extension point="org.eclipse.wst.sse.ui.editorConfiguration">
-		<contentOutlineConfiguration
-			class="org.eclipse.jst.pagedesigner.editors.OutlineConfiguration"
-			target="org.eclipse.jst.pagedesigner.editors.DesignerStructuredTextEditorJSP"/>
-	</extension>
-	
-	<extension point="org.eclipse.emf.ecore.generated_package">
-    <package
-          class="org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage"
-          genModel="model/DTInfo.genmodel"
-          uri="http://org.eclipse.jsf.pagedesigner/dtinfo.ecore">
-    </package>
-    <package
-          class="org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage"
-          genModel="model/QuickEditTabSections.genmodel"
-          uri="http://org.eclipse.jsf.pagedesigner/QuickEditTabSections.ecore">
-    </package>
-   </extension>
-
- <extension
-       point="org.eclipse.ui.contexts">
-    <context
-          description="%editor.binding.context.description"
-          id="org.eclipse.jst.pagedesigner.editorContext"
-          name="%editor.binding.context.name"
-          parentId="org.eclipse.ui.textEditorScope">
-    </context>
- </extension>
- <extension
-       point="org.eclipse.jst.jsf.core.MetaDataEnabledFeatures">
-    <MetaDataEnabledFeature
-          class="org.eclipse.jst.pagedesigner.editors.properties.internal.PropertyDescriptor"
-          typeid="org.eclipse.jst.jsf.core.attributevalues.BaseType">
-    </MetaDataEnabledFeature>
- </extension>
- <extension
-       point="org.eclipse.ui.views.properties.tabbed.propertyContributor">
-    <propertyContributor
-          contributorId="org.eclipse.jst.pagedesigner.tabPropertyContributor"
-          tabDescriptorProvider="org.eclipse.jst.pagedesigner.properties.internal.WPETabDescriptorProvider">
-       <propertyCategory></propertyCategory>
-    </propertyContributor>
- </extension>
-</plugin>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/schema/cmRegistry.exsd b/jsf/plugins/org.eclipse.jst.pagedesigner/schema/cmRegistry.exsd
deleted file mode 100644
index b6662dc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/schema/cmRegistry.exsd
+++ /dev/null
@@ -1,98 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.pagedesigner">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.pagedesigner" id="cmRegistry" name="Content Model Meta Data"/>
-      </appInfo>
-      <documentation>
-         &lt;p&gt;&lt;b&gt;This extension point is provisional and subject to change&lt;/b&gt;&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="registry" 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="registry">
-      <annotation>
-         <documentation>
-            User must provide either &quot;configFile&quot; attribute or &quot;class&quot; attribute.
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="configFile" type="string">
-            <annotation>
-               <documentation>
-                  A path relative to the root of the declaring plugin. Point to a config file that contains the information for the specified tag lib of the uri.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="resource"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string">
-            <annotation>
-               <documentation>
-                  A class that implements ICMRegistry. The implemented ICMRegistry must return the same uri as the uri attribute in getSupportedURI() method.
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="uri" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         2.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright 2006 Sybase and others
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/schema/pageDesignerExtension.exsd b/jsf/plugins/org.eclipse.jst.pagedesigner/schema/pageDesignerExtension.exsd
deleted file mode 100644
index 25ef001..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/schema/pageDesignerExtension.exsd
+++ /dev/null
@@ -1,209 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.pagedesigner">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.pagedesigner" id="pageDesignerExtension" name="Web Page Editor Extension"/>
-      </appInfo>
-      <documentation>
-         &lt;p&gt;&lt;b&gt;This extension point is provisional and subject to change&lt;/b&gt;&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="localDropHandler" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="attributeCellEditorFactory" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="tagConverterFactory" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="elementEditFactory" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="linkCreator" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="tagAttributeCellEditorFactory" minOccurs="0" maxOccurs="unbounded"/>
-            <element ref="tagTransformOperation" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="localDropHandler">
-      <complexType>
-         <attribute name="class" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="attributeCellEditorFactory">
-      <annotation>
-         <documentation>
-            deprecated - use tagAttributeCellEditorFactory
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="class" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" deprecated="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="tagAttributeCellEditorFactory">
-      <annotation>
-         <documentation>
-            provides ability for 3rd parties to supply their own cell and dialog field editors for MD enabled tag library attributes in the WPE tabbed property sheets
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="class" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn=":org.eclipse.jst.pagedesigner.meta.ITagAttributeCellEditorFactory"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="tagConverterFactory">
-      <complexType>
-         <attribute name="class" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="elementEditFactory">
-      <complexType>
-         <attribute name="class" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="linkCreator">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.pagedesigner.actions.link.ILinkCreator"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="linkIdentifier" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="tagTransformOperation">
-      <annotation>
-         <documentation>
-            define a tag transformation operation class
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The transform operation id.    Referencers will use plugin-qualified references.   i.e if the plugin extending this was &lt;code&gt;org.foo.bar&lt;/code&gt;,  then the meta data instance that referenced this operation would specify:
-	&lt;pre&gt;
-		&lt;operation id=&quot;org.foo.bar.MyTransformId&quot;/&gt;
-	&lt;/pre&gt;
-	
-The exception to this rule is that if the reference is not plugin-qualified, then the reference is assumed to be a &lt;i&gt;core&lt;/i&gt; transformation and uses the &lt;code&gt;org.eclipse.jst.pagedesigner&lt;/code&gt; prefix.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  class extending the &lt;code&gt;org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation&lt;/code&gt;
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation:"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         2.0
-      </documentation>
-   </annotation>
-
-
-
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright 2006 Sybase and others
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/schema/popupMenuContributor.exsd b/jsf/plugins/org.eclipse.jst.pagedesigner/schema/popupMenuContributor.exsd
deleted file mode 100644
index 27956f4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/schema/popupMenuContributor.exsd
+++ /dev/null
@@ -1,83 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.pagedesigner">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.jst.pagedesigner" id="popupMenuContributor" name="popupMenu Contributor"/>
-      </appInfo>
-      <documentation>
-         &lt;p&gt;&lt;b&gt;This extension point is provisional and subject to change&lt;/b&gt;&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <complexType>
-         <sequence>
-            <element ref="menuItemContributor" minOccurs="1" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="menuItemContributor">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="URI" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         2.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         Copyright 2006 Sybase and others
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/schema/propertyContributor.exsd b/jsf/plugins/org.eclipse.jst.pagedesigner/schema/propertyContributor.exsd
deleted file mode 100644
index 934161d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/schema/propertyContributor.exsd
+++ /dev/null
@@ -1,89 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.jst.pagedesigner" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.jst.pagedesigner" id="propertyContributor" name="property contributor"/>
-      </appinfo>
-      <documentation>
-         &lt;p&gt;&lt;b&gt;This extension point is unused and deprecated, and will be removed&lt;/b&gt;&lt;/p&gt;
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <annotation>
-         <appinfo>
-            <meta.element deprecated="true"/>
-         </appinfo>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="propertyContributor" minOccurs="0" maxOccurs="unbounded"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="propertyContributor">
-      <annotation>
-         <appinfo>
-            <meta.element deprecated="true"/>
-         </appinfo>
-      </annotation>
-      <complexType>
-         <attribute name="sectionDescriptorProvider" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="since"/>
-      </appinfo>
-      <documentation>
-         2.0
-      </documentation>
-   </annotation>
-
-
-
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright 2006 Sybase and others
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/schema/tagProperty.xsd b/jsf/plugins/org.eclipse.jst.pagedesigner/schema/tagProperty.xsd
deleted file mode 100644
index f970c08..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/schema/tagProperty.xsd
+++ /dev/null
@@ -1,154 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<schema xmlns="http://www.w3.org/2001/XMLSchema">
-	<element name="taglib">
-		<complexType>
-			<sequence>
-				<element ref="tag" maxOccurs="unbounded"></element>
-				<element ref="definition" minOccurs="0" maxOccurs="1"></element>
-			</sequence>
-			<attribute ref="uri" />
-		</complexType>
-	</element>
-
-	<element name="tag">
-		<complexType>
-			<sequence>
-				<element ref="category" minOccurs="0"
-					maxOccurs="unbounded">
-				</element>
-				<element ref="referedcategory" minOccurs="0"
-					maxOccurs="unbounded">
-				</element>
-			</sequence>
-			<attribute ref="name"></attribute>
-		</complexType>
-	</element>
-
-	<element name="category">
-		<complexType>
-			<sequence>
-				<element ref="attribute" minOccurs="0"
-					maxOccurs="unbounded">
-				</element>
-				<element ref="referedattribute" minOccurs="0"
-					maxOccurs="unbounded">
-				</element>
-			</sequence>
-			<attribute ref="name"></attribute>
-			<attribute ref="displaylabel"></attribute>
-		</complexType>
-	</element>
-
-	<element name="referedcategory">
-		<complexType>
-			<sequence>
-				<element ref="includeattrs" minOccurs="0"
-					maxOccurs="1">
-				</element>
-				<element ref="excludeattrs" minOccurs="0"
-					maxOccurs="1">
-				</element>
-			</sequence>
-			<attribute ref="ref"></attribute>
-			<attribute ref="displaylabel"></attribute>
-		</complexType>
-	</element>
-
-	<element name="definition">
-		<complexType>
-			<sequence>
-				<element ref="categories" minOccurs="0" maxOccurs="1"></element>
-				<element ref="attributes" minOccurs="0" maxOccurs="1"></element>
-			</sequence>
-		</complexType>
-	</element>
-
-	<element name="attribute">
-		<complexType>
-			<sequence>
-				<element ref="option" minOccurs="0"
-					maxOccurs="unbounded">
-				</element>
-			</sequence>
-			<attribute ref="name"></attribute>
-			<attribute ref="displaylabel"></attribute>
-			<attribute ref="required"></attribute>
-			<attribute ref="type"></attribute>
-			<attribute ref="typeparam"></attribute>
-		</complexType>
-	</element>
-
-	<element name="referedattribute">
-		<complexType>
-			<attribute ref="ref"></attribute>
-			<attribute ref="overridename"></attribute>
-			<attribute ref="displaylabel"></attribute>
-		</complexType>
-	</element>
-
-	<element name="includeattrs">
-		<complexType>
-			<sequence>
-				<element ref="attribute" minOccurs="0"
-					maxOccurs="unbounded">
-				</element>
-				<element ref="referedattribute" minOccurs="0"
-					maxOccurs="unbounded">
-				</element>
-			</sequence>
-		</complexType>
-	</element>
-
-	<element name="excludeattrs">
-		<complexType>
-			<attribute ref="refs"></attribute>
-		</complexType>
-	</element>
-
-	<element name="categories">
-		<complexType>
-			<sequence>
-				<element ref="category"></element>
-			</sequence>
-		</complexType>
-	</element>
-
-	<element name="attributes">
-		<complexType>
-			<sequence>
-				<element ref="attribute"></element>
-			</sequence>
-		</complexType>
-	</element>
-
-	<element name="option">
-		<complexType>
-			<attribute ref="key"></attribute>
-			<attribute ref="value"></attribute>
-			<attribute ref="default"></attribute>
-		</complexType>
-	</element>
-
-	<attribute name="name" type="string"></attribute>
-
-	<attribute name="displaylabel" type="string"></attribute>
-
-	<attribute name="ref" type="string"></attribute>
-
-	<attribute name="refs" type="string"></attribute>
-
-	<attribute name="uri" type="string"></attribute>
-
-	<attribute name="type" type="string"></attribute>
-
-	<attribute name="typeparam" type="string"></attribute>
-
-	<attribute name="key" type="string"></attribute>
-
-	<attribute name="value" type="string"></attribute>
-
-	<attribute name="overridename" type="string"></attribute>
-	<attribute name="default" type="string" fixed="default"></attribute>
-	<attribute name="required" type="string" fixed="required"></attribute>
-
-</schema>
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/IHTMLConstants.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/IHTMLConstants.java
deleted file mode 100644
index 30c23e4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/IHTMLConstants.java
+++ /dev/null
@@ -1,1147 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.wst.xml.core.internal.provisional.contentmodel.CMDocType;
-
-/**
- * @author mengbo
- */
-public class IHTMLConstants {
-	/**
-	 * anchor tag name
-	 */
-	public static final String TAG_A = "a";
-
-	/**
-	 * abbreviated form (e.g.,WWW, HTTP, etc.) tag name
-	 */
-	public static final String TAG_ABBR = "abbr"; // 
-
-	/**
-	 * acronym tag name
-	 */
-	public static final String TAG_ACRONYM = "acronym";
-
-	/**
-	 * address tag name
-	 */
-	public static final String TAG_ADDRESS = "address";
-
-	/**
-	 * Java applet tag name
-	 */
-	public static final String TAG_APPLET = "applet";
-
-	/**
-	 * client-side image map tag name
-	 */
-	public static final String TAG_AREA = "area";
-
-	// area
-
-	/**
-	 * bold text style tag name
-	 */
-	public static final String TAG_B = "b";
-
-	/**
-	 * document base URI tag name
-	 */
-	public static final String TAG_BASE = "base";
-
-	/**
-	 * base font size tag name
-	 */
-	public static final String TAG_BASEFONT = "basefont";
-
-	/**
-	 * I18N BiDi over-ride tag name
-	 */
-	public static final String TAG_BDO = "bdo"; 
-
-	/**
-	 * large text style tag name
-	 */
-	public static final String TAG_BIG = "big";
-
-	/**
-	 * blockquote tag name
-	 */
-	public static final String TAG_BLOCKQUOTE = "blockquote";
-
-	// quotation
-
-	/**
-	 * document body tag name
-	 */
-	public static final String TAG_BODY = "body";
-
-	/**
-	 * forced line break tag name
-	 */
-	public static final String TAG_BR = "br";
-
-	/**
-	 * push button tag name
-	 */
-	public static final String TAG_BUTTON = "button";
-
-	/**
-	 * table caption tag name
-	 */
-	public static final String TAG_CAPTION = "caption";
-
-	/**
-	 * shorthand for DIV align=center tag name
-	 */
-	public static final String TAG_CENTER = "center";
-
-	/**
-	 * citation tag name
-	 */
-	public static final String TAG_CITE = "cite";
-
-	/**
-	 * computer code fragment tag name
-	 */
-	public static final String TAG_CODE = "code";
-
-	/**
-	 * table column tag name
-	 */
-	public static final String TAG_COL = "col";
-
-	/**
-	 * table column group tag name
-	 */
-	public static final String TAG_COLGROUP = "colgroup";
-
-	/**
-	 * definition description tag name
-	 */
-	public static final String TAG_DD = "dd";
-
-	/**
-	 * deleted text tag name
-	 */
-	public static final String TAG_DEL = "del";
-
-	/**
-	 * instance definition tag name
-	 */
-	public static final String TAG_DFN = "dfn"; 
-
-	/**
-	 * directory list tag name
-	 */
-	public static final String TAG_DIR = "dir";
-
-	/**
-	 * generic language/style container (div) tag name
-	 */
-	public static final String TAG_DIV = "div";
-
-	/**
-	 * definition list tag name
-	 */
-	public static final String TAG_DL = "dl";
-
-	/**
-	 * definition term tag name
-	 */
-	public static final String TAG_DT = "dt";
-
-	/**
-	 * emphasis tag name
-	 */
-	public static final String TAG_EM = "em";
-
-	/**
-	 * fieldset tag name
-	 */
-	public static final String TAG_FIELDSET = "fieldset";
-
-	/**
-	 * local change to font (font) tag name
-	 */
-	public static final String TAG_FONT = "font"; 
-
-	/**
-	 * form tag name
-	 */
-	public static final String TAG_FORM = "form";
-
-	/**
-	 * frame tag name
-	 */
-	public static final String TAG_FRAME = "frame";
-
-	/**
-	 * frameset tag name
-	 */
-	public static final String TAG_FRAMESET = "frameset"; 
-	
-	/**
-	 * h1 tag name
-	 */
-	public static final String TAG_H1 = "h1"; 
-
-	/**
-	 * h2 tag name
-	 */
-	public static final String TAG_H2 = "h2"; 
-
-	/**
-	 * h3 tag name
-	 */
-	public static final String TAG_H3 = "h3"; 
-
-	/**
-	 * h4 tag name
-	 */
-	public static final String TAG_H4 = "h4"; 
-	
-	/**
-	 * h5 tag name
-	 */
-	public static final String TAG_H5 = "h5";
-
-	/**
-	 * h6 tag name
-	 */
-	public static final String TAG_H6 = "h6";
-
-	/**
-	 * head tag name
-	 */
-	public static final String TAG_HEAD = "head";
-
-	/**
-	 * horizontal rule tag name
-	 */
-	public static final String TAG_HR = "hr"; 
-
-	/**
-	 * document root element (html) tag name
-	 */
-	public static final String TAG_HTML = "html";
-
-	/**
-	 * italic text style tag name
-	 */
-	public static final String TAG_I = "i";
-
-	/**
-	 * inline subwindow (iframe) tag name
-	 */
-	public static final String TAG_IFRAME = "iframe";
-
-	/**
-	 * Embedded image tag name
-	 */
-	public static final String TAG_IMG = "img"; 
-
-	/**
-	 * input tag name
-	 */
-	public static final String TAG_INPUT = "input";
-
-	/**
-	 * inserted text tag name
-	 */
-	public static final String TAG_INS = "ins";
-
-	/**
-	 * isindex tag name
-	 */
-	public static final String TAG_ISINDEX = "isindex";
-
-	/**
-	 * text to be entered by the user tag name
-	 */
-	public static final String TAG_KBD = "kbd";
-
-	/**
-	 * form field label text tag name
-	 */
-	public static final String TAG_LABEL = "label"; 
-
-	/**
-	 * fieldset legend tag name
-	 */
-	public static final String TAG_LEGEND = "legend";
-
-	/**
-	 * list item tag name
-	 */
-	public static final String TAG_LI = "li"; 
-
-	/**
-	 * media-independent link tag name
-	 */
-	public static final String TAG_LINK = "link";
-
-	/**
-	 * client-side image map tag name
-	 */
-	public static final String TAG_MAP = "map"; 
-
-	/**
-	 * menu list tag name
-	 */
-	public static final String TAG_MENU = "menu";
-
-	/**
-	 * generic metainformation tag name
-	 */
-	public static final String TAG_META = "meta";
-
-	/**
-	 * noembed tag name
-	 */
-	public static final String TAG_NOEMBED = "noembed";
-
-	/**
-	 * container for non-frame-based
-     * rendering (noframes) tag name
-	 */
-	public static final String TAG_NOFRAMES = "noframes";
-
-	// 
-
-	/**
-	 * container for non-script-based
-     * rendering (noscript) tag name
-	 */
-	public static final String TAG_NOSCRIPT = "noscript";
-
-	// 
-
-	/**
-	 * generic embedded (object) tag name
-	 */
-	public static final String TAG_OBJECT = "object";
-
-	/**
-	 * ordered list tag name
-	 */
-	public static final String TAG_OL = "ol";
-
-	/**
-	 * option group tag name
-	 */
-	public static final String TAG_OPTGROUP = "optgroup"; 
-
-	/**
-	 * selectable choice tag name
-	 */
-	public static final String TAG_OPTION = "option";
-
-	/**
-	 * paragraph tag name
-	 */
-	public static final String TAG_P = "p";
-
-	/**
-	 * named property value tag name
-	 */
-	public static final String TAG_PARAM = "param";
-
-	/**
-	 * preformatted text tag name
-	 */
-	public static final String TAG_PRE = "pre";
-
-	/**
-	 * short inline quotation tag name
-	 */
-	public static final String TAG_Q = "q";
-
-	/**
-	 * strike-through text style tag name
-	 */
-	public static final String TAG_S = "s"; 
-
-	/**
-	 * sample program output tag name
-	 */
-	public static final String TAG_SAMP = "samp";
-
-	// scripts, etc.
-
-	/**
-	 * script statements tag name
-	 */
-	public static final String TAG_SCRIPT = "script"; 
-
-	/**
-	 * option selector tag name
-	 */
-	public static final String TAG_SELECT = "select"; 
-
-	/**
-	 * small text style tag name
-	 */
-	public static final String TAG_SMALL = "small"; 
-
-	/**
-	 * generic language/style tag name
-	 */
-	public static final String TAG_SPAN = "span";
-
-	// container
-
-	/**
-	 * strike-through text tag name
-	 */
-	public static final String TAG_STRIKE = "strike";
-
-	/**
-	 * strong emphasis tag name
-	 */
-	public static final String TAG_STRONG = "strong";
-
-	/**
-	 *  style info tag name
-	 */
-	public static final String TAG_STYLE = "style";
-
-	/**
-	 * subscript tag name
-	 */
-	public static final String TAG_SUB = "sub";
-
-	/**
-	 * superscript tag name
-	 */
-	public static final String TAG_SUP = "sup";
-
-	/**
-	 * table tag name
-	 */
-	public static final String TAG_TABLE = "table";
-
-	/**
-	 *  table body tag name
-	 */
-	public static final String TAG_TBODY = "tbody";
-
-	/**
-	 * table data cell tag name
-	 */
-	public static final String TAG_TD = "td";
-
-	/**
-	 * multi-line text
-	 */
-	public static final String TAG_TEXTAREA = "textarea";
-
-	// field
-
-	/**
-	 * table footer tag name
-	 */
-	public static final String TAG_TFOOT = "tfoot";
-
-	/**
-	 * table header cell tag name
-	 */
-	public static final String TAG_TH = "th";
-
-	/**
-	 * table header tag name
-	 */
-	public static final String TAG_THEAD = "thead";
-
-	/**
-	 * document title tag name
-	 */
-	public static final String TAG_TITLE = "title";
-
-	/**
-	 * table row tag name
-	 */
-	public static final String TAG_TR = "tr";
-
-	/**
-	 * teletype or monospaced text tag name
-	 */
-	public static final String TAG_TT = "tt"; 
-
-	// style
-
-	/**
-	 * underlined text style tag name
-	 */
-	public static final String TAG_U = "u"; 
-
-	/**
-	 * unordered list tag name
-	 */
-	public static final String TAG_UL = "ul";
-
-	/**
-	 * instance of a variable tag name
-	 */
-	public static final String TAG_VAR = "var";
-
-	/**
-	 * Tag identifier for an HTML form tag
-	 */
-	public static final TagIdentifier TAG_IDENTIFIER_HTML_FORM =
-	    TagIdentifierFactory.createJSPTagWrapper(CMDocType.HTML_DOC_TYPE, TAG_FORM);
-	
-    // program argument
-
-	/**
-	 * abbr attribute
-	 */
-	public static final String ATTR_ABBR = "abbr";
-
-	/**
-	 * accept-charset attribute
-	 */
-	public static final String ATTR_ACCEPTCHARSET = "accept-charset";
-
-	/**
-	 * accept attribute
-	 */
-	public static final String ATTR_ACCEPT = "accept";
-
-	/**
-	 * access key attribute
-	 */
-	public static final String ATTR_ACCESSKEY = "accesskey";
-
-	/**
-	 * action attribute
-	 */
-	public static final String ATTR_ACTION = "action";
-
-	/**
-	 * align attribute
-	 */
-	public static final String ATTR_ALIGN = "align";
-
-	/**
-	 * alink attribute
-	 */
-	public static final String ATTR_ALINK = "alink";
-
-	/**
-	 * alt attribute
-	 */
-	public static final String ATTR_ALT = "alt";
-
-	/**
-	 * archive attribute
-	 */
-	public static final String ATTR_ARCHIVE = "archive";
-
-	/**
-	 * axis attribute
-	 */
-	public static final String ATTR_AXIS = "axis";
-
-	/**
-	 * background attribute
-	 */
-	public static final String ATTR_BACKGROUND = "background";
-
-	/**
-	 * bgcolor attribute
-	 */
-	public static final String ATTR_BGCOLOR = "bgcolor";
-
-	/**
-	 * border attribute
-	 */
-	public static final String ATTR_BORDER = "border";
-
-	/**
-	 * cellpadding attribute
-	 */
-	public static final String ATTR_CELLPADDING = "cellpadding";
-
-	/**
-	 * cellspacing attribute
-	 */
-	public static final String ATTR_CELLSPACING = "cellspacing";
-
-	/**
-	 * char attribute
-	 */
-	public static final String ATTR_CHAR = "char";
-
-	/**
-	 * charoff attribute
-	 */
-	public static final String ATTR_CHAROFF = "charoff";
-
-	/**
-	 * charset attribute
-	 */
-	public static final String ATTR_CHARSET = "charset";
-
-	/**
-	 * checked attribute
-	 */
-	public static final String ATTR_CHECKED = "checked";
-
-	/**
-	 * cite attribute
-	 */
-	public static final String ATTR_CITE = "cite";
-
-	/**
-	 * class attribute
-	 */
-	public static final String ATTR_CLASS = "class";
-
-	/**
-	 * classid attribute
-	 */
-	public static final String ATTR_CLASSID = "classid";
-
-	/**
-	 * clear attribute
-	 */
-	public static final String ATTR_CLEAR = "clear";
-
-	/**
-	 * code attribute
-	 */
-	public static final String ATTR_CODE = "code";
-
-	/**
-	 * codebase attribute
-	 */
-	public static final String ATTR_CODEBASE = "codebase";
-
-	/**
-	 * code type attribute
-	 */
-	public static final String ATTR_CODETYPE = "codetype";
-
-	/**
-	 * color attribute
-	 */
-	public static final String ATTR_COLOR = "color";
-
-	/**
-	 * cols attribute
-	 */
-	public static final String ATTR_COLS = "cols";
-
-	/**
-	 * colspan attribute
-	 */
-	public static final String ATTR_COLSPAN = "colspan";
-
-	/**
-	 * compact attribute
-	 */
-	public static final String ATTR_COMPACT = "compact";
-
-	/**
-	 * content attribute
-	 */
-	public static final String ATTR_CONTENT = "content";
-
-	/**
-	 * coords attribute
-	 */
-	public static final String ATTR_COORDS = "coords";
-
-	/**
-	 * data attribute
-	 */
-	public static final String ATTR_DATA = "data";
-
-	/**
-	 * datetime attribute
-	 */
-	public static final String ATTR_DATETIME = "datetime";
-
-	/**
-	 * declare attribute
-	 */
-	public static final String ATTR_DECLARE = "declare";
-
-	/**
-	 * defer attribute
-	 */
-	public static final String ATTR_DEFER = "defer";
-
-	/**
-	 * dir attribute
-	 */
-	public static final String ATTR_DIR = "dir";
-
-	/**
-	 * disabled attribute
-	 */
-	public static final String ATTR_DISABLED = "disabled";
-
-	/**
-	 * enctype attribute
-	 */
-	public static final String ATTR_ENCTYPE = "enctype";
-
-	/**
-	 * face attribute
-	 */
-	public static final String ATTR_FACE = "face";
-
-	/**
-	 * for  attribute
-	 */
-	public static final String ATTR_FOR = "for";
-
-	/**
-	 * frame attribute
-	 */
-	public static final String ATTR_FRAME = "frame";
-
-	/**
-	 * frameborder attribute
-	 */
-	public static final String ATTR_FRAMEBORDER = "frameborder";
-
-	/**
-	 * headers attribute
-	 */
-	public static final String ATTR_HEADERS = "headers";
-
-	/**
-	 * height attribute
-	 */
-	public static final String ATTR_HEIGHT = "height";
-
-	/**
-	 * href  attribute
-	 */
-	public static final String ATTR_HREF = "href";
-
-	/**
-	 * hreflang attribute
-	 */
-	public static final String ATTR_HREFLANG = "hreflang";
-
-	/**
-	 * hspace attribute
-	 */
-	public static final String ATTR_HSPACE = "hspace";
-
-	/**
-	 * http-equiv attribute
-	 */
-	public static final String ATTR_HTTPEQUIV = "http-equiv";
-
-	/**
-	 * id attribute
-	 */
-	public static final String ATTR_ID = "id";
-
-	/**
-	 * ismap attribute
-	 */
-	public static final String ATTR_ISMAP = "ismap";
-
-	/**
-	 * label attribute
-	 */
-	public static final String ATTR_LABEL = "label";
-
-	/**
-	 * lang attribute
-	 */
-	public static final String ATTR_LANG = "lang";
-
-	/**
-	 * language attribute
-	 */
-	public static final String ATTR_LANGUAGE = "language";
-
-	/**
-	 * link attribute
-	 */
-	public static final String ATTR_LINK = "link";
-
-	/**
-	 * longdesc attribute
-	 */
-	public static final String ATTR_LONGDESC = "longdesc";
-
-	/**
-	 *  marginheight attribute
-	 */
-	public static final String ATTR_MARGINHEIGHT = "marginheight";
-
-	/**
-	 * margin width attribute
-	 */
-	public static final String ATTR_MARGINWIDTH = "marginwidth";
-
-	/**
-	 * maxlength attribute
-	 */
-	public static final String ATTR_MAXLENGTH = "maxlength";
-
-	/**
-	 * media attribute
-	 */
-	public static final String ATTR_MEDIA = "media";
-
-	/**
-	 * method attribute
-	 */
-	public static final String ATTR_METHOD = "method";
-
-	/**
-	 * multiple attribute
-	 */
-	public static final String ATTR_MULTIPLE = "multiple";
-
-	/**
-	 * name attribute
-	 */
-	public static final String ATTR_NAME = "name";
-
-	/**
-	 * nohref attribute
-	 */
-	public static final String ATTR_NOHREF = "nohref";
-
-	/**
-	 * noresize attribute
-	 */
-	public static final String ATTR_NORESIZE = "noresize";
-
-	/**
-	 * noshade attribute
-	 */
-	public static final String ATTR_NOSHADE = "noshade";
-
-	/**
-	 * nowrap attribute
-	 */
-	public static final String ATTR_NOWRAP = "nowrap";
-
-	/**
-	 * object attribute
-	 */
-	public static final String ATTR_OBJECT = "object";
-
-	/**
-	 * onblur attribute
-	 */
-	public static final String ATTR_ONBLUR = "onblur";
-
-	/**
-	 * onchange attribute
-	 */
-	public static final String ATTR_ONCHANGE = "onchange";
-
-	/**
-	 * onclick attribute
-	 */
-	public static final String ATTR_ONCLICK = "onclick";
-
-	/**
-	 * ondblclick attribute
-	 */
-	public static final String ATTR_ONDBLCLICK = "ondblclick";
-
-	/**
-	 * onfocus attribute
-	 */
-	public static final String ATTR_ONFOCUS = "onfocus";
-
-	/**
-	 * onkeydown attribute
-	 */
-	public static final String ATTR_ONKEYDOWN = "onkeydown";
-
-	/**
-	 * onkeypress attribute
-	 */
-	public static final String ATTR_ONKEYPRESS = "onkeypress";
-
-	/**
-	 * onkeyup attribute
-	 */
-	public static final String ATTR_ONKEYUP = "onkeyup";
-
-	/**
-	 * onload attribute
-	 */
-	public static final String ATTR_ONLOAD = "onload";
-
-	/**
-	 * onmousedown attribute
-	 */
-	public static final String ATTR_ONMOUSEDOWN = "onmousedown";
-
-	/**
-	 * onmousemove attribute
-	 */
-	public static final String ATTR_ONMOUSEMOVE = "onmousemove";
-
-	/**
-	 * onmouseout attribute
-	 */
-	public static final String ATTR_ONMOUSEOUT = "onmouseout";
-
-	/**
-	 * onmouseover attribute
-	 */
-	public static final String ATTR_ONMOUSEOVER = "onmouseover";
-
-	/**
-	 * onmouseup attribute
-	 */
-	public static final String ATTR_ONMOUSEUP = "onmouseup";
-
-	/**
-	 * onreset attribute
-	 */
-	public static final String ATTR_ONRESET = "onreset";
-
-	/**
-	 * onselect attribute
-	 */
-	public static final String ATTR_ONSELECT = "onselect";
-
-	/**
-	 * onsubmit attribute
-	 */
-	public static final String ATTR_ONSUBMIT = "onsubmit";
-
-	/**
-	 * onunload attribute
-	 */
-	public static final String ATTR_ONUNLOAD = "onunload";
-
-	/**
-	 * profile attribute
-	 */
-	public static final String ATTR_PROFILE = "profile";
-
-	/**
-	 * prompt attribute
-	 */
-	public static final String ATTR_PROMPT = "prompt";
-
-	/**
-	 * readonly attribute
-	 */
-	public static final String ATTR_READONLY = "readonly";
-
-	/**
-	 * rel attribute
-	 */
-	public static final String ATTR_REL = "rel";
-
-	/**
-	 * rev attribute
-	 */
-	public static final String ATTR_REV = "rev";
-
-	/**
-	 * rows attribute
-	 */
-	public static final String ATTR_ROWS = "rows";
-
-	/**
-	 * rowspan attribute
-	 */
-	public static final String ATTR_ROWSPAN = "rowspan";
-
-	/**
-	 * rules attribute 
-	 */
-	public static final String ATTR_RULES = "rules";
-
-	/**
-	 * scheme attribute
-	 */
-	public static final String ATTR_SCHEME = "scheme";
-
-	/**
-	 * scope attribute
-	 */
-	public static final String ATTR_SCOPE = "scope";
-
-	/**
-	 * scrolling attribute
-	 */
-	public static final String ATTR_SCROLLING = "scrolling";
-
-	/**
-	 * selected attribute
-	 */
-	public static final String ATTR_SELECTED = "selected";
-
-	/**
-	 * shape attribute
-	 */
-	public static final String ATTR_SHAPE = "shape";
-
-	/**
-	 * size attribute
-	 */
-	public static final String ATTR_SIZE = "size";
-
-	/**
-	 * span attribute
-	 */
-	public static final String ATTR_SPAN = "span";
-
-	/**
-	 * src attribute
-	 */
-	public static final String ATTR_SRC = "src";
-
-	/**
-	 * standby attribute
-	 */
-	public static final String ATTR_STANDBY = "standby";
-
-	/**
-	 * start attribute
-	 */
-	public static final String ATTR_START = "start";
-
-	/**
-	 * style attribute
-	 */
-	public static final String ATTR_STYLE = "style";
-
-	/**
-	 * summary attribute
-	 */
-	public static final String ATTR_SUMMARY = "summary";
-
-	/**
-	 * tabindex attribute
-	 */
-	public static final String ATTR_TABINDEX = "tabindex";
-
-	/**
-	 * target attribute
-	 */
-	public static final String ATTR_TARGET = "target";
-
-	/**
-	 * text attribute
-	 */
-	public static final String ATTR_TEXT = "text";
-
-	/**
-	 * title attribute
-	 */
-	public static final String ATTR_TITLE = "title";
-
-	/**
-	 * type attribute
-	 */
-	public static final String ATTR_TYPE = "type";
-
-	/**
-	 * usemap attribute
-	 */
-	public static final String ATTR_USEMAP = "usemap";
-
-	/**
-	 * valign attribute
-	 */
-	public static final String ATTR_VALIGN = "valign";
-
-	/**
-	 * value attribute
-	 */
-	public static final String ATTR_VALUE = "value";
-
-	/**
-	 * valuetype attribute
-	 */
-	public static final String ATTR_VALUETYPE = "valuetype";
-
-	/**
-	 * version attribute
-	 */
-	public static final String ATTR_VERSION = "version";
-
-	/**
-	 * vlink attribute
-	 */
-	public static final String ATTR_VLINK = "vlink";
-
-	/**
-	 * vspace attribute
-	 */
-	public static final String ATTR_VSPACE = "vspace";
-
-	/**
-	 * width attribute
-	 */
-	public static final String ATTR_WIDTH = "width";
-
-	/**
-	 * submit type
-	 */
-	public static final String TYPE_SUBMIT = "submit";
-
-	/**
-	 * checkbox type
-	 */
-	public static final String TYPE_CHECKBOX = "checkbox";
-
-	/**
-	 * radio type
-	 */
-	public static final String TYPE_RADIO = "radio";
-
-	/**
-	 * image type
-	 */
-	public static final String TYPE_IMAGE = "image";
-
-	/**
-	 * password type
-	 */
-	public static final String TYPE_PASSWORD = "password";
-
-	/**
-	 * text type
-	 */
-	public static final String TYPE_TEXT = "text";
-
-	/**
-	 * hidden type
-	 */
-	public static final String TYPE_HIDDEN = "hidden";
-
-	/**
-	 * submit query label
-	 */
-	public static final String SUBMIT_LABEL = "Submit Query";
-
-	/**
-	 * reset label
-	 */
-	public static final String RESET_LABEL = "Reset";
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/IJMTConstants.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/IJMTConstants.java
deleted file mode 100644
index ef1d758..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/IJMTConstants.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;
-
-/**
- * JMT constants that would be used through the JMT core plugin.
- * 
- * @author mengbo
- */
-public interface IJMTConstants {
-	/**
-	 * bundle file name
-	 */
-	public static final String PAGEDESIGNER_RESOURCE_BUNDLE_FILE = "org.eclipse.jst.pagedesigner.editors.pagedesigner.JSPEditorMessages"; //$NON-NLS-1$
-
-	// Properties contains general properties and defaults to preferences.
-	/**
-	 * root resource bundle name
-	 */
-	public static final String ROOT_RESOURCEBUNDLE = "org.eclipse.jst.pagedesigner.JMTResources"; //$NON-NLS-1$
-
-	/**
-	 * default property file name
-	 */
-	public static final String DEFAULT_PROPERTIES = "default.properties"; //$NON-NLS-1$
-
-	/**
-	 * default style sheet
-	 */
-	public static final String USERAGENT = "html4.css"; //$NON-NLS-1$
-
-	/**
-	 * html editor id
-	 */
-	public static final String EDITORID_HTML = "org.eclipse.jst.pagedesigner.PageDesignerEditor"; //$NON-NLS-1$
-
-	/**
-	 * show all action preference id
-	 */
-	public static final String PREF_PALETTE_SHOW_ALL = "pref.palette.showall"; //$NON-NLS-1$
-
-	/**
-	 * local name of page designer extension
-	 */
-	public static final String EXTENSION_POINT_PAGEDESIGNER = "pageDesignerExtension"; //$NON-NLS-1$
-
-	/**
-	 * local name of cm registry extension
-	 */
-	public static final String EXTENSION_POINT_CMREGISTRY = "cmRegistry"; //$NON-NLS-1$
-
-	/**
-	 * local name of local drop handler extension
-	 */
-	public static final String LOCAL_DROP_HANDLER = "localDropHandler"; //$NON-NLS-1$
-
-	/**
-	 * local name of tag converter factory extension
-	 */
-	public static final String TAG_CONVERTER_FACTORY = "tagConverterFactory"; //$NON-NLS-1$
-
-	/**
-	 * local name of attribute cell editor factory extension
-	 * @deprecated and unused
-	 */
-	public static final String ATTRIBUTE_CELLEDITOR_FACTORY = "attributeCellEditorFactory"; //$NON-NLS-1$
-
-	/**
-	 * local name of tag attribute cell editor factory extension
-	 */
-	public static final String TAG_ATTRIBUTE_CELLEDITOR_FACTORY = "tagAttributeCellEditorFactory"; //$NON-NLS-1$
-	
-	/**
-	 * local name of tag transform operation extension
-	 */
-	public static final String TAG_TRANSFORM_OPERATION = "tagTransformOperation"; //$NON-NLS-1$
-	
-	/**
-	 * 
-	 * local name of element edit factory extension
-	 */
-	public static final String ELEMENT_EDIT_FACTORY = "elementEditFactory"; //$NON-NLS-1$
-
-	/**
-	 * local name of link creator extension
-	 */
-	public static final String LINK_CREATOR = "linkCreator"; //$NON-NLS-1$
-    
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/JMTResources.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/JMTResources.properties
deleted file mode 100644
index 33b4fef..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/JMTResources.properties
+++ /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
-###############################################################################
-####################################################
-# Resource message for Logging
-####################################################
-Log.Error.PageDesignerResources.Open=Error occurred getting the source bundle.
-Log.Error.MessageFormater.Format0=Error in message format.
-Log.Error.ExtensionReader.ReadLinkExtension=can't create linkCreator instance
-Log.Error.PreviewResources.ResouceNotFound=resource {0} not found
-
-Error.StringBufferWriter.Write.0=Error in string buffer writing.
-Error.RangeModeCommand.SetSelection=Selection error
-Error.SourceViewerCommand.Execution=Error in command execution
-Error.PDPlugin.Installation.0=Error starting plug-in.
-Error.PDPlugin.Installation.1=Problems starting plug-in Web Application Development.
-Error.PDPlugin.Installation.6=Problems starting plug-in Web Application Development.
-Error.DesignerPropertyTool.NatureQuerying=Error in project Java nature querying.
-Error.PDPlugin.Installation.10=log.PDPlugin.image.error
-Error.PDPlugin.Installation.13=log.PDPlugin.image.error
-Error.PDPlugin.Installation.15=error in installtion query.
-Error.ProjectResolver.GetlocationByURI.0=Error in taglib locating.
-Error.ProjectFileDialogContentProvider.0=Core error, you may need to restart the application.
-Error.EditValidateUtil.Position = Error in position validation.
-Error.EditValidateUtil.Text = Error occurred in text validation.
-Error.EditValidateUtil.Node = Error occurred in node validation.
-Error.EditValidateUtil.Range = Error occurred in range validation.
-Error.EditValidateUtil.StringIndex = Invalid string.
-Error.EditValidateUtil.IndexOffset = Invalid index or offset of string.
-CSSColorConverter.0=Error in color expression:
-CSSColorConverter.1=Error in color expression:
-Error.CSSFigure.0=Error in flowContext setting.
-Error.CSSUtil.0=Could not cast to CSS style
-Error.CSSUtil.1=Could not cast to CSS style
-Error.CSSUtil.2=Could not cast to CSS style
-Error.CSSUtil.3=Could not cast to CSS style
-Error.HTMLEditor.0=
-Error.HTMLEditor.1=Error occurred getting storage contents
-Error.HTMLEditor.2=Error occurred closing content.
-Error.HTMLEditor.3=The core has exception
-Error.HTMLEditor.4=Error occurred closing stream.
-Error.HTMLEditor.5=Error occurred initializing the editor.
-Error.HTMLEditor.6=Error occurred changing the page.
-Error.FontSizeMeta.0=Error occurred in tag font attribute calculating.
-Error.EditModelQuery.0=Error in position creation:
-Error.EditModelQuery.1=Error occurred getting node at indexed position
-Error.CommonResourceDialog.0.1=Error in project memeber querying
-Error.CommonResourceDialog.0.2=Please refer to error log for details
-Error.ImgFileFilter.1=CoreException is thrown, please refer to error log for details
-Error.ImgFileFilter.3=CoreException is thrown, please refer to error log for details
-Error.ImgFileFilter.0=Error in filtering the tree
-Error.ImgFileFilter.2=Error in getting project Nature
-Info.FontWeightMeta.0=Error occurred in integer processing.
-Warn.PolicyHelper.0=cannot get status line manager
-Warn.PolicyHelper.1=viewer is not HTML viewer
-HTMLSpecialCharHelper.3=Exception thrown
-HTMLSpecialCharHelper.2=Truncated & without ;
-HTMLSpecialCharHelper.1=Not an entity and not a &\#XXXX;
-HTMLSpecialCharHelper.0=Error in number expression
-
-####################################################
-# Resource message for RenderingTraverser
-####################################################
-RenderingTraverser.Error.FileNotFound		=	File Not Found
-RenderingTraverser.Error.UnsupportedEncoding	=	Unsupport Encoding
-RenderingTraverser.Error.IO		=	IO exception
-
-PaletteItemManager.error=error in constructor
-PaletteItemManager.initForPluginExtension.error.IOException=IOExcetpion in initForPluginExtension error
-PaletteItemManager.initForPluginExtension.error.MalformedURLException=MalformedURLException in initForPluginExtension
-PaletteItemManager.initForPluginExtension.error.InstantiationException=InstantiationException in initForPluginExtension
-PaletteItemManager.save.error.IOException=IOException when save
-ParagraphSupport.CommandLabel.Preformated=Preformated
-PaletteItemManager.loadPaletteItemState.error.IOException=IOException in loadPaletteItemState
-PaletteItemManager.loadPaletteItemState.error.SAXException=SAXException in loadPaletteItemState
-PaletteItemManager.loadPaletteItemState.error.getDocumentBuilderFail=getDocumentBuilder Failed
-
-PreviewUtil.previewFile.CoreException= CoreException previewing file
-PreviewUtil.previewFile.IOException= IOException previewing file
-
-#context menu
-ActionGroup.Submenu.TextStyle=Text Style
-ActionGroup.Submenu.Align=Align
-ActionGroup.Submenu.ParagraphFormat=Paragraph Format
-ActionGroup.Submenu.StyleClasses=Style Classes
-ActionGroup.Submenu.BorderStyle=Border Style
-ActionGroup.Submenu.Color=Color
-ActionGroup.Submenu.BackgroundColor=Background Color
-ActionGroup.Submenu.Link=Make Link...
-ActionGroup.Submenu.SelectRelative=Select Relative
-
-TableActionGroup.Submenu.SelectTable=Select Table
-TableActionGroup.Submenu.InsertRowBefore=Insert Row Before
-TableActionGroup.Submenu.InsertRowAfter=Insert Row After
-TableActionGroup.Submenu.InsertColumnBefore=Insert Column Before
-TableActionGroup.Submenu.InsertColumnAfter=Insert Column After
-TableActionGroup.Submenu.DeleteRow=Delete Row
-TableActionGroup.Submenu.DeleteColumn=Delete Column
-ElementEdit.Submenu.Table=Table
-ElementEdit.Submenu.SelectTable=Select Table
-ElementEdit.Submenu.InsertRowBefore=Insert Row Before
-ElementEdit.Submenu.InsertRowAfter=Insert Row After
-ElementEdit.Submenu.InsertColumnBefore=Insert Column Before
-ElementEdit.Submenu.InsertColumnAfter=Insert Column After
-ElementEdit.Submenu.DeleteRow=Delete Row
-ElementEdit.Submenu.DeleteColumn=Delete Column
-ElementEdit.Submenu.InsertHeader=Insert Header
-ElementEdit.Submenu.InsertFooter=Insert Footer
-ElementEdit.Submenu.DeleteHeader=Delete Header
-ElementEdit.Submenu.DeleteFooter=Delete Footer
-ElementEdit.Submenu.Taglib=Open Definition File
-TableInsertHeaderFooterCommand.ColumnHeader=Column Header
-TableInsertHeaderFooterCommand.ColumnFooter=Column Footer
-
-Action.Name.Copy=Copy
-Action.Name.Cut=Cut
-Action.Name.Paste=Paste
-
-Message.Warning.Title=Warning
-Taglib.OpenFile.ERROR=The file that the URI refers to does not exist.
-
-MakeLinkAction.Wizard.PageTitle=Please select link type
-CreateLinkWizard.Title=Select Link Type
-LinkWizardPage.GroupTitle=Link Types
-LinkWizardPage.PreviewLabel=Preview
-
-ItemCreationEditPolicy.CommandLabel.CreateItem=Create Item
-MakeLinkCommand.Label.MakeLink=Make Link
-AttributePropertySource.CommandLabel.ChangeAttribute=Change Attribute
-ChangeAttributeAction.CommandLabel.ChangeStyleClass=Change Style Class
-BorderStyleSupport.CommandLabel.Hidden=Hidden
-BorderStyleSupport.CommandLabel.Dotted=Dotted
-BorderStyleSupport.CommandLabel.Dashed=Dashed
-BorderStyleSupport.CommandLabel.Solid=Solid
-BorderStyleSupport.CommandLabel.Double=Double
-BorderStyleSupport.CommandLabel.Groove=Groove
-BorderStyleSupport.CommandLabel.Ridge=Ridge
-BorderStyleSupport.CommandLabel.Inset=Inset
-BorderStyleSupport.CommandLabel.Outset=Outset
-ColorSupport.CommandLabel.Aqua=Aqua
-ColorSupport.CommandLabel.Black=Black
-ColorSupport.CommandLabel.Blue=Blue
-ColorSupport.CommandLabel.Fuchsia=Fuchsia
-ColorSupport.CommandLabel.Gray=Gray
-ColorSupport.CommandLabel.Green=Green
-ColorSupport.CommandLabel.Lime=Lime
-ColorSupport.CommandLabel.Maroon=Maroon
-ColorSupport.CommandLabel.Navy=Navy
-ColorSupport.CommandLabel.Olive=Olive
-ColorSupport.CommandLabel.Orange=Orange
-ColorSupport.CommandLabel.Purple=Purple
-ColorSupport.CommandLabel.Red=Red
-ColorSupport.CommandLabel.Silver=Silver
-ColorSupport.CommandLabel.Teal=Teal
-ColorSupport.CommandLabel.White=White
-ColorSupport.CommandLabel.Yellow=Yellow
-ColorSupport.CommandLabel.Default=Default
-ParagraphSupport.CommandLabel.None=None
-ParagraphSupport.CommandLabel.Paragraph=Paragraph
-ParagraphSupport.CommandLabel.Heading1=Heading 1
-ParagraphSupport.CommandLabel.Heading2=Heading 2
-ParagraphSupport.CommandLabel.Heading3=Heading 3
-ParagraphSupport.CommandLabel.Heading4=Heading 4
-ParagraphSupport.CommandLabel.Heading5=Heading 5
-ParagraphSupport.CommandLabel.Heading6=Heading 6
-ParagraphSupport.CommandLabel.P=P
-ParagraphSupport.CommandLabel.H1=H1
-ParagraphSupport.CommandLabel.H2=H2
-ParagraphSupport.CommandLabel.H3=H3
-ParagraphSupport.CommandLabel.H4=H4
-ParagraphSupport.CommandLabel.H5=H5
-ParagraphSupport.CommandLabel.H6=H6
-ParagraphSupport.CommandLabel.PRE=PRE
-HTagsInsertGroupAction.ActionLabel.Hx=Hx
-RangeStyleSupport.ActionLabel.Bold=Bold
-RangeStyleSupport.ActionLabel.Italic=Italic
-RangeStyleSupport.ActionLabel.Underline=Underline
-ShowAllAction.ActionLabel.ShowAll=Show All
-AlignSupport.ActionLabel.Left=Left
-AlignSupport.ActionLabel.Center=Center
-AlignSupport.ActionLabel.Right=Right
-AlignSupport.ActionLabel.Justify=Justify
-
-Info.ElementDescReader.ReadPropertyFile=The property file:{0} is not found
-Info.ElementDescReader.ReadPropertyFile.Key=The key:{0} is not found in file:{1}
-ChangeStyleAction.Text=Edit Style...
-
-Log.Error.HTMLStringTagConverter.Error=Error
-ConverterUtil.Description= Drag and drop Web page content here
-
-SimpleGraphicalEditor.help.id=org.eclipse.jst.pagedesigner.graphicalEditor
-DesignerTabbedPropertySheetPage.help.id=org.eclipse.jst.pagedesigner.QuickEditor
-MyPropertySheetPage.help.id=org.eclipse.jst.pagedesigner.Attributes
-StyleDialog.help.id=org.eclipse.jst.pagedesigner.styleDialog
-DesignerPaletteViewerProvider.help.id=org.eclipse.jst.pagedesigner.palette_help
-
-StyleClassSupport.Default=Default
-XMLUtil.Error.0=Error in create documentBuilder:
-XMLUtil.Error.2=Error in object persistance:
-PreviewUtil.Error.0=Error occurred processing the resource bundle:
-PreviewUtil.Error.3=Error occurred opening the file:
-PreviewHandlerNew.Error.0=Error in model release:
-PreviewConvertContext.Error.0=Error:
-CellEditorFactoryRegistry.Info.2=Error in fields retrieving:
-CellEditorFactoryRegistry.Info.3=Error in fields retrieving:
-PageExpressionContext.Info.0=Error:
-TextLayoutSupport.Info.1=Error in text painting:
-
-CMRegistry.ReadConfigration=Reading Properties Configurations
-CMRegistry.HTMLConfigration=Reading HTML Configuration ...
-CMRegistry.JSPConfigration=Reading JSP Configuration ...
-CMRegistry.OtherConfigration=Reading Other Configuration ...
-
-HTMLEditor.Design=Design
-HTMLEditor.Source=Source
-
-LocalSelectionDropTargetListener.MessageDialog.Title=Info
-LocalSelectionDropTargetListener.MessageDialog.Message=The page is deleted, save it first.
-
-LoadBundleTagConverter.convertRefresh.MalformedURLException= MalformedURLException in LoadBundleTagConverter
-LoadBundleTagConverter.convertRefresh.IOException= IOException in LoadBundleTagConverter
-
-Warning.TransformOperationFactory.ExtensionNotFound=ITransformOperation id not found in pageDesigner extension registry ("{0}")
-Warning.TransformOperationFactory.CannotLoadOpClass=Unable to load tag transform operation Class for id ("{0}")
-Warning.TransformOperationFactory.ClassNotFound=ITransformOperation class specified by name in metadata not found ("{0}")
-Warning.TransformOperationFactory.IllegalAccess=ITransformOperation class specified by name in metadata could not be legally accessed ("{0}")
-Warning.TransformOperationFactory.Instantiation=ITransformOperation class specified by name in metadata could not be instantiated ("{0}")
-Warning.TransformOperationFactory.NotAbstractTransformOperation=ITransformOperation class specified by name in metadata does not extend AbstractTransformOperation ("{0}")
-Warning.TransformOperationFactory.UnknownOperationID=Unknown operation ID specified in metadata ("{0}")
-Warning.TransformOperationFactory.TooFewParameters=Too few parameters specified in metadata for operation ("{0}")
-Warning.TransformOperationFactory.RegistryError=Unable to read "{0}" extension registry
-
-#Errors relating to ITagCreator et al.
-Error.TagCreatorMustBeOfType=ITagCreator instances must be of type {0}.
-Error.ProblemLoadingExtensionPoint=Problem loading ITagCreatorFactory extension Point
-Error.ProblemLoadingTagCreatorFactory=Problem loading tag creator factory: {0}
-Error.ProblemLoadingExecutingTagCreator=Problem executing tag creator: {0}
-
-#Property Sheet
-QuickEditTab.no_quick_edit_md=No quick edit properties are available for the current selection
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/PDPlugin.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/PDPlugin.java
deleted file mode 100644
index 06db1dd..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/PDPlugin.java
+++ /dev/null
@@ -1,456 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.MissingResourceException;
-import java.util.Properties;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.ILog;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.Alerts;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The main plugin class to be used in the desktop.
- */
-public class PDPlugin extends AbstractUIPlugin {
-	private static final String ICONS_LIB_PATH = "icons";
-
-	//private static final boolean ROOT_PLUGIN = false;
-
-	// The shared instance.
-	private static PDPlugin _plugin;
-
-	private static Logger _log;
-
-	private static Alerts _alerts;
-
-	private ResourceBundle _resourceBundle;
-
-	private Properties _properties;
-
-	private URL _pluginBase;
-
-	/**
-	 * The constructor.
-	 */
-	public PDPlugin() {
-		super();
-		_plugin = this;
-	}
-
-	/**
-	 * This method is called upon plug-in activation
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-
-		try {
-			// get resource bundle.
-			_resourceBundle = ResourceBundle
-					.getBundle(IJMTConstants.ROOT_RESOURCEBUNDLE);
-			_alerts = new Alerts(this, _resourceBundle);
-
-			// get properties.
-			_properties = new Properties();
-			InputStream input = null;
-			_pluginBase = getBundle().getEntry("/");
-			try {
-				input = (new URL(_pluginBase, IJMTConstants.DEFAULT_PROPERTIES))
-						.openStream();
-				_properties.load(input);
-			} finally {
-				try {
-					input.close();
-				} catch (IOException ee)// NOPMD
-				{
-					// nothing to do when IOException throwed in closing files.
-				}
-			}
-
-			// set up logging for this plugin and everthing under it.
-			_log = new Logger(this.getBundle(), _resourceBundle);
-
-			// NOTE: add in any other plugin code statup HERE!!!!
-
-			// log.CommonPlugin=Web Application Development Common Plugin
-			// initialized on eclipse version {0}.
-
-			// log.info("log.CommonPlugin", version);
-
-		} catch (Exception ee) {
-			// only log if the logger was configured correctly.
-			if (_log != null) {
-				_log
-						.error(
-								"log.msg",
-								"Problems starting plug-in Web Application Development Common.",
-								ee);
-			}
-
-			throw new CoreException(
-					new Status(
-							IStatus.ERROR,
-							getBundle().getSymbolicName(),
-							IStatus.OK,
-							"Problems starting plug-in Web Application Development Common",
-							ee));
-		}
-	}
-
-	/**
-	 * Returns the shared instance.
-	 * @return the default plugin
-	 */
-	public static PDPlugin getDefault() {
-		return _plugin;
-	}
-
-	/**
-	 * get the alerts objects associated with this plugin for alerting the user.
-	 * 
-	 * @return the Alerts object
-	 */
-	public static Alerts getAlerts() {
-		return _alerts;
-	}
-
-	/**
-	 * Returns a logger for the new class using this plugin for reference.
-	 * @param theClass
-	 * @return the Logger object associated with theClass
-	 */
-	public static Logger getLogger(Class theClass) {
-		if (getDefault() != null && getDefault().getRootLogger() != null) {
-			return getDefault().getRootLogger();
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the plugin's root logger
-	 * @return the root logger
-	 */
-	public Logger getRootLogger() {
-		return _log;
-	}
-
-	/**
-	 * Returns this plugin's unique identifier
-	 * @return the plugin id
-	 */
-	public static String getPluginId() {
-		return getDefault().getBundle().getSymbolicName();
-	}
-
-	/**
-	 * @return the plugin's resource bundle
-	 */
-	public ResourceBundle getResourceBundle() {
-		return _resourceBundle;
-	}
-
-	/**
-	 * @param key 
-	 * @return the string from the plugin's resource bundle, or 'key' if not
-	 * found.
-	 */
-	public static String getResourceString(String key) {
-		ResourceBundle bundle = PDPlugin.getDefault().getResourceBundle();
-		try {
-			return (bundle != null) ? bundle.getString(key) : key;
-		} catch (MissingResourceException e) {
-			return '!' + key + '!';
-		}
-	}
-
-	/**
-	 * @return the plugin's descriptor's resource bundle,
-	 */
-	public ResourceBundle getPluginDecriptorBundle() {
-		return Platform.getResourceBundle(getDefault().getBundle());
-	}
-
-	/**
-	 * @return the plugin's default properties. These are normally used for
-	 * default preferences.
-	 */
-	public Properties getProperties() {
-		return _properties;
-	}
-
-	/**
-	 * @return the standard display to be used. The method first checks, if the
-	 * thread calling this method has an associated dispaly. If so, this display
-	 * is returned. Otherwise the method returns the default display.
-	 */
-	public static Display getStandardDisplay() {
-		Display display;
-		display = Display.getCurrent();
-		if (display == null) {
-			display = Display.getDefault();
-		}
-		return display;
-	}
-
-	/**
-	 * @return the workspace instance.
-	 */
-	public static IWorkspace getWorkspace() {
-		return ResourcesPlugin.getWorkspace();
-	}
-
-	/**
-	 * Returns a shared image for the given name.  Image must exist in icons folder of pagedesigner plugin.
-	 * <p>
-	 * Note: Images returned from this method will be automitically disposed of
-	 * when this plug-in shuts down. Callers must not dispose of these images
-	 * themselves.
-	 * </p>
-	 * 
-	 * @param name
-	 *            the image name found in /icons (with extension)
-	 * @return the image, null on error or not found.
-	 */
-	public Image getImage(String name) {
-		if (name == null) {
-			return null;
-		}
-
-		ImageRegistry images = getImageRegistry();
-		Image image = images.get(name);
-		if (image == null) {
-			getImageDescriptor(name);		
-			image = images.get(name);
-		}
-		return image;
-	}
-
-	/**
-	 * Returns a shared ImageDescriptor for the given name
-	 * <p>
-	 * Note: ImageDescriptor returned from this method will be automatically
-	 * disposed of when this plug-in shuts down. Callers must not dispose of
-	 * these ImageDescriptor themselves.
-	 * </p>
-	 * 
-	 * @param name
-	 *            the ImageDescriptor name found in /icons (with extension)
-	 * @return the ImageDescriptor, null on error or not found.
-	 */
-	public ImageDescriptor getImageDescriptor(String name) {
-		if (name == null) {
-			return null;
-		}
-
-		ImageRegistry images = getImageRegistry();
-		ImageDescriptor id = images.getDescriptor(name);
-		if (id == null) {
-			InputStream stream = null;
-			try {//check existance of file
-				URL url = new URL(_pluginBase,
-						ICONS_LIB_PATH + "/" + name);
-				
-				//doing the following to check existance... exception will be caught and null descriptor returned
-				stream = url.openStream();
-				stream.close();
-				
-				id = ImageDescriptor.createFromURL(url);
-				images.put(name, id);
-			} catch (IOException e1) {
-				_log.info("Unable to create ImageDescriptor for: "+name, e1);
-				return null;
-			} 
-		}
-		return id;
-	}
-
-	/**
-	 * Read a file resource. The file should contain any partial path and the
-	 * filename from the plugin base. The caller is responsible for closing the
-	 * file.
-	 * @param file 
-	 * @return the input stream for the file
-	 * @throws MalformedURLException 
-	 * @throws IOException 
-	 */
-	public InputStream readFile(String file) throws MalformedURLException,
-			IOException {
-		return (new URL(_pluginBase, file)).openStream();
-	}
-
-	/**
-	 * @param file
-	 * @return the File associate with the name 'file'
-	 * @throws MalformedURLException
-	 * @throws IOException
-	 */
-	public File getFile(String file) throws MalformedURLException, IOException {
-		return new File((new URL(_pluginBase, file)).getPath());
-	}
-
-	/**
-	 * @return the plugin's install location with the leading "/" removed
-	 * and normalized to the the os string.
-	 */
-	public static Path getInstallLocation() {
-		try {
-			URL url = getDefault().getBundle().getEntry("/");
-			String s1 = FileLocator.resolve(url).getFile();
-			if (s1.startsWith("/")) //$NON-NLS-1$
-			{
-				s1 = s1.substring(1);
-			}
-			s1 = (new Path(s1)).toOSString();
-			String s;
-			if (s1.endsWith(File.separator)) {
-				s = s1;
-			} else {
-				s = s1 + File.separator;
-			}
-			return new Path(s);
-		} catch (Exception exception) {
-			_log.error("Error.PDPlugin.Installation.15", exception); //$NON-NLS-1$
-			return null;
-		}
-	}
-
-    /**
-	 * Returns the active workbench window.
-	 * 
-	 * @return the active workbench window. this can be null but I've never seen
-	 *         it.
-	 */
-	public static IWorkbenchWindow getActiveWorkbenchWindow() {
-		if (getDefault().getWorkbench() == null) {
-			return null;
-		}
-        return getDefault().getWorkbench().getActiveWorkbenchWindow();
-	}
-
-	/**
-	 * Returns the active workbench page. Note that the active page may not be
-	 * the one that the user perceives as active in some situations so this
-	 * method of obtaining the activate page should only be used if no other
-	 * method is available.
-	 * 
-	 * @return the active workbench page
-	 */
-	public static IWorkbenchPage getActivePage() {
-		IWorkbenchWindow window = getActiveWorkbenchWindow();
-		if (window == null) {
-			return null;
-		}
-		return window.getActivePage();
-	}
-
-	/**
-	 * Initializes the preference controls to the default values. These values
-	 * are used the first time the preference page is displayed or when the user
-	 * presses the Defaults button in the preferences page.
-	 */
-	protected void initializeDefaultPreferences(IPreferenceStore store) {
-		// initialize any preferences for this plugin.
-	}
-
-	/**
-	 * @return the active workbench Shell. Used for some funciton need IShell
-	 * Parameter.
-	 */
-	public static Shell getActiveWorkbenchShell() {
-		IWorkbenchWindow window = getActiveWorkbenchWindow();
-		if (window != null) {
-			return window.getShell();
-		}
-		IWorkbenchWindow[] windows = getDefault().getWorkbench()
-				.getWorkbenchWindows();
-		if (windows.length > 0) {
-			return windows[0].getShell();
-		}
-		return null;
-	}
-
-	/**
-	 * @return the active display.
-	 */
-	public static Display getDisplay() {
-		Shell shell = getActiveWorkbenchShell();
-		if (shell != null) {
-			return shell.getDisplay();
-		}
-        return Display.getDefault();
-	}
-
-	/**
-	 * @return current active project.
-	 */
-	public static IProject getCurrentProject() {
-		IProject curProject = null;
-		IEditorPart editor = PDPlugin.getDefault().getWorkbench()
-				.getActiveWorkbenchWindow().getActivePage().getActiveEditor();
-		IEditorInput input = editor.getEditorInput();
-		IFile inputFile = null;
-		if (input instanceof IFileEditorInput) {
-			inputFile = ((IFileEditorInput) input).getFile();
-			curProject = inputFile.getProject();
-		}
-		return curProject;
-	}
-	
-	/**
-	 * Log status using the default plugin logger
-	 * @param status
-	 */
-	public static void log(IStatus status)
-	{
-	    ILog log = getDefault().getLog();
-	    log.log(status);
-	}
-	
-	/**
-	 * @param message
-	 * @param excp
-	 */
-	public static void log(String message, Throwable excp)
-	{
-	    Status status = new Status(IStatus.ERROR, getPluginId(), message, excp);
-	    log(status);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/container/ContainerActionGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/container/ContainerActionGroup.java
deleted file mode 100644
index 807cad2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/container/ContainerActionGroup.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.container;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEdit;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.range.RangeUtil;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.ui.actions.ActionGroup;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ContainerActionGroup extends ActionGroup {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.ActionGroup#fillContextMenu(org.eclipse.jface.action.IMenuManager)
-	 */
-	public void fillContextMenu(IMenuManager menu) {
-		ISelection selection = this.getContext().getSelection();
-
-		EditPart part = findCommonAncesterPart(selection);
-		if (!(part instanceof NodeEditPart)) {
-			return;
-		}
-
-		NodeEditPart original = (NodeEditPart) part;
-		// start from the parent of part
-		while (part.getParent() instanceof ElementEditPart) {
-			ElementEditPart elementEditPart = (ElementEditPart) part
-					.getParent();
-
-			IElementEdit elementEdit = elementEditPart.getElementEdit();
-			if (elementEdit != null) {
-				boolean filled = elementEdit.fillContainerContextMenu(menu,
-						elementEditPart, original, selection);
-				if (filled) {
-					break;
-				}
-			}
-
-			part = part.getParent();
-		}
-	}
-
-	/**
-	 * Give a selection, find a single common container node as start for table
-	 * related operations.
-	 * 
-	 * @param selection
-	 * @return
-	 */
-	private EditPart findCommonAncesterPart(ISelection selection) {
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection structsel = (IStructuredSelection) selection;
-			if (structsel.size() != 1) {
-				return null;
-			} else if (structsel.getFirstElement() instanceof EditPart) {
-				return (EditPart) structsel.getFirstElement();
-			} else {
-				return null;
-			}
-		} else if (selection instanceof DesignRange) {
-			DesignRange range = (DesignRange) selection;
-			if (!range.isValid()) {
-				return null;
-			}
-			if (range.isEmpty()) {
-				DesignPosition position = range.getStartPosition();
-				if (position.getOffset() == 0
-						|| position.getContainerNode() instanceof Text) {
-					return position.getContainerPart();
-				}
-                return position.getSiblingEditPart(false);
-			}
-            return RangeUtil.findCommonAncestor(range);
-		} else {
-			return null;
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/AbstractLinkCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/AbstractLinkCreator.java
deleted file mode 100644
index 0e7f371..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/AbstractLinkCreator.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.link;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExecutableExtension;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public abstract class AbstractLinkCreator implements ILinkCreator,
-		IExecutableExtension {
-	private String _identifier;
-    /**
-     * the link identifier attribute name
-     */
-    private static final String LINK_IDENTIFIER = "linkIdentifier";
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.actions.link.ILinkCreator#canExcute(org.eclipse.jst.pagedesigner.viewer.DesignRange)
-	 */
-	public boolean canExecute(DesignRange range) {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.actions.link.ILinkCreator#getLinkIdentifier()
-	 */
-	public String getLinkIdentifier() {
-		return this._identifier;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IExecutableExtension#setInitializationData(org.eclipse.core.runtime.IConfigurationElement,
-	 *      java.lang.String, java.lang.Object)
-	 */
-	public void setInitializationData(IConfigurationElement config,
-			String propertyName, Object data) throws CoreException {
-		this._identifier = config.getAttribute(LINK_IDENTIFIER);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/CreateLinkWizard.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/CreateLinkWizard.java
deleted file mode 100644
index b385663..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/CreateLinkWizard.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.link;
-
-import java.util.Map;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class CreateLinkWizard extends Wizard {
-	private static final String WIZARD_TITLE = PDPlugin
-			.getResourceString("CreateLinkWizard.Title");
-
-	private static final String INTIAL_DEFAULT_PAGE_IMAGE = "newsuade_wiz.gif";
-
-	private static final String PAGE_NAME = "first";
-
-	private String _pageTitle;
-
-	private EditPart _part;
-
-	private DesignRange _range;
-
-	private Map<String, ILinkCreator> _linkMap;
-
-	private String _linkType;
-
-	/**
-	 * @param part
-	 * @param range
-	 * @param linkMap
-	 */
-	public CreateLinkWizard(EditPart part, DesignRange range, Map<String, ILinkCreator> linkMap) {
-		this._part = part;
-		this._range = range;
-		this._linkMap = linkMap;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.IWizard#addPages()
-	 */
-	public void addPages() {
-		addPage(new LinkWizardPage(PAGE_NAME, _pageTitle, this._part,
-				this._range, this._linkMap));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.IWizard#canFinish()
-	 */
-	public boolean canFinish() {
-		return super.canFinish();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.IWizard#performFinish()
-	 */
-	public boolean performFinish() {
-		LinkWizardPage page = (LinkWizardPage) getPage(PAGE_NAME);
-		this._linkType = page.getChosenLinkType();
-		return true;
-	}
-
-	/**
-	 * @param pageTitle
-	 */
-	public void setPageTitle(String pageTitle) {
-		_pageTitle = pageTitle;
-		initializeDefaultPageImageDescriptor();
-	}
-
-	/**
-	 * 
-	 */
-	protected void initializeDefaultPageImageDescriptor() {
-		ImageDescriptor desc = PDPlugin.getDefault().getImageDescriptor(
-				INTIAL_DEFAULT_PAGE_IMAGE);
-		setDefaultPageImageDescriptor(desc);
-		setWindowTitle(WIZARD_TITLE);
-	}
-
-	/**
-	 * @return the link type
-	 */
-	public String getChosenLinkType() {
-		return this._linkType;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/ExtensionReader.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/ExtensionReader.java
deleted file mode 100644
index 6cf3d9f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/ExtensionReader.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.link;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.IJMTConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ExtensionReader {
-	private static Logger _log = PDPlugin.getLogger(ExtensionReader.class);
-
-	private static List<ILinkCreator> _handlers = null;
-
-	private static final String ATTR_CLASS = "class";
-
-	/** 
-	 * @return the ext-pts for the link handler
-	 * List is not modifiable
-	 */
-	public static synchronized List<ILinkCreator> getAllLinkHandlers() {
-		if (_handlers == null) {
-			_handlers = readAllLinkHandlers();
-		}
-		return Collections.unmodifiableList(_handlers);
-
-	}
-
-	private static List<ILinkCreator> readAllLinkHandlers() {
-	    List<ILinkCreator> result = new ArrayList<ILinkCreator>();
-		IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
-				.getExtensionPoint(PDPlugin.getPluginId(),
-						IJMTConstants.EXTENSION_POINT_PAGEDESIGNER);
-		IExtension[] extensions = extensionPoint.getExtensions();
-
-		for (int i = 0; i < extensions.length; i++) {
-			IExtension ext = extensions[i];
-			IConfigurationElement[] linkHandlers = ext
-					.getConfigurationElements();
-
-			for (int j = 0; j < linkHandlers.length; j++) {
-				if (linkHandlers[j].getName()
-						.equals(IJMTConstants.LINK_CREATOR)) {
-					linkHandlers[j].getAttribute(ATTR_CLASS);
-					Object obj;
-					try {
-						obj = linkHandlers[j]
-								.createExecutableExtension(ATTR_CLASS);
-
-						if (obj instanceof ILinkCreator) {
-							result.add((ILinkCreator)obj);
-						}
-					} catch (CoreException e) {
-						_log
-								.error("Log.Error.ExtensionReader.ReadLinkExtension");
-					}
-				}
-			}
-		}
-		return result;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/HtmlLinkCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/HtmlLinkCreator.java
deleted file mode 100644
index 8e3c6f9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/HtmlLinkCreator.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.link;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.parts.TextEditPart;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class HtmlLinkCreator extends AbstractLinkCreator {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.actions.link.ILinkCreator#makeLinkElement(org.eclipse.gef.EditPart,
-	 *      org.eclipse.jst.pagedesigner.viewer.DesignRange)
-	 */
-	public Element makeLinkElement(EditPart part, DesignRange range) {
-		if (part instanceof TextEditPart) {
-			Text middleNode = LinkUtil.splitDomText(part, range);
-			EditPart parent = part.getParent();
-			Node parentNode = (Node) parent.getModel();
-			Document doc = (parentNode instanceof Document) ? (Document) parentNode
-					: (parentNode.getOwnerDocument());
-
-			Element htmlLink = doc.createElement(IHTMLConstants.TAG_A);
-			htmlLink.setAttribute(ICSSPropertyID.ATTR_HREF, "");
-			Text text = doc.createTextNode(middleNode.getNodeValue());
-			htmlLink.appendChild(text);
-			parentNode.replaceChild(htmlLink, middleNode);
-			return htmlLink;
-		}
-
-		return null;
-	}
-
-	public String getSourcePreview(EditPart part, DesignRange range) {
-		if (part instanceof TextEditPart) {
-			TextEditPart textPart = (TextEditPart) part;
-			int[] offsets = textPart.getSelectedRange();
-			String displayData = textPart.getTextData();
-
-			String linkExp = displayData.substring(offsets[0], offsets[1]);
-			StringBuffer sb = new StringBuffer();
-			sb.append("<a href=\"\">");
-			sb.append(linkExp);
-			sb.append("</a>");
-			return sb.toString();
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/ILinkCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/ILinkCreator.java
deleted file mode 100644
index 0652f37..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/ILinkCreator.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.link;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public interface ILinkCreator {
-
-	/**
-	 * @param part
-	 * @param range
-	 * @return the link element
-	 */
-	public Element makeLinkElement(EditPart part, DesignRange range);
-
-	/**
-	 * @return link identifier
-	 */
-	public String getLinkIdentifier();
-
-	/**
-	 * @param range
-	 * @return true if can call makeLinkElement
-	 */
-	public boolean canExecute(DesignRange range);
-
-	/**
-	 * @param part
-	 * @param range
-	 * @return a preview string that approximates the result
-	 * of makeLinkElement
-	 */
-	public String getSourcePreview(EditPart part, DesignRange range);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/LinkRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/LinkRequest.java
deleted file mode 100644
index 1caa1f8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/LinkRequest.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.link;
-
-import org.eclipse.gef.Request;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class LinkRequest extends Request {
-	private final String _identifier;
-
-	private final DesignRange _range;
-
-	/**
-	 * @param identifier
-	 * @param range
-	 */
-	public LinkRequest(String identifier, DesignRange range) {
-		this._identifier = identifier;
-		this._range = range;
-	}
-
-	/**
-	 * @return the identifier
-	 */
-	public String getIdentifier() {
-		return this._identifier;
-	}
-
-	/**
-	 * @return the design range
-	 */
-	public DesignRange getDesignRange() {
-		return this._range;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/LinkUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/LinkUtil.java
deleted file mode 100644
index aeeaf41..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/LinkUtil.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.link;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.DOMRangeHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.parts.TextEditPart;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class LinkUtil {
-	/**
-	 * @param part
-	 * @param range
-	 * @return the select text if part is a text node or null.
-	 */
-	public static String getSelectedText(EditPart part, DesignRange range) {
-		if (part instanceof TextEditPart) {
-			TextEditPart textPart = (TextEditPart) part;
-			int[] offsets = textPart.getSelectedRange();
-			String displayData = textPart.getTextData();
-
-			String linkExp = displayData.substring(offsets[0], offsets[1]);
-			return linkExp;
-		}
-		return null;
-	}
-
-	/**
-	 * @param part
-	 * @param range
-	 * @return the text from part split if it is a text node or null
-	 */
-	public static Text splitDomText(EditPart part, DesignRange range) {
-		if (part instanceof TextEditPart) {
-			Text textNode = (Text) part.getModel();
-
-			DOMRange domRange = DOMRangeHelper.toDOMRange(range);
-			IDOMPosition start = domRange.getStartPosition();
-			IDOMPosition end = domRange.getEndPosition();
-			int domTempStartOffset = computeOffset(start, textNode);
-			int domTempEndOffset = computeOffset(end, textNode);
-
-			int domStartOffset = Math.min(domTempStartOffset, domTempEndOffset);
-			int domEndOffset = Math.max(domTempStartOffset, domTempEndOffset);
-
-			Text lastNode = textNode;
-			if (domStartOffset > 0) {
-				lastNode = textNode.splitText(domStartOffset);
-			}
-			lastNode = lastNode.splitText(domEndOffset - domStartOffset);
-			Text middleNode = (Text) lastNode.getPreviousSibling();
-			return middleNode;
-		}
-		return null;
-	}
-
-	private static int computeOffset(IDOMPosition pos, Text textNode) {
-		int domOffset = 0;
-		if (pos instanceof DOMRefPosition) {
-			DOMRefPosition rep = (DOMRefPosition) pos;
-			boolean forward = rep.isForward();
-			Node refNode = rep.getReferenceNode();
-
-			if ((refNode != textNode) && forward || (refNode == textNode)
-					&& !forward) {
-				domOffset = 0;
-			} else {
-				domOffset = textNode.getLength();
-			}
-		} else {
-			domOffset = pos.getOffset();
-		}
-		return domOffset;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/LinkWizardPage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/LinkWizardPage.java
deleted file mode 100644
index 25e120c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/LinkWizardPage.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.link;
-
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class LinkWizardPage extends WizardPage {
-	private static final String GROUP_TITLE = PDPlugin
-			.getResourceString("LinkWizardPage.GroupTitle");
-
-	private static final String PREVIEW_TAG_LABEL = PDPlugin
-			.getResourceString("LinkWizardPage.PreviewLabel");
-
-	private StyledText _text = null;
-
-	private final Map<String, ILinkCreator> _linkMap;
-
-	private String _linkType = null;
-
-	private final EditPart _part;
-
-	private final DesignRange _range;
-
-	/**
-	 * @param pageName
-	 * @param title
-	 * @param editPart
-	 * @param range
-	 * @param linkMap
-	 */
-	public LinkWizardPage(String pageName, String title, EditPart editPart,
-			DesignRange range, Map<String, ILinkCreator> linkMap) {
-		super(pageName, title, null);
-		this._part = editPart;
-		this._range = range;
-		this._linkMap = linkMap;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {
-		GridLayout layout;
-		GridData data;
-
-		layout = new GridLayout();
-		layout.marginWidth = 20;
-		parent.setLayout(layout);
-		data = new GridData(GridData.FILL_BOTH | GridData.CENTER);
-		parent.setLayoutData(data);
-
-		Group group = new Group(parent, SWT.NONE);
-		group.setText(GROUP_TITLE);
-		layout = new GridLayout();
-		group.setLayout(layout);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		group.setLayoutData(data);
-
-		String defaultLink = "";
-		Set<String> set = this._linkMap.keySet();
-		int size = set.size();
-		String[] keys = new String[size];
-		Iterator<String> itr = set.iterator();
-		int i = 0;
-		while (itr.hasNext()) {
-			String key = itr.next();
-			keys[i++] = key;
-		}
-		Arrays.sort(keys);
-		for (int j = 0; j < size; j++) {
-			Button bt = new Button(group, SWT.RADIO);
-			data = new GridData(GridData.FILL_HORIZONTAL);
-			bt.setLayoutData(data);
-			bt.setText(keys[j]);
-			if (j == 0) {
-				bt.setSelection(true);
-				defaultLink = keys[j];
-			}
-			bt.addSelectionListener(new SelectLinkListener(keys[j]));
-		}
-
-		Label label = new Label(parent, SWT.NONE);
-		label.setText(PREVIEW_TAG_LABEL);
-
-		_text = new StyledText(parent, SWT.WRAP | SWT.V_SCROLL | SWT.BORDER);
-		data = new GridData(GridData.FILL_BOTH);
-		data.heightHint = 50;
-		_text.setLayoutData(data);
-
-		ILinkCreator creator = _linkMap.get(defaultLink);
-		_linkType = creator.getLinkIdentifier();
-		String previewText = creator.getSourcePreview(_part, _range);
-		previewText = previewText == null ? "" : previewText;
-		_text.setText(previewText);
-		_text.setEditable(false);
-
-		super.setControl(group);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.IWizardPage#isPageComplete()
-	 */
-	public boolean isPageComplete() {
-		return true;
-	}
-
-	/**
-	 * @return the link type
-	 */
-	public String getChosenLinkType() {
-		return this._linkType;
-	}
-
-    class SelectLinkListener extends SelectionAdapter {
-		private String _key;
-
-		/**
-		 * @param key
-		 */
-		public SelectLinkListener(String key) {
-			this._key = key;
-		}
-
-		public void widgetSelected(SelectionEvent e) {
-			ILinkCreator creator = _linkMap.get(this._key);
-			_linkType = creator.getLinkIdentifier();
-			String previewText = creator.getSourcePreview(_part, _range);
-			previewText = previewText == null ? "" : previewText;
-			_text.setText(previewText);
-			super.widgetSelected(e);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/MakeLinkAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/MakeLinkAction.java
deleted file mode 100644
index ee8df16..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/MakeLinkAction.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.link;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jst.jsf.common.ui.internal.dialogs.CommonWizardDialog;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.parts.TextEditPart;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class MakeLinkAction extends Action {
-	private final static String MAKE_LINK = PDPlugin
-			.getResourceString("ActionGroup.Submenu.Link");
-
-	private final static String WIZARD_PAGE_TITLE = PDPlugin
-			.getResourceString("MakeLinkAction.Wizard.PageTitle");
-
-	private EditPart _editPart;
-
-	private DesignRange _range;
-
-	private String _linkType;
-
-	/**
-	 * @param range
-	 */
-	public MakeLinkAction(DesignRange range) {
-		super(MAKE_LINK);
-		_range = range;
-		_editPart = convertToEditPart(_range);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		Map<String, ILinkCreator> map = calAvailableLinkCreator();
-		if (map.size() > 1) {
-			CreateLinkWizard wizard = new CreateLinkWizard(_editPart, _range,
-					map);
-			wizard.setPageTitle(WIZARD_PAGE_TITLE);
-			CommonWizardDialog wizardDialog = new CommonWizardDialog(
-					getShell(), wizard);
-			wizardDialog.create();
-			if (wizardDialog.open() == Window.OK) {
-				_linkType = wizard.getChosenLinkType();
-			}
-		}
-		// else must be html link
-		else if (map.size() == 1) {
-			Set<Map.Entry<String, ILinkCreator>> set = map.entrySet();
-			Iterator<Map.Entry<String,ILinkCreator>> itr = set.iterator();
-			while (itr.hasNext()) {
-				ILinkCreator creator =  itr.next().getValue();
-				_linkType = creator.getLinkIdentifier();
-			}
-		}
-
-		if (_linkType != null) {
-			Request request = new LinkRequest(_linkType, _range);
-			Command cmd = _editPart.getCommand(request);
-			if (cmd != null && cmd.canExecute()) {
-				cmd.execute();
-			}
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#isEnabled()
-	 */
-	public boolean isEnabled() {
-		if (_editPart == null) {
-			return false;
-		}
-		return super.isEnabled();
-	}
-
-	private EditPart convertToEditPart(DesignRange range) {
-		DesignPosition startPosition = range.getStartPosition();
-		EditPart startPart = startPosition.getContainerPart();
-
-		DesignPosition endPosition = range.getEndPosition();
-		EditPart endPart = endPosition.getContainerPart();
-
-		if (startPosition == endPosition) {
-			return null;
-		}
-
-		if (startPart instanceof TextEditPart
-				&& endPart instanceof TextEditPart) {
-			if ((startPart == endPart)) {
-				return startPart;
-			}
-		} else if (!(startPart instanceof TextEditPart)
-				&& !(endPart instanceof TextEditPart)) {
-			Node[] startNodeOptions = null;
-			startNodeOptions = getSideNodes(startPosition);
-			Node[] endNodeOptions = null;
-			endNodeOptions = getSideNodes(endPosition);
-			Node selectedNode = null;
-			for (int i = 0; i < 2; i++) {
-				for (int j = 0; j < 2; j++) {
-					if (startNodeOptions[i] == endNodeOptions[j]) {
-						selectedNode = startNodeOptions[i];
-						break;
-					}
-				}
-				if (selectedNode != null) {
-					break;
-				}
-			}
-			if (selectedNode != null) {
-				EditPart part = (EditPart) ((INodeNotifier) selectedNode)
-						.getAdapterFor(EditPart.class);
-				return part;
-			}
-		} else {
-			if (startPart instanceof TextEditPart) {
-				Node[] endNodeOptions = null;
-				endNodeOptions = getSideNodes(endPosition);
-				if (startPart.getModel() == endNodeOptions[0]
-						|| startPart.getModel() == endNodeOptions[1]) {
-					return startPart;
-				}
-			}
-			if (endPart instanceof TextEditPart) {
-				Node[] startNodeOptions = null;
-				startNodeOptions = getSideNodes(startPosition);
-				if (endPart.getModel() == startNodeOptions[0]
-						|| endPart.getModel() == startNodeOptions[1]) {
-					return endPart;
-				}
-			}
-		}
-
-		return null;
-	}
-
-	private Node[] getSideNodes(DesignPosition pos) {
-		Node[] nodes = new Node[2];
-
-		EditPart part = pos.getContainerPart();
-		Node node = (Node) part.getModel();
-		NodeList list = node.getChildNodes();
-
-		if (list.getLength() == pos.getOffset()) {
-			nodes[0] = list.item(pos.getOffset() - 1);
-			nodes[1] = list.item(pos.getOffset() - 1);
-		} else if (pos.getOffset() == 0) {
-			nodes[0] = list.item(0);
-			nodes[1] = list.item(0);
-		} else if (pos.getOffset() > 0 && pos.getOffset() < list.getLength()) {
-			nodes[0] = list.item(pos.getOffset() - 1);
-			nodes[1] = list.item(pos.getOffset());
-		}
-
-		return nodes;
-	}
-
-	private Shell getShell() {
-		if (_editPart != null) {
-			IHTMLGraphicalViewer viewer = (IHTMLGraphicalViewer) _editPart
-					.getViewer();
-			return viewer.getControl().getShell();
-		}
-		return null;
-	}
-
-	private Map<String, ILinkCreator> calAvailableLinkCreator() {
-		Map<String, ILinkCreator> map = new HashMap<String, ILinkCreator>();
-		List<ILinkCreator> linkCreators = ExtensionReader.getAllLinkHandlers();
-		for (ILinkCreator linkCreator : linkCreators) {
-			String identifier = linkCreator.getLinkIdentifier();
-			boolean canExecute = linkCreator.canExecute(_range);
-			if (canExecute) {
-				map.put(identifier, linkCreator);
-			}
-		}
-		return map;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/MakeLinkCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/MakeLinkCommand.java
deleted file mode 100644
index 7c4835f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/MakeLinkCommand.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.link;
-
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class MakeLinkCommand extends DesignerCommand {
-	private String _identifier = null;
-
-	private EditPart _part = null;
-
-	private DesignRange _range = null;
-
-	private ILinkCreator _linkcreator = null;
-
-	private Element _ele = null;
-
-	/**
-	 * @param identifier
-	 * @param viewer
-	 * @param part
-	 * @param range
-	 */
-	public MakeLinkCommand(String identifier, IHTMLGraphicalViewer viewer,
-			EditPart part, DesignRange range) {
-		super(identifier, viewer);
-		setLabel(PDPlugin.getResourceString("MakeLinkCommand.Label.MakeLink"));//$NON-NLS-1$
-		this._identifier = identifier;
-		this._part = part;
-		this._range = range;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#canExecute()
-	 */
-	public boolean canExecute() {
-		List<ILinkCreator> creators = ExtensionReader.getAllLinkHandlers();
-		if (creators != null) {
-			for (ILinkCreator linkCreator : creators) {
-				String identifier = linkCreator.getLinkIdentifier();
-				if (this._identifier.equalsIgnoreCase(identifier)) {
-					this._linkcreator = linkCreator;
-					break;
-				}
-			}
-		}
-		if (this._linkcreator != null) {
-			return this._linkcreator.canExecute(_range);
-		}
-
-		return super.canExecute();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		if (this._linkcreator != null) {
-			Element ele = this._linkcreator.makeLinkElement(this._part,
-					this._range);
-			Node node = (Node) this._part.getModel();
-			Node parent = node.getParentNode();
-			formatNode(parent);
-
-			this._ele = ele;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected ISelection getAfterCommandDesignerSelection() {
-		return toDesignSelection(_ele);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/menuextension/CustomedContextMenuActionGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/menuextension/CustomedContextMenuActionGroup.java
deleted file mode 100644
index b6721fc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/menuextension/CustomedContextMenuActionGroup.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.menuextension;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jst.pagedesigner.extensionpoint.IContextMenuItemContributor;
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.actions.ActionGroup;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class CustomedContextMenuActionGroup extends ActionGroup {
-	private final static String POPUPMENU_EXTENSION_ID = "org.eclipse.jst.pagedesigner.popupMenuContributor"; //$NON-NLS-1$
-
-	private List _contributedMenuListener;
-
-	private Control _parentControl;
-
-	private IStructuredModel _model;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.ActionGroup#fillContextMenu(org.eclipse.jface.action.IMenuManager)
-	 */
-	public void fillContextMenu(IMenuManager menu) {
-		populateContributedMenu(menu);
-	}
-
-	private List getListeners() {
-		if (_contributedMenuListener == null) {
-			_contributedMenuListener = computeContributedMenuListener();
-		}
-		return _contributedMenuListener;
-	}
-
-	private List computeContributedMenuListener() {
-		IExtensionRegistry registry = Platform.getExtensionRegistry();
-		IExtensionPoint extensionPoint = registry
-				.getExtensionPoint(POPUPMENU_EXTENSION_ID);
-		IExtension[] extensions = extensionPoint.getExtensions();
-		List results = new ArrayList();
-		for (int i = 0; i < extensions.length; i++) {
-			IConfigurationElement[] elements = extensions[i]
-					.getConfigurationElements();
-			for (int j = 0; j < elements.length; j++) {
-				try {
-					Object listener = elements[j]
-							.createExecutableExtension("class");//$NON-NLS-1$
-
-					if (listener instanceof IContextMenuItemContributor) {
-						results.add(listener);
-						((IContextMenuItemContributor) listener)
-								.setURI(elements[j].getAttribute("URI"));//$NON-NLS-1$
-					}
-				} catch (CoreException e) {
-					// ignore
-				}
-			}
-		}
-		return results;
-	}
-
-	private void populateContributedMenu(IMenuManager menuMgr) {
-		List list = getListeners();
-		for (int i = 0, n = list.size(); i < n; i++) {
-			IContextMenuItemContributor contributor = (IContextMenuItemContributor) list
-					.get(i);
-			IFile file = StructuredModelUtil.getFileFor(_model);
-			if (file != null && contributor.getURI() != null) {
-				if (JSPUtil.supportTaglib(contributor.getURI(), file)) {
-					contributor.fillContextMenu(menuMgr, getContext()
-							.getSelection(), _model, _parentControl);
-				}
-			}
-		}
-	}
-
-	/**
-	 * @return Returns the model.
-	 */
-	public IStructuredModel getModel() {
-		return _model;
-	}
-
-	/**
-	 * @param model
-	 *            The model to set.
-	 */
-	public void setModel(IStructuredModel model) {
-		this._model = model;
-	}
-
-	/**
-	 * @return Returns the parentControl.
-	 */
-	public Control getParentControl() {
-		return _parentControl;
-	}
-
-	/**
-	 * @param parentControl
-	 *            The parentControl to set.
-	 */
-	public void setParentControl(Control parentControl) {
-		this._parentControl = parentControl;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/menuextension/RunAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/menuextension/RunAction.java
deleted file mode 100644
index 4b58c68..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/menuextension/RunAction.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.menuextension;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.ui.part.EditorPart;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class RunAction extends Action {
-	/**
-	 * constant for debug launch mode
-	 */
-	public static final String LAUNCH_MODE_DEBUG = "debug";
-
-	/**
-	 * constant for run launch mode
-	 */
-	public static final String LAUNCH_MODE_RUN = "run";
-
-	private final String ID = "org.eclipse.jst.pagedesigner.actions.menuextension.RunAction";
-
-	//private EditorPart _editor;
-
-	private String _mode;
-
-	/**
-	 * @param editor
-	 * @param mode
-	 */
-	public RunAction(EditorPart editor, String mode) {
-		//_editor = editor;
-		_mode = mode;
-	}
-
-	public void run() {
-	    PDPlugin.getLogger(getClass()).error("Obsolete.  Shouldn't be used", new Throwable());
-	    // FIXME: we don't support this feature and it seems to depend
-	    // on debugger internal code anyway...
-	    //		List allShortCuts = DebugUIPlugin.getDefault()
-//				.getLaunchConfigurationManager().getLaunchShortcuts();
-//		Iterator iter = allShortCuts.iterator();
-//		LaunchShortcutExtension ext = null;
-//		while (iter.hasNext()) {
-//			ext = (LaunchShortcutExtension) iter.next();
-//			try {
-//				if (ext.getId().equals("org.eclipse.wst.server.launchShortcut")) {
-//					break;
-//				}
-//			} catch (Exception e) {
-//				// not supported
-//			}
-//		}
-//		if (ext != null) {
-//			ext.launch(getSelection(), _mode);
-//		}
-	}
-
-//	private IStructuredSelection getSelection() {
-//		IEditorInput input = ((HTMLEditor) _editor).getEditorInput();
-//		List elements = new ArrayList();
-//		if (input instanceof FileEditorInput) {
-//			elements.add(((FileEditorInput) input).getFile());
-//		}
-//		return new StructuredSelection(elements);
-//	}
-
-	public String getId() {
-		return ID;
-	}
-
-	public String getText() {
-		return _mode.substring(0, 1).toUpperCase()
-				+ _mode.substring(1, _mode.length());
-	}
-
-	private ImageDescriptor getImageDescriptorForModel(String id) {
-		IConfigurationElement[] elements = Platform.getExtensionRegistry()
-				.getConfigurationElementsFor("org.eclipse.ui.actionSets");
-		for (int i = 0; i < elements.length; i++) {
-			if ("actionSet".equals(elements[i].getName())) {
-				IConfigurationElement[] actions = elements[i]
-						.getChildren("action");
-				for (int j = 0; j < actions.length; j++) {
-					if (id.equals(actions[j].getAttribute("id"))) {
-						String iconPath = actions[j].getAttribute("icon");
-						if (iconPath != null) {
-							return AbstractUIPlugin.imageDescriptorFromPlugin(
-									actions[j].getDeclaringExtension()
-											.getContributor().getName(), iconPath);
-						}
-                        return null;
-					}
-				}
-			}
-		}
-		return null;
-	}
-
-	public ImageDescriptor getImageDescriptor() {
-		if (_mode == LAUNCH_MODE_DEBUG) {
-			return getImageDescriptorForModel("org.eclipse.debug.internal.ui.actions.DebugDropDownAction");
-		} else if (_mode == LAUNCH_MODE_RUN) {
-			return getImageDescriptorForModel("org.eclipse.debug.internal.ui.actions.RunDropDownAction");
-		} else {
-			return super.getImageDescriptor();
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/AlignSupport.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/AlignSupport.java
deleted file mode 100644
index aaab7e9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/AlignSupport.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.range;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AlignSupport {
-
-	private static final String[] ALIGN_VALUES = new String[] {
-			PDPlugin.getResourceString("AlignSupport.ActionLabel.Left"), //$NON-NLS-1$
-			PDPlugin.getResourceString("AlignSupport.ActionLabel.Center"), //$NON-NLS-1$
-			PDPlugin.getResourceString("AlignSupport.ActionLabel.Right"), //$NON-NLS-1$
-			PDPlugin.getResourceString("AlignSupport.ActionLabel.Justify") //$NON-NLS-1$ 
-	};
-
-	private static Element[] _nodes = null;
-
-	/**
-	 * @param menu
-	 * @param viewer
-	 */
-	public static void createAlignActions(IMenuManager menu,
-			IHTMLGraphicalViewer viewer) {
-		for (int i = 0; i < ALIGN_VALUES.length; i++) {
-			ParagraphStyleAction action = new ParagraphStyleAction(
-					ALIGN_VALUES[i], _nodes[i], null, IAction.AS_CHECK_BOX);
-			action.setViewer(viewer);
-			menu.add(action);
-		}
-	}
-
-	/**
-	 * @param nodes
-	 */
-	public static void setAlignNodes(Element[] nodes) {
-		if (_nodes != nodes) {
-			_nodes = nodes;
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ChangeStyleAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ChangeStyleAction.java
deleted file mode 100644
index d710e3c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ChangeStyleAction.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.range;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.pagedesigner.commands.range.ApplyStyleCommand;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.DOMRangeHelper;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class ChangeStyleAction extends DesignerToolBarAction {
-	private final String _expectedTag;
-
-	/**
-	 * @param text
-	 * @param name 
-	 * @param image
-	 * @param style 
-	 */
-	public ChangeStyleAction(String text, String name, ImageDescriptor image,
-			int style) {
-		super(text, style);
-		_expectedTag = name;
-		this.setImageDescriptor(image);
-	}
-
-	/**
-	 * @param text
-	 * @param name
-	 * @param enabled
-	 * @param disabled
-	 * @param style
-	 */
-	public ChangeStyleAction(String text, String name, ImageDescriptor enabled,
-			ImageDescriptor disabled, int style) {
-		super(text, style);
-		_expectedTag = name;
-		setImageDescriptor(enabled);
-		setDisabledImageDescriptor(disabled);
-	}
-
-
-	protected boolean isApplied(DOMRange range) {
-		if (range == null) {
-			return false;
-		}
-
-		boolean ordered = range.isOrdered();
-		IDOMPosition start = ordered ? range.getStartPosition() : range
-				.getEndPosition();
-		IDOMPosition end = ordered ? range.getEndPosition() : range
-				.getStartPosition();
-		Node startnode = start.getContainerNode();
-		Node endnode = end.getContainerNode();
-		if (!EditModelQuery.hasAncestor(startnode, _expectedTag, true)) {
-			return false;
-		}
-		for (Node node = startnode; node != endnode; node = EditModelQuery
-				.getInstance().getNextLeafNeighbor(node)) {
-			if (!EditModelQuery.hasAncestor(node, _expectedTag, true)) {
-				return false;
-			}
-		}
-		if (!EditModelQuery.hasAncestor(endnode, _expectedTag, true)) {
-			return false;
-		}
-		return true;
-	}
-
-	/**
-	 * @return the expected tag
-	 */
-	protected String getExpectedTag() {
-		return _expectedTag;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.DesignerToolBarAction#getCommand()
-	 */
-	protected Command getCommand() {
-		DesignRange range = getViewer().getRangeSelection();
-		DOMRange dRange = DOMRangeHelper.toDOMRange(range);
-		Command command;
-		if (isApplied(dRange)) {
-			// command = new UnapplyStyleCommand(getViewer(), _expectedTag,
-			// null, null);
-			// since the un-applystyle is not implemented yet,we do nothing
-			// here.
-			command = null;
-			this.setChecked(true);
-		} else {
-			command = new ApplyStyleCommand(getViewer(), _expectedTag, null,
-					null);
-		}
-		return command;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.texteditor.IUpdate#update()
-	 */
-	public void update() {
-		if (canRun(getViewer())) {
-			setEnabled(true);
-		} else {
-			setEnabled(false);
-		}
-		updateStatus();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.actions.range.DesignerToolBarAction#updateStatus()
-	 */
-	public void updateStatus() {
-		IHTMLGraphicalViewer viewer = getViewer();
-		if (viewer != null && viewer.isInRangeMode()
-				&& viewer.getModel().getDocument().hasChildNodes()) {
-			DesignRange range = getViewer().getRangeSelection();
-			if (range != null && range.isValid()) {
-				DOMRange domRange = null;
-				domRange = new DOMRange(DOMPositionHelper.toDOMPosition(range
-						.getStartPosition()), DOMPositionHelper
-						.toDOMPosition(range.getEndPosition()));
-				if (isApplied(domRange)) {
-					this.setChecked(true);
-				} else {
-					this.setChecked(false);
-				}
-				return;
-			}
-		}
-		this.setChecked(false);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.actions.range.DesignerToolBarAction#canRun(org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer)
-	 */
-	protected boolean canRun(IHTMLGraphicalViewer viewer) {
-		if (viewer != null && viewer.isInRangeMode()
-				&& viewer.getModel().getDocument().hasChildNodes()) {
-			DesignRange range = viewer.getRangeSelection();
-			if (range != null && range.isValid()) {
-				DesignPosition startPos = range.getStartPosition();
-				DesignPosition endPos = range.getEndPosition();
-				if (startPos != endPos) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/DesignerToolBarAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/DesignerToolBarAction.java
deleted file mode 100644
index 3e241e3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/DesignerToolBarAction.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.range;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.ui.texteditor.IUpdate;
-
-/**
- * @author mengbo
- */
-public abstract class DesignerToolBarAction extends Action implements IUpdate,
-		ISelectionChangedListener {
-	private IHTMLGraphicalViewer _viewer;
-
-	/**
-	 * @param text
-	 * @param style
-	 */
-	public DesignerToolBarAction(String text, int style) {
-		super(text, style);
-	}
-
-	/**
-	 * @param text
-	 * @param image
-	 */
-	public DesignerToolBarAction(String text, ImageDescriptor image) {
-		super(text, image);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		update();
-	}
-
-	/**
-	 * 
-	 */
-	public void update() {
-		if (canRun(this._viewer)) {
-			setEnabled(true);
-			updateStatus();
-		} else {
-			setEnabled(false);
-		}
-	}
-
-	/**
-	 * Update the status
-	 */
-	protected void updateStatus() {
-		DesignRange range = _viewer.getRangeSelection();
-		DOMRange domRange = null;
-		if (range != null) {
-			domRange = new DOMRange(DOMPositionHelper.toDOMPosition(range
-					.getStartPosition()), DOMPositionHelper.toDOMPosition(range
-					.getEndPosition()));
-			if (isApplied(domRange)) {
-				this.setChecked(true);
-			} else {
-				this.setChecked(false);
-			}
-		}
-	}
-
-	/**
-	 * @param range
-	 * @return ??
-	 */
-	protected abstract boolean isApplied(DOMRange range);
-
-	/**
-	 * @param viewer
-	 * @return true if this action can run
-	 */
-	protected boolean canRun(IHTMLGraphicalViewer viewer) {
-		if (viewer != null && viewer.isInRangeMode()
-				&& viewer.getModel().getDocument().hasChildNodes()) {
-			DesignRange range = viewer.getRangeSelection();
-			if (range != null && range.isValid()) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @param viewer
-	 */
-	public void setViewer(IHTMLGraphicalViewer viewer) {
-		if (viewer == _viewer) {
-			return;
-		}
-        
-        if (_viewer != null) {
-        	_viewer.removeSelectionChangedListener(this);
-        }
-        _viewer = viewer;
-        if (_viewer != null) {
-        	_viewer.addSelectionChangedListener(this);
-        }
-        update();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		// Assert.isTrue(_viewer != null && _viewer.isInRangeMode());
-		DesignRange range = _viewer.getRangeSelection();
-		if (range == null || !range.isValid()) {
-			return;
-		}
-		Command command = getCommand();
-		if (command != null) {
-			command.execute();
-		}
-	}
-
-	/**
-	 * @return the command for this action or null
-	 */
-	protected abstract Command getCommand();
-
-	/**
-	 * @return Returns the _viewer.
-	 */
-	public IHTMLGraphicalViewer getViewer() {
-		return _viewer;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/HTagsInsertGroupAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/HTagsInsertGroupAction.java
deleted file mode 100644
index 28352ca..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/HTagsInsertGroupAction.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.range;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuCreator;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Menu;
-
-/**
- * @author mengbo
- */
-public class HTagsInsertGroupAction extends DesignerToolBarAction implements
-		IMenuCreator {
-	private Menu _menu;
-
-	private static Map _actions = new HashMap();
-
-	/**
-	 * @param image
-	 * @param style
-	 */
-	public HTagsInsertGroupAction(ImageDescriptor image, int style) {
-		super(
-				PDPlugin
-						.getResourceString("HTagsInsertGroupAction.ActionLabel.Hx"), IAction.AS_DROP_DOWN_MENU); //$NON-NLS-1$
-		this.setImageDescriptor(image);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Control)
-	 */
-	public Menu getMenu(Control parent) {
-		if (_menu != null) {
-			_menu.dispose();
-		}
-		_menu = new Menu(parent);
-		addActionToMenu(_menu, IHTMLConstants.TAG_H1);
-		addActionToMenu(_menu, IHTMLConstants.TAG_H2);
-		addActionToMenu(_menu, IHTMLConstants.TAG_H3);
-		addActionToMenu(_menu, IHTMLConstants.TAG_H4);
-		addActionToMenu(_menu, IHTMLConstants.TAG_H5);
-		addActionToMenu(_menu, IHTMLConstants.TAG_H6);
-
-		return _menu;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IMenuCreator#getMenu(org.eclipse.swt.widgets.Menu)
-	 */
-	public Menu getMenu(Menu parent) {
-		return null;
-	}
-
-	/**
-	 * @param parent
-	 * @param name
-	 */
-	protected void addActionToMenu(Menu parent, String name) {
-		DesignerToolBarAction action;
-		if (_actions.get(name) == null) {
-			action = new ParagraphStyleAction(name, name, null,
-					IAction.AS_CHECK_BOX);
-			_actions.put(name, action);
-		} else {
-			action = (ParagraphStyleAction) _actions.get(name);
-		}
-		action.setViewer(getViewer());
-		action.update();
-		ActionContributionItem item = new ActionContributionItem(action);
-		item.fill(parent, -1);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IMenuCreator#dispose()
-	 */
-	public void dispose() {
-		if (_menu != null) {
-			_menu.dispose();
-			_menu = null;
-			_actions.clear();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#getMenuCreator()
-	 */
-	public IMenuCreator getMenuCreator() {
-		return this;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editors.actions.DesignerToolBarAction#canRun(org.eclipse.jst.pagedesigner.dom.DOMRange)
-	 */
-	protected boolean isApplied(DOMRange range) {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		return;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.DesignerToolBarAction#getCommand()
-	 */
-	protected Command getCommand() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.DesignerToolBarAction#setViewer(org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer)
-	 */
-	public void setViewer(IHTMLGraphicalViewer viewer) {
-		if (_actions != null && _actions.size() > 0) {
-			Collection values = _actions.values();
-			Iterator iterator = values.iterator();
-			while (iterator.hasNext()) {
-				DesignerToolBarAction action = (DesignerToolBarAction) iterator
-						.next();
-				action.setViewer(viewer);
-			}
-		}
-		super.setViewer(viewer);
-	}
-
-	/*
-	 * The group will delegate update to its children.
-	 */
-	public void updateStatus() {
-		if (_actions != null && _actions.size() > 0) {
-			Collection values = _actions.values();
-			Iterator iterator = values.iterator();
-			while (iterator.hasNext()) {
-				DesignerToolBarAction action = (DesignerToolBarAction) iterator
-						.next();
-				action.updateStatus();
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/InsertTagChangeStyleAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/InsertTagChangeStyleAction.java
deleted file mode 100644
index 7624a2b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/InsertTagChangeStyleAction.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.range;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.editors.actions.ChangeStyleAction;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class InsertTagChangeStyleAction extends ChangeStyleAction {
-	/**
-	 * @param text
-	 * @param tag 
-	 * @param image
-	 * @param style
-	 */
-	public InsertTagChangeStyleAction(String text, String tag,
-			ImageDescriptor image, int style) {
-		super(text, tag, image, style);
-	}
-
-	protected String getExpectedCSSProperty() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	protected String getExpectedCSSPropertyValue() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-    protected void updateState() 
-	{
-        setEnabled(getDesignRange());
-    }
-
-	/**
-	 * @param range
-	 */
-	public void setEnabled(DesignRange range) {
-		DOMRange domRange = null;
-		// We didn't deal with undo, so only enable is set.
-		domRange = new DOMRange(DOMPositionHelper.toDOMPosition(range
-				.getStartPosition()), DOMPositionHelper.toDOMPosition(range
-				.getEndPosition()));
-		if (canRun(domRange)) {
-			this.setEnabled(true);
-		} else {
-			this.setEnabled(false);
-		}
-	}
-
-	private boolean canRun(DOMRange range) {
-		if (range != null) {
-			if (EditModelQuery.isSame(range)) {
-				return false;
-			}
-			boolean ordered = range.isOrdered();
-			IDOMPosition start = ordered ? range.getStartPosition() : range
-					.getEndPosition();
-			IDOMPosition end = ordered ? range.getEndPosition() : range
-					.getStartPosition();
-			Node common = null;
-			common = EditModelQuery.getInstance().getCommonAncestor(start, end);
-			if (getExpectedTag() == null
-					|| EditModelQuery.hasAncestor(common, getExpectedTag(),
-							true)) {
-				return false;
-			}
-            return true;
-		}
-        return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/NoneParagraphStyleAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/NoneParagraphStyleAction.java
deleted file mode 100644
index 6ca6c0b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/NoneParagraphStyleAction.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.range;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.pagedesigner.commands.range.Paragraph;
-import org.eclipse.jst.pagedesigner.commands.range.ParagraphFinder;
-import org.eclipse.jst.pagedesigner.commands.range.ParagraphUnapplyStyleCommand;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class NoneParagraphStyleAction extends ParagraphStyleAction {
-
-	private String[] _applyingTags;
-
-	/**
-	 * @param text
-	 * @param tags
-	 * @param image
-	 * @param style
-	 */
-	public NoneParagraphStyleAction(String text, String[] tags,
-			ImageDescriptor image, int style) {
-		super(text, "", image, style);
-		_applyingTags = tags;
-	}
-
-	/**
-	 * @param text
-	 * @param node
-	 * @param image
-	 * @param style
-	 */
-	public NoneParagraphStyleAction(String text, Node node,
-			ImageDescriptor image, int style) {
-		super(text, node, image, style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editors.actions.DesignerToolBarAction#isApplied(org.eclipse.jst.pagedesigner.dom.DOMRange)
-	 */
-	protected boolean isApplied(DOMRange range) {
-		if (range != null) {
-			boolean ordered = range.isOrdered();
-			IDOMPosition start = ordered ? range.getStartPosition() : range
-					.getEndPosition();
-			IDOMPosition end = ordered ? range.getEndPosition() : range
-					.getStartPosition();
-			Node common = null;
-			if (EditModelQuery.isSame(range)) {
-				ParagraphFinder finder = new ParagraphFinder(start);
-				Paragraph p = finder.getParagraph(start);
-				common = p.getLowestContainer();
-			} else {
-				common = EditModelQuery.getInstance().getCommonAncestor(start,
-						end);
-			}
-			// the lowest common block parent is the container to apply style.
-			if (EditModelQuery.hasAncestor(common, _applyingTags, true)) {
-				return false;
-			}
-            return true;
-		}
-        return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.DesignerToolBarAction#getCommand()
-	 */
-	protected Command getCommand() {
-		ParagraphUnapplyStyleCommand command = new ParagraphUnapplyStyleCommand(
-				getViewer(), _applyingTags, null, null);
-		return command;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/NoneStyleAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/NoneStyleAction.java
deleted file mode 100644
index ce5e97e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/NoneStyleAction.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.range;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.pagedesigner.commands.range.UnapplyStyleCommand;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class NoneStyleAction extends ChangeStyleAction {
-	private String[] _applyingStyleTags;
-
-	/**
-	 * @param text
-	 * @param names
-	 * @param image
-	 * @param style
-	 */
-	public NoneStyleAction(String text, String[] names, ImageDescriptor image,
-			int style) {
-		super(text, "", image, style);
-		_applyingStyleTags = names;
-	}
-
-	protected boolean isApplied(DOMRange range) {
-		if (range != null) {
-			boolean ordered = range.isOrdered();
-			IDOMPosition start = ordered ? range.getStartPosition() : range
-					.getEndPosition();
-			IDOMPosition end = ordered ? range.getEndPosition() : range
-					.getStartPosition();
-			Node common = null;
-			common = EditModelQuery.getInstance().getCommonAncestor(start, end);
-			if (EditModelQuery.hasAncestor(common, _applyingStyleTags, true)) {
-				return false;
-			}
-            return true;
-		}
-        return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.DesignerToolBarAction#getCommand()
-	 */
-	protected Command getCommand() {
-		UnapplyStyleCommand command = new UnapplyStyleCommand(getViewer(),
-				getExpectedTag(), null, null);
-		return command;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ParagraphAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ParagraphAction.java
deleted file mode 100644
index d2f13d0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ParagraphAction.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.range;
-
-import org.eclipse.jface.action.Action;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ParagraphAction extends Action {
-	/**
-	 * @param text
-	 * @param htmlTag
-	 */
-	public ParagraphAction(String text, String htmlTag) {
-		super(text);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ParagraphStyleAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ParagraphStyleAction.java
deleted file mode 100644
index 5cefa47..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ParagraphStyleAction.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.range;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.pagedesigner.commands.range.Paragraph;
-import org.eclipse.jst.pagedesigner.commands.range.ParagraphApplyStyleCommand;
-import org.eclipse.jst.pagedesigner.commands.range.ParagraphFinder;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class ParagraphStyleAction extends DesignerToolBarAction {
-	private String _tagName;
-
-	private Node _applyingNode;
-
-	/**
-	 * @param text
-	 * @param name
-	 * @param image
-	 * @param style
-	 */
-	public ParagraphStyleAction(String text, String name,
-			ImageDescriptor image, int style) {
-		super(text, style);
-		_tagName = name;
-		setImageDescriptor(image);
-	}
-
-	/**
-	 * @param text
-	 * @param node
-	 * @param image
-	 * @param style
-	 */
-	public ParagraphStyleAction(String text, Node node, ImageDescriptor image,
-			int style) {
-		super(text, style);
-		_applyingNode = node;
-		setImageDescriptor(image);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editors.actions.DesignerToolBarAction#isApplied(org.eclipse.jst.pagedesigner.dom.DOMRange)
-	 */
-	protected boolean isApplied(DOMRange range) {
-		Assert.isTrue(getExpectedTag() != null);
-		if (range != null) {
-			boolean ordered = range.isOrdered();
-			IDOMPosition start = ordered ? range.getStartPosition() : range
-					.getEndPosition();
-			IDOMPosition end = ordered ? range.getEndPosition() : range
-					.getStartPosition();
-			Node common = null;
-			if (EditModelQuery.isSame(range)) {
-				ParagraphFinder finder = new ParagraphFinder(start);
-				Paragraph p = finder.getParagraph(start);
-				common = p.getLowestContainer();
-			} else {
-				common = EditModelQuery.getInstance().getCommonAncestor(start,
-						end);
-			}
-			// the lowest common block parent is the container to apply style.
-			if (containsTag(common)) {
-				return true;
-			}
-            return false;
-		}
-        return false;
-	}
-
-	/**
-	 * @param common
-	 * @return ??? 
-	 */
-	protected boolean containsTag(Node common) {
-		// the lowest common block parent is the container to apply style.
-		if (_applyingNode == null) {
-			return common.getNodeName() != null
-					&& getExpectedTag().equalsIgnoreCase(
-							common.getNodeName().toLowerCase());
-		}
-        
-        String align = ((Element) _applyingNode).getAttribute("align");
-        if (!(common instanceof Element)) {
-        	return false;
-        }
-        String cAlign = ((Element) common).getAttribute("align");
-        if (align == null || cAlign == null) {
-        	return false;
-        }
-        if (align.equals(cAlign)) {
-        	return true;
-        }
-        return false;
-	}
-
-	/**
-	 * @return Returns the _expectedTag.
-	 */
-	public String getExpectedTag() {
-		if (_tagName == null) {
-			return _applyingNode.getNodeName().toLowerCase();
-		}
-        return _tagName.toLowerCase();
-	}
-
-	/**
-	 * @return Returns the _applyingNode.
-	 */
-	public Element getApplyingNode() {
-		if (_applyingNode != null) {
-			return (Element) _applyingNode;
-		}
-        return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.DesignerToolBarAction#getCommand()
-	 */
-	protected Command getCommand() {
-		ParagraphApplyStyleCommand command = null;
-		if (getApplyingNode() != null) {
-			command = new ParagraphApplyStyleCommand(getViewer(),
-					getApplyingNode(), null, null);
-		} else {
-			command = new ParagraphApplyStyleCommand(getViewer(),
-					getExpectedTag(), null, null);
-		}
-		return command;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ParagraphSupport.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ParagraphSupport.java
deleted file mode 100644
index 2d03548..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ParagraphSupport.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.range;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ParagraphSupport {
-	static final String[] labels = new String[] {
-			PDPlugin.getResourceString("ParagraphSupport.CommandLabel.None"), //$NON-NLS-1$
-			PDPlugin
-					.getResourceString("ParagraphSupport.CommandLabel.Paragraph"), //$NON-NLS-1$
-			PDPlugin
-					.getResourceString("ParagraphSupport.CommandLabel.Heading1"), //$NON-NLS-1$
-			PDPlugin
-					.getResourceString("ParagraphSupport.CommandLabel.Heading2"), //$NON-NLS-1$
-			PDPlugin
-					.getResourceString("ParagraphSupport.CommandLabel.Heading3"), //$NON-NLS-1$ 
-			PDPlugin
-					.getResourceString("ParagraphSupport.CommandLabel.Heading4"),//$NON-NLS-1$ 
-			PDPlugin
-					.getResourceString("ParagraphSupport.CommandLabel.Heading5"), //$NON-NLS-1$ 
-			PDPlugin
-					.getResourceString("ParagraphSupport.CommandLabel.Heading6"), //$NON-NLS-1$ 
-			PDPlugin
-					.getResourceString("ParagraphSupport.CommandLabel.Preformated") //$NON-NLS-1$ 
-	};
-
-	static final String[] tags = new String[] {
-			null,
-			PDPlugin.getResourceString("ParagraphSupport.CommandLabel.P"), PDPlugin.getResourceString("ParagraphSupport.CommandLabel.H1"), PDPlugin.getResourceString("ParagraphSupport.CommandLabel.H2"), PDPlugin.getResourceString("ParagraphSupport.CommandLabel.H3"), PDPlugin.getResourceString("ParagraphSupport.CommandLabel.H4"), PDPlugin.getResourceString("ParagraphSupport.CommandLabel.H5"), PDPlugin.getResourceString("ParagraphSupport.CommandLabel.H6"), PDPlugin.getResourceString("ParagraphSupport.CommandLabel.PRE") //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
-	};
-
-	/**
-	 * @param man
-	 * @param range
-	 * @param viewer
-	 */
-	public static void createParagraphActions(IMenuManager man,
-			DesignRange range, IHTMLGraphicalViewer viewer) {
-		ParagraphStyleAction action = new NoneParagraphStyleAction(
-				PDPlugin
-						.getResourceString("ParagraphSupport.CommandLabel.None"), tags, null, IAction.AS_CHECK_BOX); //$NON-NLS-1$
-		action.setViewer(viewer);
-		action.update();
-		man.add(action);
-		for (int i = 1; i < labels.length; i++) {
-			action = new ParagraphStyleAction(labels[i], tags[i], null,
-					IAction.AS_CHECK_BOX);
-			action.setViewer(viewer);
-			action.update();
-			man.add(action);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/RangeActionGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/RangeActionGroup.java
deleted file mode 100644
index ac453f9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/RangeActionGroup.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.range;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.actions.link.MakeLinkAction;
-import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants;
-import org.eclipse.jst.pagedesigner.editors.actions.DesignActionBarFactory;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.ui.actions.ActionGroup;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class RangeActionGroup extends ActionGroup {
-    // TODO: what is this?  a separator?
-	private static final Action action = new Action() {
-        // Action is abstract but has no abstract methods
-        // so create a default empty action that does nothing
-	};
-
-	/**
-	 * 
-	 */
-	public RangeActionGroup() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.ActionGroup#fillContextMenu(org.eclipse.jface.action.IMenuManager)
-	 */
-	public void fillContextMenu(IMenuManager contextMenu) 
-    {
-		DesignRange selection = fixUpSelection(getContext().getSelection());
-		if (selection == null) {
-			return;
-		}
-        IContributionItem styleSubMenuItem = 
-            contextMenu.find(PageDesignerActionConstants.STYLE_SUBMENU_ID);
-        
-        if (styleSubMenuItem instanceof IMenuManager)
-        {
-            final IMenuManager subMenu = (IMenuManager) styleSubMenuItem;
-    		if (getContext().getInput() instanceof IHTMLGraphicalViewer) {
-    			addParagraphFormatMenu(subMenu, selection,
-    					(IHTMLGraphicalViewer) getContext().getInput());
-    			addHorizontalAlignMenu(subMenu, selection,
-    					(IHTMLGraphicalViewer) getContext().getInput());
-    			addTextStyleMenu(subMenu, (IHTMLGraphicalViewer) getContext()
-    					.getInput());
-    		}
-            // TODO: the (commented out) copy of this method does nothing
-    		//addListModeMenu(menu, selection);
-    
-    		// TODO: the (commented out) copy of this method does nothing
-            //addTextFontMenu(menu, selection);
-    
-    		addLinkMenu(subMenu, selection);
-        }
-    }
-
-	/**
-	 * @param selection
-	 * @return
-	 */
-	private DesignRange fixUpSelection(ISelection selection) {
-		if (selection instanceof DesignRange) {
-			return (DesignRange) selection;
-		}
-        return null;
-	}
-
-	private void addLinkMenu(IMenuManager menu, final DesignRange selection) {
-		Action action1 = new MakeLinkAction(selection);
-		menu.appendToGroup(PageDesignerActionConstants.GROUP_STYLE, action1);
-	}
-
-	private void addTextStyleMenu(IMenuManager menu,
-			final IHTMLGraphicalViewer viewer) {
-		final IMenuManager submenu = new MenuManager(PDPlugin
-				.getResourceString("ActionGroup.Submenu.TextStyle"));//$NON-NLS-1$
-		submenu.add(action);
-
-		submenu.setRemoveAllWhenShown(true);
-		submenu.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager manager) {
-				DesignerToolBarAction action1 = null;
-				action1 = DesignActionBarFactory.getInstance().getStyleAction(
-						IHTMLConstants.TAG_U);
-				action1.setViewer(viewer);
-				submenu.add(action1);
-
-				action1 = DesignActionBarFactory.getInstance().getStyleAction(
-						IHTMLConstants.TAG_B);
-				action1.setViewer(viewer);
-				submenu.add(action1);
-
-				action1 = DesignActionBarFactory.getInstance().getStyleAction(
-						IHTMLConstants.TAG_I);
-				action1.setViewer(viewer);
-				submenu.add(action1);
-
-				action1 = DesignActionBarFactory.getInstance().getStyleAction(
-						IHTMLConstants.TAG_SMALL);
-				action1.setViewer(viewer);
-				submenu.add(action1);
-
-				action1 = DesignActionBarFactory.getInstance().getStyleAction(
-						IHTMLConstants.TAG_BIG);
-				action1.setViewer(viewer);
-				submenu.add(action1);
-
-			}
-		});
-		menu.appendToGroup(PageDesignerActionConstants.GROUP_STYLE, submenu);
-	}
-
-	/**
-	 * @param menu
-	 * @param selection
-	 */
-//	private void addTextFontMenu(IMenuManager menu, DesignRange selection) {
-//	    //
-//	}
-
-	/**
-	 * @param menu
-	 * @param selection
-	 */
-	private void addHorizontalAlignMenu(IMenuManager menu,
-			final DesignRange selection, final IHTMLGraphicalViewer viewer) {
-		// we have to initialize align nodes here for some refresh problem
-		Element[] alignNodes = new Element[4];
-		final String[] alignValues = new String[] { "left", "center", "right",
-				"justify" };
-		Document document = viewer.getModel().getDocument();
-		for (int i = 0; i < 4; i++) {
-			Element node = document.createElement(IHTMLConstants.TAG_P);
-			node.setAttribute(IHTMLConstants.ATTR_ALIGN, alignValues[i]);
-			alignNodes[i] = node;
-		}
-		AlignSupport.setAlignNodes(alignNodes);
-
-		final IMenuManager submenu = new MenuManager(PDPlugin
-				.getResourceString("ActionGroup.Submenu.Align"));//$NON-NLS-1$
-		submenu.add(action);
-		submenu.setRemoveAllWhenShown(true);
-		submenu.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager manager) {
-				AlignSupport.createAlignActions(submenu, viewer);
-			}
-		});
-		menu.appendToGroup(PageDesignerActionConstants.GROUP_STYLE, submenu);
-
-	}
-
-	/**
-	 * @param menu
-	 * @param selection
-	 */
-//	private void addListModeMenu(IMenuManager menu, DesignRange selection) {
-//	}
-
-	/**
-	 * @param menu
-	 * @param selection
-	 */
-	private void addParagraphFormatMenu(IMenuManager menu,
-			final DesignRange selection, final IHTMLGraphicalViewer viewer) {
-		final IMenuManager submenu = new MenuManager(PDPlugin
-				.getResourceString("ActionGroup.Submenu.ParagraphFormat"));//$NON-NLS-1$
-		submenu.add(action);
-		// Add the submenu.
-
-		submenu.addMenuListener(new IMenuListener() {
-
-			public void menuAboutToShow(IMenuManager manager) {
-				submenu.removeAll();
-				ParagraphSupport.createParagraphActions(submenu, selection,
-						viewer);
-			}
-		});
-		menu.appendToGroup(PageDesignerActionConstants.GROUP_STYLE, submenu);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/RangeStyleAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/RangeStyleAction.java
deleted file mode 100644
index 2346403..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/RangeStyleAction.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.range;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class RangeStyleAction extends Action {
-	/**
-	 * @param text
-	 * @param range 
-	 * @param htmlTag 
-	 * @param cssProperty 
-	 * @param cssValue 
-	 */
-	public RangeStyleAction(String text, DesignRange range, String htmlTag,
-			String cssProperty, String cssValue) {
-		super(text);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		if (isChecked()) {
-			// un-apply the style here
-		} else {
-			// apply the style here.
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/RangeStyleSupport.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/RangeStyleSupport.java
deleted file mode 100644
index 60f2364..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/RangeStyleSupport.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.range;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class RangeStyleSupport {
-	private static final String[] ActionLabel = new String[] {
-			PDPlugin.getResourceString("RangeStyleSupport.ActionLabel.Bold"),//$NON-NLS-1$
-			PDPlugin.getResourceString("RangeStyleSupport.ActionLabel.Italic"),//$NON-NLS-1$
-			PDPlugin
-					.getResourceString("RangeStyleSupport.ActionLabel.Underline"), }; //$NON-NLS-1$
-
-	private static final String[] HtmlTag = new String[] { "STRONG", "I", "U", }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-	private static final String[] CSSProperty = new String[] {
-			"font-weight", "font-style", "text-decoration", }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-
-	private static final String[] CSSValue = new String[] { "bolder", "italic",
-			"underline", };
-
-	/**
-	 * @param menu
-	 * @param range
-	 */
-	public static void createRangeStyleActions(IMenuManager menu,
-			DesignRange range) {
-		for (int i = 0; i < ActionLabel.length; i++) {
-			RangeStyleAction action = new RangeStyleAction(ActionLabel[i],
-					range, HtmlTag[i], CSSProperty[i], CSSValue[i]);
-
-			menu.add(action);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/BorderStyleAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/BorderStyleAction.java
deleted file mode 100644
index 1723662..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/BorderStyleAction.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.single;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class BorderStyleAction extends Action {
-
-	/**
-	 * @param stylevalue
-	 * @param ele
-	 * @param text
-	 * 
-	 */
-	public BorderStyleAction(String text, IDOMElement ele, String stylevalue) {
-		super(text);
-		// TODO Auto-generated constructor stub
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/ChangeAttributeAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/ChangeAttributeAction.java
deleted file mode 100644
index 7595da6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/ChangeAttributeAction.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.single;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeAttributeCommand;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ChangeAttributeAction extends Action {
-	IDOMElement _ele;
-
-	String _attrValue;
-
-	private String _attrName;
-
-	/**
-	 * @param label 
-	 * @param ele
-	 * @param attrName 
-	 * @param attrValue 
-	 */
-	public ChangeAttributeAction(String label, IDOMElement ele,
-			String attrName, String attrValue) {
-		super(label);
-		this._ele = ele;
-		this._attrName = attrName;
-		this._attrValue = attrValue;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		if (this.isChecked()) {
-			return;
-		}
-
-		ChangeAttributeCommand c = new ChangeAttributeCommand(
-				PDPlugin
-						.getResourceString("ChangeAttributeAction.CommandLabel.ChangeStyleClass"), _ele, _attrName, _attrValue); //$NON-NLS-1$
-		c.execute();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/ChangeStyleAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/ChangeStyleAction.java
deleted file mode 100644
index dd2fe69..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/ChangeStyleAction.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.single;
-
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.preference.PreferenceManager;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeStyleCommand;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.ui.dialogs.StyleDialog;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSStyleDeclaration;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.css.ElementCSSInlineStyle;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ChangeStyleAction extends Action {
-	private static final String MY_TEXT = PDPlugin
-			.getResourceString("ChangeStyleAction.Text");
-
-	private ElementEditPart _editPart;
-
-	private IDOMElement _element;
-
-	/**
-	 * @param part
-	 * @param ele
-	 */
-	public ChangeStyleAction(ElementEditPart part, IDOMElement ele) {
-		super(MY_TEXT);
-		this._editPart = part;
-		this._element = ele;
-	}
-
-	public void run() {
-		ICSSStyleDeclaration styleDeclaration = (ICSSStyleDeclaration) ((ElementCSSInlineStyle) this._element)
-				.getStyle();
-		PreferenceManager manager = new PreferenceManager();
-		EditPartViewer viewer = this._editPart.getViewer();
-		Shell shell = viewer.getControl().getShell();
-
-		CSSPropertyContext context = new CSSPropertyContext(styleDeclaration);
-		StyleDialog dialog = new StyleDialog(shell, manager, _element, context);
-		if (dialog.open() == Window.OK) {
-			if (context.isModified()) {
-				ChangeStyleCommand c = new ChangeStyleCommand(_element, context);
-				c.execute();
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/ChangeStylePropertyAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/ChangeStylePropertyAction.java
deleted file mode 100644
index 1fef76f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/ChangeStylePropertyAction.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.single;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeStyleCommand;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ChangeStylePropertyAction extends Action {
-	private IDOMElement _ele;
-
-	private String _cssProperty;
-
-	private String _cssValue;
-
-	/**
-	 * @param text
-	 * @param ele 
-	 * @param cssProperty 
-	 * @param cssValue 
-	 */
-	public ChangeStylePropertyAction(String text, IDOMElement ele,
-			String cssProperty, String cssValue) {
-		super(text);
-		this._ele = ele;
-		this._cssProperty = cssProperty;
-		this._cssValue = cssValue;
-	}
-
-	public void run() {
-		if (isChecked()) {
-			return;
-		}
-
-		Map map = new HashMap();
-		map.put(_cssProperty, _cssValue);
-		ChangeStyleCommand command = new ChangeStyleCommand(_ele, map);
-		command.execute();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/ColorSupport.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/ColorSupport.java
deleted file mode 100644
index d253dd1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/ColorSupport.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.single;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dom.DOMStyleUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class ColorSupport {
-	static final String[] COLOR_VALUES = new String[] {
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Aqua"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Black"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Blue"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Fuchsia"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Gray"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Green"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Lime"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Maroon"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Navy"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Olive"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Orange"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Purple"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Red"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Silver"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Teal"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.White"), //$NON-NLS-1$
-			PDPlugin.getResourceString("ColorSupport.CommandLabel.Yellow") //$NON-NLS-1$
-	};
-
-	/**
-	 * 
-	 * @param menu
-	 * @param ele
-	 * @param cssProperty
-	 *            will be "color" or "background-color"
-	 */
-	static void createColorActions(IMenuManager menu, IDOMElement ele,
-			String cssProperty) {
-		boolean needAdditional = true;
-		String currentValue = DOMStyleUtil.getInlineStyleProperty(ele,
-				cssProperty);
-		ChangeStylePropertyAction defaultAction = new ChangeStylePropertyAction(
-				PDPlugin.getResourceString("ColorSupport.CommandLabel.Default"), ele, cssProperty, null); //$NON-NLS-1$
-		if (currentValue == null || currentValue.length() == 0) {
-			defaultAction.setChecked(true);
-			needAdditional = false;
-		}
-		menu.add(defaultAction);
-		menu.add(new Separator());
-		for (int i = 0; i < COLOR_VALUES.length; i++) {
-			ChangeStylePropertyAction action = new ChangeStylePropertyAction(
-					COLOR_VALUES[i], ele, cssProperty, COLOR_VALUES[i]);
-			if (COLOR_VALUES[i].equalsIgnoreCase(currentValue)) {
-				action.setChecked(true);
-				needAdditional = false;
-			}
-			menu.add(action);
-		}
-
-		if (needAdditional) {
-			ChangeStylePropertyAction action = new ChangeStylePropertyAction(
-					currentValue, ele, cssProperty, currentValue);
-			action.setChecked(true);
-			menu.add(action);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SelectEditPartAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SelectEditPartAction.java
deleted file mode 100644
index 2cb2299..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SelectEditPartAction.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.single;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.viewers.StructuredSelection;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public abstract class SelectEditPartAction extends Action {
-    
-    /**
-     * @param text
-     * @param forThisPart
-     * @return a convience object when the edit part that needs selection
-     * is already known when the action is constructed
-     */
-    public static SelectEditPartAction create(final String text, final EditPart forThisPart)
-    {
-        return new SelectEditPartAction(text)
-        {
-            protected EditPart getNewSelection() {
-                return forThisPart;
-            }
-        };
-    }
-
-	/**
-	 * @param text
-	 */
-	protected SelectEditPartAction(String text) {
-		super(text);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-        final EditPart newSelection = getNewSelection();
-        newSelection.getViewer().setSelection(new StructuredSelection(newSelection));
-	}
-    
-    /**
-     * @return the EditPart onto which selection should be applied.
-     */
-    protected abstract EditPart getNewSelection();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SelectNodeAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SelectNodeAction.java
deleted file mode 100644
index 5724e31..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SelectNodeAction.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.single;
-
-import org.w3c.dom.Node;
-
-/**
- * An edit part selection action that corresponds to a Node selection
- */
-public abstract class SelectNodeAction extends SelectEditPartAction 
-{
-    private final Node  _node;
-
-    /**
-     * @param text
-     * @param curNode
-     */
-    protected SelectNodeAction(String text, Node curNode) {
-        super(text);
-        _node = curNode;
-    }
-
-    /**
-     * @return the current node
-     */
-    protected Node getNode() {
-        return _node;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SelectParentAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SelectParentAction.java
deleted file mode 100644
index 33d053e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SelectParentAction.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.single;
-
-import org.eclipse.gef.EditPart;
-import org.w3c.dom.Node;
-
-/**
- * Given a target node/edit part change selection to its parent
- * 
- * @author cbateman
- *
- */
-public class SelectParentAction extends SelectNodeAction {
-
-    private final EditPart _editPart;
-    
-    /**
-     * @param node
-     * @param editPart
-     * @return an action that will change focus selection to the parent
-     * part of node/editPart or a disabled one if there is no parent
-     */
-    public static SelectParentAction create(Node node, EditPart editPart)
-    {
-        Node parent = node.getParentNode();
-        
-        if (parent != null)
-        {
-            final String text = "Parent ("+parent.getNodeName()+")";
-            return new SelectParentAction(text, node, editPart);
-        }
-        SelectParentAction action = new SelectParentAction("Parent", node, editPart);
-        action.setEnabled(false);
-        return action;
-    }
-    
-    private SelectParentAction(String text, Node node, EditPart editPart)
-    {
-        super(text, node);
-        _editPart = editPart;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.actions.single.SelectEditPartAction#getNewSelection()
-     */
-    protected EditPart getNewSelection() 
-    {
-        return _editPart.getParent();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SingleElementActionGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SingleElementActionGroup.java
deleted file mode 100644
index 9bf37dd..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/SingleElementActionGroup.java
+++ /dev/null
@@ -1,241 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.single;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.dom.DOMStyleUtil;
-import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEdit;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.ui.actions.ActionGroup;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-
-/**
- * Group that constructs context menu items for a single selected element.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class SingleElementActionGroup extends ActionGroup {
-    // TODO: why?
-	private static final Action action = new Action() {
-        // create a default instance that does nothing
-        // Action is abstract but has no abstract methods
-        // run() on this object is a NOOP
-	};
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.ActionGroup#fillContextMenu(org.eclipse.jface.action.IMenuManager)
-	 */
-	public void fillContextMenu(IMenuManager menu) {
-		ElementEditPart part = fixUpSelection(getContext().getSelection());
-		if (part == null) {
-			return;
-		}
-		IDOMElement ele = (IDOMElement) part.getIDOMNode();
-        addPositionRelativeMenu(menu, part, ele);
-		addStylelMenu(menu, part, ele);
-
-		// next add element special actions
-		IElementEdit elementEdit = part.getElementEdit();
-		if (elementEdit != null) {
-			elementEdit.fillContextMenu(menu, ele);
-		}
-	}
-
-	/**
-	 * @param selection
-	 * @return
-	 */
-	private ElementEditPart fixUpSelection(ISelection selection) {
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection sel = (IStructuredSelection) selection;
-			if (sel.size() != 1) {
-				return null;
-			}
-			if (sel.getFirstElement() instanceof ElementEditPart) {
-				return (ElementEditPart) sel.getFirstElement();
-			}
-		}
-		return null;
-	}
-
-    /**
-     * Add menu actions that select relative to the current position
-     * 
-     * @param menu
-     * @param part
-     * @param ele
-     */
-    private void addPositionRelativeMenu(IMenuManager menu, ElementEditPart part, IDOMElement ele)
-    {
-        IContributionItem subMenuItem = menu.find(PageDesignerActionConstants.SELECT_SUBMENU_ID);
-        
-        if (subMenuItem instanceof IMenuManager)
-        {
-            final IMenuManager subMenu = (IMenuManager) subMenuItem;
-    //        final IMenuManager selectMenu = new MenuManager(PDPlugin
-    //                .getResourceString("ActionGroup.Submenu.SelectRelative"));//$NON-NLS-1$
-            SelectParentAction  selectParentAction = SelectParentAction.create(ele, part);
-            // Eclipse UI guideline: 6.13
-            // even if there is no parent, a disabled action will be returned by
-            // create and this should be added to the menu
-            subMenu.add(selectParentAction);
-            
-            List children = new ArrayList();
-            for (Iterator it = part.getChildren().iterator(); it.hasNext();)
-            {
-                EditPart childPart = (EditPart) it.next();
-                
-                // only include selectable element edit part that are modelling
-                // XML elements in the source doc
-                if (childPart instanceof ElementEditPart
-                        && ((ElementEditPart)childPart).isSelectable()
-                        && ((ElementEditPart)childPart).getModel() instanceof Element)
-                {
-                    children.add(SelectNodeAction
-                            .create(((Element)((ElementEditPart)childPart).getModel()).getNodeName(), childPart));
-                }
-            }
-
-            
-            // don't add the select Children menu unless there are actually children
-            if (children.size() > 0)
-            {
-                MenuManager selectChildMenu = new MenuManager("Children"/*PDPlugin
-                .getResourceString("ActionGroup.Submenu.StyleClasses")*/);
-                subMenu.add(selectChildMenu);
-
-                for (final Iterator it = children.iterator(); it.hasNext();)
-                {
-                    selectChildMenu.add((Action)it.next());
-                }
-            }
-            else
-            {   // Eclipse UI guideline 6.13
-                // create the child actions even if no children but make it
-                // a disabled option if no children
-                Action childrenAction = new Action("Children"){/* do nothing*/};
-                childrenAction.setEnabled(false);
-                subMenu.add(childrenAction);
-            }
-        }
-    }
-    
-	/**
-	 * @param menu
-	 * @param part
-	 */
-	private void addStylelMenu(IMenuManager menu, ElementEditPart part,
-			IDOMElement ele) {
-        IContributionItem subMenu = 
-            menu.find(PageDesignerActionConstants.STYLE_SUBMENU_ID);
-
-        if (subMenu instanceof IMenuManager)
-        {
-            final IMenuManager subMenuManager = 
-                (IMenuManager) subMenu;
-    		addStyle(subMenuManager, part, ele);
-    		addStyleClassesMenu(subMenuManager, part, ele);
-    
-    		if (DOMStyleUtil.supportStyleAttribute(ele)) {
-    			// addBorderStyleMenu(stylesub, part, ele);
-    			addColorMenu(subMenuManager, part, ele);
-    			addBackgroundMenu(subMenuManager, part, ele);
-    		}
-        }
-	}
-
-	/**
-	 * 
-	 * @param menu
-	 * @param part
-	 * @param ele
-	 */
-	private void addStyle(IMenuManager subMenu, ElementEditPart part,
-			IDOMElement ele) {
-        StyleSupport.createStyleAction(subMenu, part, ele);
-	}
-
-	/**
-	 * @param stylesub
-	 * @param part
-	 */
-	private void addStyleClassesMenu(IMenuManager subMenu,
-			ElementEditPart part, final IDOMElement ele) {
-		final IMenuManager classmenu = new MenuManager(PDPlugin
-				.getResourceString("ActionGroup.Submenu.StyleClasses"));//$NON-NLS-1$
-		StyleClassSupport.createStyleClassActions(classmenu, ele);
-
-        subMenu.appendToGroup(PageDesignerActionConstants.GROUP_STYLE,
-                classmenu);
-	}
-
-	/**
-	 * @param stylesub
-	 * @param part
-	 */
-	private void addColorMenu(IMenuManager subMenu, ElementEditPart part,
-			final IDOMElement ele) {
-		final IMenuManager colorSub = new MenuManager(PDPlugin
-				.getResourceString("ActionGroup.Submenu.Color"));//$NON-NLS-1$
-		colorSub.add(action);
-		colorSub.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager manager) {
-				colorSub.removeAll();
-				ColorSupport.createColorActions(colorSub, ele,
-						ICSSPropertyID.ATTR_COLOR);
-			}
-		});
-        subMenu.appendToGroup(PageDesignerActionConstants.GROUP_STYLE,
-				colorSub);
-
-	}
-
-	/**
-	 * @param stylesub
-	 * @param part
-	 */
-	private void addBackgroundMenu(IMenuManager subMenu, ElementEditPart part,
-			final IDOMElement ele) {
-		final IMenuManager colorSub = new MenuManager(PDPlugin
-				.getResourceString("ActionGroup.Submenu.BackgroundColor"));//$NON-NLS-1$
-		colorSub.add(action);
-		colorSub.addMenuListener(new IMenuListener() {
-
-			public void menuAboutToShow(IMenuManager manager) {
-				colorSub.removeAll();
-				ColorSupport.createColorActions(colorSub, ele,
-						ICSSPropertyID.ATTR_BACKGROUND_COLOR);
-			}
-		});
-
-        subMenu.appendToGroup(PageDesignerActionConstants.GROUP_STYLE,
-				colorSub);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/StyleClassSupport.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/StyleClassSupport.java
deleted file mode 100644
index da13637..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/StyleClassSupport.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.single;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.css2.CSSUtil;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class StyleClassSupport {
-	private final static String DEFAULT = PDPlugin
-			.getResourceString("StyleClassSupport.Default");
-
-	/**
-	 * @param classmenu
-	 * @param ele 
-	 */
-	public static void createStyleClassActions(IMenuManager classmenu,
-			IDOMElement ele) {
-		String styleClassAttr = getStyleClassAttributeName(ele);
-		if (styleClassAttr == null) {
-			return; // don't support style class
-		}
-		String styleClass = getStyleClass(ele);
-
-		boolean needAdditional = true;
-		ChangeAttributeAction action = new ChangeAttributeAction(DEFAULT, ele,
-				styleClassAttr, null);
-		if (styleClass == null || styleClass.length() == 0) {
-			action.setChecked(true);
-			needAdditional = false;
-		}
-		classmenu.add(action);
-		String[] classes = CSSUtil.getCSSClasses(ele.getOwnerDocument());
-		if (classes.length > 0) {
-			classmenu.add(new Separator());
-		}
-		for (int i = 0; i < classes.length; i++) {
-			ChangeAttributeAction action2 = new ChangeAttributeAction(
-					classes[i], ele, styleClassAttr, classes[i]);
-			if (classes[i].equalsIgnoreCase(styleClass)) {
-				action2.setChecked(true);
-				needAdditional = false;
-			}
-			classmenu.add(action2);
-		}
-		if (needAdditional) {
-			ChangeAttributeAction action2 = new ChangeAttributeAction(
-					styleClass, ele, styleClassAttr, styleClass);
-			action2.setChecked(true);
-			classmenu.add(action2);
-		}
-	}
-
-	/**
-	 * @param ele
-	 * @return the style class for ele or null if none
-	 */
-	public static String getStyleClass(IDOMElement ele) {
-		String styleClassAttr = getStyleClassAttributeName(ele);
-		if (styleClassAttr != null) {
-			return ele.getAttribute(styleClassAttr);
-		}
-        return null;
-	}
-
-	/**
-	 * FIXME: This is a temparary impelementation, with everything hard coded.
-	 * In the future, should have some INodeAdapter mechanism for each node to
-	 * tell the style class attribute name.
-	 * 
-	 * @param ele
-	 * @return the style class attribute name or null if none applies
-	 */
-	public static String getStyleClassAttributeName(IDOMElement ele) {
-		CMElementDeclaration decl = CMUtil.getElementDeclaration(ele);
-		if (decl == null) {
-			return null;
-		}
-		String taguri = CMUtil.getTagURI(decl);
-		if (taguri == null || ITLDConstants.URI_HTML.equals(taguri)) {
-			if (decl.getAttributes().getNamedItem("class") != null) {
-				return "class";
-			}
-            return null;
-		} else if (decl.getAttributes().getNamedItem("styleClass") != null) {
-			return "styleClass";
-		} else if (decl.getAttributes().getNamedItem("class") != null) {
-			return "class";
-		} else {
-			return null;
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/StyleSupport.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/StyleSupport.java
deleted file mode 100644
index d580d6e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/single/StyleSupport.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.single;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public final class StyleSupport {
-	/**
-	 * @param menu
-	 * @param part
-	 * @param ele
-	 */
-	public static void createStyleAction(IMenuManager menu,
-			ElementEditPart part, IDOMElement ele) {
-		if (part == null) {
-			return;
-		}
-		if (hasStyleAttribute(ele)) {
-			IAction action = new ChangeStyleAction(part, ele);
-			menu.appendToGroup(PageDesignerActionConstants.GROUP_STYLE, action);
-		}
-	}
-
-	private static boolean hasStyleAttribute(IDOMElement ele) {
-		CMElementDeclaration decl = CMUtil.getElementDeclaration(ele);
-		if (decl == null) {
-			return false;
-		}
-		if (decl.getAttributes().getNamedItem("style") != null) {
-			return true;
-		}
-		return false;
-	}
-	
-	private StyleSupport()
-	{
-		// util class; no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/table/TableActionGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/table/TableActionGroup.java
deleted file mode 100644
index f076978..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/table/TableActionGroup.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.table;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.actions.single.SelectEditPartAction;
-import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.range.RangeUtil;
-import org.eclipse.jst.pagedesigner.tableedit.DeleteRowColumnAction;
-import org.eclipse.jst.pagedesigner.tableedit.InsertRowColumnAction;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.ui.actions.ActionGroup;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * 
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class TableActionGroup extends ActionGroup {
-	// TODO: I think there's a pattern emerging...
-    private final static Action action = new Action() {
-        // create an empty no-op
-	};
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.ActionGroup#fillContextMenu(org.eclipse.jface.action.IMenuManager)
-	 */
-	public void fillContextMenu(IMenuManager menu) {
-		ISelection selection = this.getContext().getSelection();
-
-		EditPart part = findCommonAncesterPart(selection);
-		if (part == null) {
-			return;
-		}
-
-		TableOperationContext context = TableOperationContext
-				.getTableOperationContext(part);
-		if (context == null) {
-			return;
-		}
-
-		final ElementEditPart tablePart = context.getTablePart();
-
-		if (tablePart == null || !supportTableActions(tablePart)) {
-			return;
-		}
-
-		final int cellRow = context.getRowIndex();
-		final int cellColumn = context.getColumnIndex();
-
-		String tag = ((IDOMElement) tablePart.getIDOMNode()).getLocalName();
-		final IMenuManager tableMenu = new MenuManager(tag);
-
-		// ok, we passed the checking, now let's create the actions.
-		tableMenu.add(action);
-		tableMenu.addMenuListener(new IMenuListener() {
-
-			public void menuAboutToShow(IMenuManager manager) {
-				tableMenu.removeAll();
-				fillTableMenu(tablePart, cellRow, cellColumn, tableMenu);
-			}
-		});
-		menu.appendToGroup(PageDesignerActionConstants.GROUP_CONTAINER,
-				tableMenu);
-	}
-
-	/**
-	 * @param tablePart
-	 * @param cellRow
-	 * @param cellColumn
-	 * @param tableMenu
-	 */
-	private void fillTableMenu(ElementEditPart tablePart, int cellRow,
-			int cellColumn, IMenuManager tableMenu) {
-		SelectEditPartAction action1 = SelectEditPartAction.create(
-				PDPlugin
-						.getResourceString("TableActionGroup.Submenu.SelectTable"), tablePart);//$NON-NLS-1$
-		tableMenu.add(action1);
-
-		tableMenu.add(new Separator());
-
-		{
-			InsertRowColumnAction insertRowBeforeAction = new InsertRowColumnAction(
-					PDPlugin
-							.getResourceString("TableActionGroup.Submenu.InsertRowBefore"),//$NON-NLS-1$
-					tablePart, cellRow, true, true);
-			tableMenu.add(insertRowBeforeAction);
-
-			InsertRowColumnAction insertRowAfterAction = new InsertRowColumnAction(
-					PDPlugin
-							.getResourceString("TableActionGroup.Submenu.InsertRowAfter"),//$NON-NLS-1$
-					tablePart, cellRow, true, false);
-			tableMenu.add(insertRowAfterAction);
-
-			tableMenu.add(new Separator());
-		}
-
-		{
-			InsertRowColumnAction insertColumnBeforeAction = new InsertRowColumnAction(
-					PDPlugin
-							.getResourceString("TableActionGroup.Submenu.InsertColumnBefore"),//$NON-NLS-1$
-					tablePart, cellColumn, true, true);
-			tableMenu.add(insertColumnBeforeAction);
-
-			InsertRowColumnAction insertColumnAfterAction = new InsertRowColumnAction(
-					PDPlugin
-							.getResourceString("TableActionGroup.Submenu.InsertColumnAfter"),//$NON-NLS-1$
-					tablePart, cellColumn, true, false);
-			tableMenu.add(insertColumnAfterAction);
-
-			tableMenu.add(new Separator());
-		}
-
-		{
-			DeleteRowColumnAction deleteRowAction = new DeleteRowColumnAction(
-					PDPlugin
-							.getResourceString("TableActionGroup.Submenu.DeleteRow"),//$NON-NLS-1$
-					tablePart, cellRow, true);
-			tableMenu.add(deleteRowAction);
-
-			DeleteRowColumnAction deleteColumnAction = new DeleteRowColumnAction(
-					PDPlugin
-							.getResourceString("TableActionGroup.Submenu.DeleteColumn"),//$NON-NLS-1$
-					tablePart, cellColumn, false);
-			tableMenu.add(deleteColumnAction);
-		}
-	}
-
-	/**
-	 * @param tablePart
-	 * @return
-	 */
-	private boolean supportTableActions(ElementEditPart tablePart) {
-	    // TODO: what's the point of this method?
-        // it's only used in one place and always resolves to the same value..
-		return true;
-	}
-
-	/**
-	 * Give a selection, find a single common container node as start for table
-	 * related operations.
-	 * 
-	 * @param selection
-	 * @return
-	 */
-	private EditPart findCommonAncesterPart(ISelection selection) {
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection structsel = (IStructuredSelection) selection;
-			if (structsel.size() != 1) {
-				return null;
-			} else if (structsel.getFirstElement() instanceof EditPart) {
-				return (EditPart) structsel.getFirstElement();
-			} else {
-				return null;
-			}
-		} else if (selection instanceof DesignRange) {
-			DesignRange range = (DesignRange) selection;
-			if (!range.isValid()) {
-				return null;
-			}
-			if (range.isEmpty()) {
-				DesignPosition position = range.getStartPosition();
-				if (position.getOffset() == 0) {
-					return position.getContainerPart();
-				}
-                return position.getSiblingEditPart(true);
-			}
-            return RangeUtil.findCommonAncestor(range);
-		} else {
-			return null;
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/table/TableOperationContext.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/table/TableOperationContext.java
deleted file mode 100644
index 0981ed3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/table/TableOperationContext.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.actions.table;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.table.CSSTableCellLayout;
-import org.eclipse.jst.pagedesigner.css2.layout.table.CSSTableLayout2;
-import org.eclipse.jst.pagedesigner.css2.layout.table.TableCellInfo;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-
-/**
- * 
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class TableOperationContext {
-	private ElementEditPart _tablePart;
-
-	private int _rowIndex;
-
-	private int _columnIndex;
-
-	/**
-	 * @param part
-	 * @return the operation context for part
-	 */
-	public static TableOperationContext getTableOperationContext(EditPart part) {
-		EditPart originalPart = part;
-		ElementEditPart tablePart = null;
-		CSSTableLayout2 tableLayout = null;
-
-		while (part.getParent() instanceof ElementEditPart) {
-			part = part.getParent();
-			IFigure figure = ((GraphicalEditPart) part).getFigure();
-
-			if (figure.getLayoutManager() instanceof CSSTableLayout2) {
-				tableLayout = (CSSTableLayout2) figure.getLayoutManager();
-				tablePart = ((ElementEditPart) part);
-				break;
-			}
-		}
-		if (tablePart == null) {
-			return null;
-		}
-
-		part = originalPart;
-
-		IFigure figure = ((GraphicalEditPart) originalPart).getFigure();
-		while (figure instanceof CSSFigure) {
-			if (figure.getLayoutManager() instanceof CSSTableCellLayout) {
-				CSSTableCellLayout cellLayout = (CSSTableCellLayout) figure
-						.getLayoutManager();
-				if (cellLayout.getTableLayout() == tableLayout) {
-					// ok, we found.
-					TableCellInfo cellInfo = cellLayout.getTableCellInfo();
-					if (cellInfo == null) {
-						return null;
-					}
-                    TableOperationContext context = new TableOperationContext();
-                    context._tablePart = tablePart;
-                    context._rowIndex = cellInfo.getRowIndex();
-                    context._columnIndex = cellInfo.getColumnIndex();
-                    return context;
-				}
-                return null;
-			}
-			figure = figure.getParent();
-		}
-		return null;
-	}
-
-    ElementEditPart getTablePart() {
-        return _tablePart;
-    }
-
-    int getRowIndex() {
-        return _rowIndex;
-    }
-
-    int getColumnIndex() {
-        return _columnIndex;
-    }
-	
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/adapters/IBodyInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/adapters/IBodyInfo.java
deleted file mode 100644
index 34dfb61..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/adapters/IBodyInfo.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.adapters;
-
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-
-/**
- * This is an adapter interface. Will be adapted to all the node in the
- * document. It provides additional information to support designer.
- * 
- * Basicaly it tells the correspoinding node's body related information.
- * 
- * @author mengbo
- */
-// XXX: in the future will use adapter mechanism to support dynamic information
-public interface IBodyInfo // extends INodeAdapter
-{
-	// /**
-	// * whether this node is runtime visible.
-	// *
-	// * @return
-	// */
-	// public boolean isRuntimeVisible(INodeNotifier node);
-	//    
-	// /**
-	// * whether this node is design time visible.
-	// * @return
-	// */
-	// public boolean isDesignTimeVisible(INodeNotifier node);
-
-	// /**
-	// * whether is HTML tag.
-	// * @param node
-	// * @return
-	// */
-	// public boolean isHTML(IDOMNode node);
-	//    
-	// /**
-	// * whether is JSP tag.
-	// * @param node
-	// * @return
-	// */
-	// public boolean isJSP(IDOMNode node);
-	//    
-	// /**
-	// * whether is custom tag.
-	// * @param node
-	// * @return
-	// */
-	// public boolean isCustomTag(IDOMNode node);
-	//    
-	// /**
-	// * for custom tag, there may have a corresponding HTML tag name.
-	// * This can be used for content model validation.
-	// *
-	// * @param node
-	// * @return
-	// */
-	// public String getCorrespondingHTMLTag(IDOMNode node);
-
-	/**
-	 * whether this node is body node. We treat the document node and certain
-	 * element node like "HTML", "BODY", "f:view", "f:subview" as body node. At
-	 * design time we may want to move those visual node into the body.
-	 * 
-	 * @param node 
-	 * @return true if node is a body container
-	 */
-	public boolean isBodyContainer(IDOMNode node);
-
-	/**
-	 * this method should only be called isBodyContainer return true; It checks
-	 * whether the uri/localname should belong to the head part of this body
-	 * container.
-	 * 
-	 * @param node 
-	 * @param uri
-	 * @param localname
-	 * @return true if node is a header
-	 */
-	public boolean isBodyHeader(IDOMNode node, String uri, String localname);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/adapters/internal/BodyInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/adapters/internal/BodyInfo.java
deleted file mode 100644
index 5d9c498..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/adapters/internal/BodyInfo.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.adapters.internal;
-
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.adapters.IBodyInfo;
-import org.eclipse.jst.pagedesigner.jsp.core.IJSPCoreConstants;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-// XXX: currently hardcoded as sigleton implementation,
-// it is believed in the future will not use singleton, because we want to
-// dynamically
-// support other taglibs.
-public class BodyInfo implements IBodyInfo {
-	private static final BodyInfo _instance = new BodyInfo();
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.adapters.IDesignInfo#isBodyContainer(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier)
-	 */
-	public boolean isBodyContainer(IDOMNode node) {
-		switch (node.getNodeType()) {
-		case Node.DOCUMENT_FRAGMENT_NODE:
-		case Node.DOCUMENT_NODE:
-			return true;
-		case Node.ELEMENT_NODE:
-			return isBodyContainerElement((Element) node);
-		default:
-			return false;
-		}
-	}
-
-	/**
-	 * @param element
-	 * @return
-	 */
-	private boolean isBodyContainerElement(Element element) {
-		String localname = element.getLocalName();
-		/*
-		 * String namespaceURI = CMUtil.getElementNamespaceURI(element); if
-		 * (IJMTConstants.URI_HTML.equals(namespaceURI)) { return
-		 * "html".equalsIgnoreCase(localname) ||
-		 * "body".equalsIgnoreCase(localname); } if
-		 * (IJMTConstants.URI_JSF_CORE.equals(namespaceURI)) { return
-		 * "view".equals(localname) || "subview".equals(localname); }
-		 */
-		return IHTMLConstants.TAG_HTML.equalsIgnoreCase(localname)
-				|| IHTMLConstants.TAG_BODY.equalsIgnoreCase(localname)
-				|| IJSFConstants.TAG_VIEW.equals(localname)
-				|| IJSFConstants.TAG_SUBVIEW.equals(localname);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.adapters.IDesignInfo#isBodyHeader(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier,
-	 *      java.lang.String, java.lang.String)
-	 */
-	public boolean isBodyHeader(IDOMNode node, String uri, String localname) {
-		switch (node.getNodeType()) {
-		case Node.DOCUMENT_FRAGMENT_NODE:
-		case Node.DOCUMENT_NODE:
-			return isDocumentHeader(uri, localname);
-		case Node.ELEMENT_NODE:
-			return isElementHeader((Element) node, uri, localname);
-		default:
-			return false;
-		}
-	}
-
-	/**
-	 * @param element
-	 * @param uri
-	 * @param localname
-	 * @return
-	 */
-	private boolean isElementHeader(Element element, String uri,
-			String localname) {
-		String elelocalname = element.getLocalName();
-		String namespaceURI = CMUtil.getElementNamespaceURI(element);
-		if (ITLDConstants.URI_HTML.equals(namespaceURI)
-				&& IHTMLConstants.TAG_HTML.equalsIgnoreCase(elelocalname)) {
-			return IHTMLConstants.TAG_HEAD.equalsIgnoreCase(localname);
-		}
-		if (ITLDConstants.URI_JSF_CORE.equals(namespaceURI)
-				&& IJSFConstants.TAG_VIEW.equalsIgnoreCase(elelocalname)) {
-			return IJSFConstants.TAG_LOADBUNDLE.equalsIgnoreCase(localname);
-		}
-		return false;
-	}
-
-	/**
-	 * @param uri
-	 * @param localname
-	 * @return
-	 */
-	private boolean isDocumentHeader(String uri, String localname) {
-		// FIXME: temparary commented out, since the dragged node do not have
-		// uri information for now.
-		// if (IJMTConstants.URI_JSP.equals(uri))
-		return IJSPCoreConstants.TAG_DIRECTIVE_PAGE.equals(localname)
-				|| IJSPCoreConstants.TAG_DIRECTIVE_TAGLIB.equals(localname);
-
-	}
-
-	/**
-	 * @return the singleton
-	 */
-	public static IBodyInfo getInstance() {
-		return _instance;
-	}
-
-	private BodyInfo()
-	{
-	    // no external instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CloneNodeCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CloneNodeCommand.java
deleted file mode 100644
index c618210..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CloneNodeCommand.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Node;
-
-/**
- * This is when user control+mouse drag. Can also be used in other places.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class CloneNodeCommand extends DesignerCommand {
-	IDOMPosition _insertPosition;
-
-	Node _originalNode;
-
-	Node _resultNode;
-
-	/**
-	 * @param viewer
-	 * @param insertionPoint 
-	 * @param originalNode 
-	 */
-	public CloneNodeCommand(IHTMLGraphicalViewer viewer,
-			IDOMPosition insertionPoint, Node originalNode) {
-		super(
-				CommandResources.getString("CloneNodeCommand.Label.CloneNode"), viewer); //$NON-NLS-1$
-		this._insertPosition = insertionPoint;
-		this._originalNode = originalNode;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		Node newNode = DOMUtil.cloneNodeDeep(this.getDocument(), _originalNode);
-		DOMUtil.insertNode(_insertPosition, newNode);
-		_resultNode = newNode;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected ISelection getAfterCommandDesignerSelection() {
-		return toDesignSelection(_resultNode);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CommandResources.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CommandResources.java
deleted file mode 100644
index c18db16..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CommandResources.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class CommandResources {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.pagedesigner.commands.CommandResources"; //$NON-NLS-1$
-
-	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
-			.getBundle(BUNDLE_NAME);
-
-	private CommandResources() {
-        // no local instantiation
-	}
-
-	/**
-	 * @param key
-	 * @return the resource value for key or  !key! if not foudnd
-	 */
-	public static String getString(String key) {
-		try {
-			return RESOURCE_BUNDLE.getString(key);
-		} catch (MissingResourceException e) {
-			return '!' + key + '!';
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CommandResources.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CommandResources.properties
deleted file mode 100644
index c7a62a4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CommandResources.properties
+++ /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
-###############################################################################
-PasteNodeCommand.Label.DeleteNode=Delete Node
-CutNodeCommand.Label.CutNode=Cut Node
-DeleteNodeCommand.Label.DeleteNode=Delete Node
-DeleteAction.CommandLabel.Delete=Delete
-TableDeleteColumnCommand.Label.DeleteColumn=Delete Column
-TableInsertColumnCommand.Label.InsertColumn=Insert Column
-TableResizeColumnCommand.Label.ResizeColumn=Resize Column
-TableResizeRowCommand.Label.ResizeColumn=Resize Column
-TableDeleteRowCommand.Label.DeleteRow=Delete Row
-TableInsertRowCommand.Label.InsertRow=Insert Row
-TableDeleteHeaderFooterCommand.Label.DeleteHeader=Delete Header
-TableDeleteHeaderFooterCommand.Label.DeleteFooter=Delete Footer
-TableInsertHeaderFooterCommand.Label.InsertHeader=Insert Header
-TableInsertHeaderFooterCommand.Label.InsertFooter=Insert Footer
-PasteCommand.Label.Paste=Paste
-DeleteCommand.Label.Delete=Delete
-CutCommand.Label.Cut=Cut
-CopyCommand.Label.Copy=Copy
-ApplyStyleCommand.Label.ApplyStyle=Apply Style
-ChangeStyleCommand.Label.ChangeStyle=Change Style
-MoveNodeCommand.Label.MoveNode=Move Node
-CloneNodeCommand.Label.CloneNode=Copy Node
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CopyAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CopyAction.java
deleted file mode 100644
index 2502ac3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CopyAction.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.ui.actions.UpdateAction;
-import org.eclipse.gef.ui.parts.GraphicalEditor;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.commands.range.CopyCommand;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- */
-public class CopyAction extends DesignAction implements UpdateAction {
-	/**
-	 * @param editor
-	 */
-	public CopyAction(GraphicalEditor editor) {
-		super(editor, PDPlugin.getResourceString("Action.Name.Copy"));//$NON-NLS-1$
-		// this.setAccelerator(SWT.CTRL | SWT.INSERT);
-		// this.setActionDefinitionId(ITextEditorActionDefinitionIds.CUT);
-	}
-
-	public void perform() {
-		DesignerCommand command = null;
-		IHTMLGraphicalViewer viewer = getViewer();
-		if (viewer.isInRangeMode()) {
-			command = new CopyCommand(viewer);
-			command.execute();
-		} else {
-			Command nodeCopy = new CopyNodeCommand(viewer);
-			nodeCopy.execute();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#isEnabled()
-	 */
-	public boolean isEnabled() {
-		IHTMLGraphicalViewer viewer = getViewer();
-		if (viewer != null) {
-			if (viewer.isInRangeMode()
-					&& !EditModelQuery.isSame(viewer.getRangeSelection())) {
-				return true;
-			} else if (!viewer.isInRangeMode()
-					&& viewer.getSelectedEditParts().size() > 0) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.actions.UpdateAction#update()
-	 */
-	public void update() {
-		this.setEnabled(isEnabled());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CopyNodeCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CopyNodeCommand.java
deleted file mode 100644
index dd9900c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CopyNodeCommand.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import java.util.List;
-import java.util.Vector;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.dnd.TemplateTransfer;
-import org.eclipse.jst.pagedesigner.dom.EditValidateUtil;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.w3c.dom.Node;
-
-/**
- * As copy operation won't change anything in the current document, so it is not
- * extending from DesignerCommand.
- * 
- * @author mengbo
- */
-public class CopyNodeCommand extends Command {
-	private IHTMLGraphicalViewer _viewer;
-
-	/**
-	 * @param viewer
-	 */
-	public CopyNodeCommand(IHTMLGraphicalViewer viewer) {
-		super("");
-		this._viewer = viewer;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	public void execute() {
-		List parts = _viewer.getSelectedEditParts();
-		Vector result = new Vector();
-		if (parts.size() > 0) {
-			for (int i = 0, n = parts.size(); i < n; i++) {
-				EditPart part = (EditPart) parts.get(i);
-				Object model = part.getModel();
-				if (model instanceof Node) {
-					EditValidateUtil.validNode((Node) model);
-					result.add(((Node) model).cloneNode(true));
-				}
-			}
-			setClipboard(result);
-		}
-	}
-
-	private void setClipboard(Vector result) {
-		Node[] nodes = (Node[]) result.toArray(new Node[result.size()]);
-		StringBuffer sb = new StringBuffer();
-		for (int i = 0, size = nodes.length; i < size; i++) {
-			DOMUtil.nodeToString(nodes[i], sb);
-		}
-		// TemplateTransfer.getInstance().setObject(result);
-		Clipboard board = new Clipboard(_viewer.getControl().getDisplay());
-		board.setContents(new Object[] { result, sb.toString() },
-				new Transfer[] { TemplateTransfer.getInstance(),
-						TextTransfer.getInstance() });
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CreateItemCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CreateItemCommand.java
deleted file mode 100644
index 62da037..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CreateItemCommand.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.editors.palette.TagToolPaletteEntry;
-import org.eclipse.jst.pagedesigner.utils.CommandUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class CreateItemCommand extends DesignerCommand {
-	private final IDOMPosition _position;
-
-	private final TagToolPaletteEntry _tagItem;
-	private Element _ele;
-	private IAdaptable _customizationData;
-
-	/**
-	 * @param label
-	 * @param model 
-	 * @param position 
-	 * @param tagItem 
-	 */
-	public CreateItemCommand(String label, IDOMModel model,
-			IDOMPosition position, TagToolPaletteEntry tagItem) {
-		super(label, model.getDocument());
-		this._position = position;
-		this._tagItem = tagItem;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		Element element = CommandUtil.excuteInsertion(this._tagItem,
-				getModel(), this._position, this._customizationData);
-		if (element != null) {
-			formatNode(element);
-		}
-		this._ele = element;
-	}
-
-	@Override
-    protected void postPostExecute() 
-	{
-        // during JUnit testing, we may not have viewer.
-        // this will cause us not to have undo support,
-        // but should not effect testing for this command
-	    if (getViewer() != null)
-        {
-            super.postPostExecute();
-        }
-    }
-
-    @Override
-    protected boolean prePreExecute() 
-    {
-        // during JUnit testing, we may not have viewer.
-        // this will cause us not to have undo support,
-        // but should not effect testing for this command
-        if (getViewer() != null)
-        {
-            return super.prePreExecute();
-        }
-        
-        return true;
-    }
-
-    /*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected ISelection getAfterCommandDesignerSelection() {
-		return toDesignSelection(_ele);
-	}
-
-    /**
-     * @param customizationData
-     */
-    public void setCustomizationData(IAdaptable customizationData) 
-    {
-        _customizationData = customizationData;
-    }
-    
-    /**
-     * This method is for test purposes and should generally not be 
-     * used by clients.
-     * 
-     * @return the customization data
-     */
-    protected final IAdaptable getCustomizationData()
-    {
-        return _customizationData;
-    }
-    
-    /**
-     * @return the result of the command execution
-     * TODO: add Object getResult() method to DesignerCommand
-     */
-    protected Element getResult()
-    {
-        return this._ele;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CutAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CutAction.java
deleted file mode 100644
index 3617aec..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CutAction.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.gef.ui.actions.UpdateAction;
-import org.eclipse.gef.ui.parts.GraphicalEditor;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.commands.range.CutCommand;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- */
-public class CutAction extends DesignAction implements UpdateAction {
-	/**
-	 * @param editor
-	 */
-	public CutAction(GraphicalEditor editor) {
-		super(editor, PDPlugin.getResourceString("Action.Name.Cut"));//$NON-NLS-1$
-	}
-
-	public void perform() {
-		DesignerCommand command = null;
-		IHTMLGraphicalViewer viewer = getViewer();
-		if (viewer.isInRangeMode()) {
-			command = new CutCommand(viewer);
-			command.execute();
-		} else {
-			command = new CutNodeCommand(viewer);
-			command.execute();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#isEnabled()
-	 */
-	public boolean isEnabled() {
-		IHTMLGraphicalViewer viewer = getViewer();
-		if (viewer != null) {
-			if (viewer.isInRangeMode()
-					&& !EditModelQuery.isSame(viewer.getRangeSelection())) {
-				return true;
-			} else if (!viewer.isInRangeMode()
-					&& viewer.getSelectedEditParts().size() > 0) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.actions.UpdateAction#update()
-	 */
-	public void update() {
-		setEnabled(isEnabled());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CutNodeCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CutNodeCommand.java
deleted file mode 100644
index 006629a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/CutNodeCommand.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import java.util.List;
-import java.util.Vector;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.dnd.TemplateTransfer;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.dom.EditValidateUtil;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class CutNodeCommand extends DesignerCommand {
-	private static final String COMMAND_LABEL = CommandResources
-			.getString("CutNodeCommand.Label.CutNode"); //$NON-NLS-1$
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		List parts = getViewer().getSelectedEditParts();
-		Vector result = new Vector();
-		if (parts.size() > 0) {
-			for (int i = 0, n = parts.size(); i < n; i++) {
-				EditPart part = (EditPart) parts.get(i);
-				Object model = part.getModel();
-				if (model instanceof Node) {
-					EditValidateUtil.validNode((Node) model);
-					Node parent = ((Node) model).getParentNode();
-					model = parent.removeChild((Node) model);
-					result.add(model);
-				}
-			}
-			setClipboard(result);
-		}
-	}
-
-	protected ISelection getAfterCommandDesignerSelection() {
-		return null;
-	}
-
-	/**
-	 * @param viewer
-	 */
-	public CutNodeCommand(IHTMLGraphicalViewer viewer) {
-		super(COMMAND_LABEL, viewer);
-	}
-
-	private void setClipboard(Vector result) {
-		Node[] nodes = (Node[]) result.toArray(new Node[result.size()]);
-		StringBuffer sb = new StringBuffer();
-		for (int i = 0, size = nodes.length; i < size; i++) {
-			DOMUtil.nodeToString(nodes[i], sb);
-		}
-		// TemplateTransfer.getInstance().setObject(result);
-		Clipboard board = new Clipboard(_viewer.getControl().getDisplay());
-		board.setContents(new Object[] { result, sb.toString() },
-				new Transfer[] { TemplateTransfer.getInstance(),
-						TextTransfer.getInstance() });
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DeleteAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DeleteAction.java
deleted file mode 100644
index 3c89651..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DeleteAction.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.gef.ui.parts.GraphicalEditor;
-import org.eclipse.jst.pagedesigner.commands.range.DeleteCommand;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.parts.DocumentEditPart;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- */
-public class DeleteAction extends DesignAction {
-	/**
-	 * @param editor
-	 */
-	public DeleteAction(GraphicalEditor editor) {
-		super(editor, CommandResources
-				.getString("DeleteAction.CommandLabel.Delete")); //$NON-NLS-1$
-	}
-
-	public void perform() {
-		DesignerCommand command = null;
-		IHTMLGraphicalViewer viewer = getViewer();
-		if (viewer.isInRangeMode()) {
-			command = new DeleteCommand(true, viewer);
-			command.execute();
-		} else {
-			command = new DeleteNodeCommand(viewer);
-			command.execute();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#isEnabled()
-	 */
-	public boolean isEnabled() {
-		IHTMLGraphicalViewer viewer = getViewer();
-		if (viewer != null) {
-			if (viewer.isInRangeMode()
-					&& !EditModelQuery.isSame(viewer.getRangeSelection())) {
-				return true;
-			} else if (!viewer.isInRangeMode()) {
-				int size = viewer.getSelectedEditParts().size();
-				if (size > 1) {
-					return true;
-				} else if (size == 1
-						&& !(viewer.getSelectedEditParts().get(0) instanceof DocumentEditPart)) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DeleteNodeCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DeleteNodeCommand.java
deleted file mode 100644
index 71e529a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DeleteNodeCommand.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.EditHelper;
-import org.eclipse.jst.pagedesigner.dom.EditValidateUtil;
-import org.eclipse.jst.pagedesigner.parts.SubNodeEditPart;
-import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.IMovementMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.InlineEditingNavigationMediator;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.DesignRefPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class DeleteNodeCommand extends DesignerCommand {
-	private static final String COMMAND_LABEL = CommandResources
-			.getString("DeleteNodeCommand.Label.DeleteNode"); //$NON-NLS-1$
-
-	private DesignRange _prevRange;
-
-	/**
-	 * @param viewer
-	 */
-	public DeleteNodeCommand(IHTMLGraphicalViewer viewer) {
-		super(COMMAND_LABEL, viewer);
-	}
-
-	protected void preExecute() {
-		_prevRange = _viewer.getRangeSelection();
-		DesignPosition position = findObjectModePosition();
-		_prevRange = new DesignRange(position, position);
-		super.preExecute();
-	}
-
-	private DesignPosition findObjectModePosition() {
-		DesignPosition result = null;
-		IMovementMediator validator = new InlineEditingNavigationMediator(
-				new ActionData(ActionData.KEYBOARD_NAVAGATION, null));
-		DesignPosition position = getCurrentObjectPosition();
-		if (position != null) {
-			if (!validator.isValidPosition(position)) {
-				result = null;
-			} else {
-				result = position;
-			}
-		}
-		return result;
-	}
-
-	private DesignPosition getCurrentObjectPosition() {
-		DesignRange result = null;
-		if (_viewer.isInRangeMode()) {
-			result = _viewer.getRangeSelection();
-		} else {
-			List parts = _viewer.getSelectedEditParts();
-			if (parts.size() > 0) {
-				EditPart selection = (EditPart) parts.get(0);
-				if (selection instanceof SubNodeEditPart) {
-					DesignPosition position = new DesignRefPosition(selection,
-							false);
-					position = DOMPositionHelper.toDesignPosition(EditHelper
-							.ensureDOMPosition(DOMPositionHelper
-									.toDOMPosition(position)));
-					result = new DesignRange(position, position);
-				}
-			}
-		}
-		return result != null && result.isValid() ? result.getEndPosition()
-				: null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		List parts = getViewer().getSelectedEditParts();
-		for (int i = 0, n = parts.size(); i < n; i++) {
-			EditPart part = (EditPart) parts.get(i);
-			Object model = part.getModel();
-			if (model instanceof Node) {
-				EditValidateUtil.validNode((Node) model);
-				Node parent = ((Node) model).getParentNode();
-				model = parent.removeChild((Node) model);
-			}
-		}
-	}
-
-	protected ISelection getAfterCommandDesignerSelection() {
-		if (_prevRange.isValid()) {
-			return _prevRange;
-		}
-        return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DesignAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DesignAction.java
deleted file mode 100644
index a92e225..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DesignAction.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.gef.ui.actions.UpdateAction;
-import org.eclipse.gef.ui.parts.GraphicalEditor;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.pagedesigner.editors.IDesignViewer;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- */
-public abstract class DesignAction extends Action implements UpdateAction {
-	private GraphicalEditor _editor;
-
-	/**
-	 * @param editor
-	 * @param text
-	 */
-	public DesignAction(GraphicalEditor editor, String text) {
-		super(text);
-		_editor = editor;
-	}
-
-	/**
-	 * @return Returns the _editor.
-	 */
-	protected GraphicalEditor getEditor() {
-		return _editor;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		perform();
-		// Since the parameters don't affect, so they could be null, may change
-		// in the future
-		_editor.selectionChanged(null, null);
-	}
-
-	abstract void perform();
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.actions.UpdateAction#update()
-	 */
-	public void update() {
-		setEnabled(isEnabled());
-	}
-
-	/**
-	 * @return the viewer
-	 */
-	protected IHTMLGraphicalViewer getViewer() {
-		return ((IDesignViewer) _editor).getGraphicViewer();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DesignResizeComponentCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DesignResizeComponentCommand.java
deleted file mode 100644
index 2124d94..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DesignResizeComponentCommand.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.DefaultEditDomain;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editparts.ScalableRootEditPart;
-import org.eclipse.jface.text.ITextOperationTarget;
-import org.eclipse.jface.text.source.SourceViewer;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class DesignResizeComponentCommand extends Command {
-	private EditPart _part;
-
-	private Object _constraint;
-
-	private SourceViewer _viewer;
-
-	/**
-	 * @param child
-	 * @param constraint
-	 */
-	public DesignResizeComponentCommand(EditPart child, Object constraint) {
-		this._part = child;
-		this._constraint = constraint;
-		EditPart part = child;
-		if (part instanceof ScalableRootEditPart) {
-            // TODO: eh?
-            // do nothing I guess...
-		} else {
-			while (part != null
-					&& !(part.getParent() instanceof ScalableRootEditPart)) {
-				part = part.getParent();
-			}
-		}
-		if (part != null) {
-			EditPartViewer viewer = ((ScalableRootEditPart) part.getParent())
-					.getViewer();
-			HTMLEditor editor = ((HTMLEditor) ((DefaultEditDomain) ((IHTMLGraphicalViewer) viewer)
-					.getEditDomain()).getEditorPart());
-			_viewer = editor.getTextEditor().getTextViewer();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#execute()
-	 */
-	public void execute() {
-		Element element = ((Element) _part.getModel());
-		String width = element.getAttribute(ICSSPropertyID.ATTR_WIDTH);
-		// String height = element.getAttribute(ICSSPropertyID.ATTR_HEIGHT);
-		String originalStyle = element.getAttribute(ICSSPropertyID.ATTR_STYLE);
-		StringBuffer style;
-		if (originalStyle != null) {
-			originalStyle = this.removeOthers(originalStyle,
-					ICSSPropertyID.ATTR_WIDTH);
-			originalStyle = this.removeOthers(originalStyle,
-					ICSSPropertyID.ATTR_HEIGHT);
-			style = new StringBuffer(originalStyle);
-		} else {
-			style = new StringBuffer(50);
-		}
-		if (null == width) {
-			style.append(";").append(ICSSPropertyID.ATTR_WIDTH).append(":")
-					.append(((Rectangle) _constraint).width).append(";");
-			style.append(ICSSPropertyID.ATTR_HEIGHT).append(":").append(
-					((Rectangle) _constraint).height).append("");
-		}
-		element.setAttribute(ICSSPropertyID.ATTR_STYLE, style.toString());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#redo()
-	 */
-	public void redo() {
-		_viewer.doOperation(ITextOperationTarget.REDO);
-	}
-
-	/**
-	 * @param style
-	 * @param item
-	 * @return ?
-	 */
-	public String removeOthers(String style, String item) {
-		String result = null;
-		int pos = style.indexOf(item);
-		if (pos < 0) {
-			return style;
-		}
-		int pos1 = pos;
-		if (pos > 0) {
-			if (style.charAt(pos - 1) == ';') {
-				pos--;
-			}
-		}
-		char ch = style.charAt(pos1);
-		while (!(ch == ';' || ch == '"' || ch == '\'')) {
-			pos1++;
-			if (pos1 >= style.length()) {
-				break;
-			}
-			ch = style.charAt(pos1);
-		}
-		if (pos1 < style.length()) {
-			result = style.substring(0, pos)
-					+ style.substring(pos1 + 1, style.length());
-		} else {
-			result = style.substring(0, pos);
-		}
-		if (result.indexOf(item) >= 0) {
-			return removeOthers(result, item);
-		}
-        return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#undo()
-	 */
-	public void undo() {
-		_viewer.doOperation(ITextOperationTarget.UNDO);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DesignerCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DesignerCommand.java
deleted file mode 100644
index 10d6c60..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DesignerCommand.java
+++ /dev/null
@@ -1,376 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.EditValidateUtil;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.utils.SelectionHelper;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.wst.html.core.internal.format.HTMLFormatProcessorImpl;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * This class is intended to be the base class for all designer GEF commands.
- * Basically, it will wrap the real command with common actions like handle
- * undo/redo, etc.
- * 
- * @author mengbo
- */
-public abstract class DesignerCommand extends Command {
-	private final IDOMModel _model;
-
-	/**
-	 * the graphical viewer
-	 */
-	protected IHTMLGraphicalViewer _viewer;
-
-	private static final Logger _log = PDPlugin
-			.getLogger(DesignerCommand.class);
-
-	/**
-	 * @param label
-	 * @param viewer
-	 */
-	public DesignerCommand(String label, IHTMLGraphicalViewer viewer) {
-		super(label);
-		this._viewer = viewer;
-		this._model = viewer.getModel();
-	}
-
-	/**
-	 * @param label
-	 * @param node
-	 *            the node must be a node in the IHTMLGraphicalViewer.
-	 */
-	public DesignerCommand(String label, IDOMNode node) {
-	    this(label, (IDOMDocument) node.getOwnerDocument());
-	}
-
-	/**
-	 * @param label
-	 * @param document
-	 */
-	public DesignerCommand(String label, IDOMDocument document)
-	{
-	    super(label);
-        this._model = document.getModel();
-        EditPart part = (EditPart) document.getAdapterFor(EditPart.class);
-        if (part != null) {
-            this._viewer = (IHTMLGraphicalViewer) part.getViewer();
-        }
-	}
-	/**
-	 * @return the GEF viewer this command is targeted for
-	 * 
-	 */
-	public IHTMLGraphicalViewer getViewer() {
-		return _viewer;
-	}
-
-	/**
-	 * @return the DOM model that this command will effect
-	 */
-	public IDOMModel getModel() {
-		return _model;
-	}
-
-	/**
-	 * @return the dom document for the model this command will effect
-	 */
-	public IDOMDocument getDocument() {
-		return getModel().getDocument();
-	}
-
-	/**
-	 * executes the Command. This method should not be called if the Command is
-	 * not executable.
-	 */
-	public final void execute() {
-		boolean ok = prePreExecute();
-		if (ok) {
-			try {
-				preExecute();
-				doExecute();
-				postExecute();
-			} catch (Exception ex) {
-				handleException(ex);
-			} finally {
-				postPostExecute();
-			}
-		}
-	}
-
-	/**
-	 * child class can override.
-	 * 
-	 * @param ex
-	 */
-	protected void handleException(Exception ex) {
-		ex.printStackTrace();
-	}
-
-	/**
-	 * prePreExecute and postPostExecute is a pair. prePreExecute() SHOULD NOT
-	 * throw any exception, if it throw any exception, it should catch itself
-	 * and return false to indicate not continue.
-	 * @return true if execution should continue, false if should not 
-	 */
-	protected boolean prePreExecute() {
-		int position = -1;
-		int length = -1;
-		ISelection selection = getViewer().getSelection();
-		if (selection != null) {
-			if (getViewer().isInRangeMode()) {
-				DesignRange range = (DesignRange) selection;
-				if (range.isValid()) {
-					IDOMPosition domPos = DOMPositionHelper.toDOMPosition(range
-							.getStartPosition());
-					IDOMPosition domEnd = DOMPositionHelper.toDOMPosition(range
-							.getEndPosition());
-					if (EditValidateUtil.validPosition(domPos)
-							&& EditValidateUtil.validPosition(domEnd)) {
-						position = EditModelQuery
-								.getIndexedRegionLocation(domPos);
-						int end = EditModelQuery
-								.getIndexedRegionLocation(domEnd);
-						if (end < position) {
-							length = position - end;
-							position = end;
-						} else {
-							length = end - position;
-						}
-					}
-				}
-			} else {
-				Object object = ((IStructuredSelection) selection)
-						.getFirstElement();
-				if (object instanceof ElementEditPart) {
-					Node node = ((ElementEditPart) object).getIDOMNode();
-					position = EditModelQuery.getNodeStartIndex(node);
-					length = EditModelQuery.getNodeLenth(node);
-				}
-			}
-		}
-		if (position >= 0 && length >= 0) {
-			getModel().beginRecording(this, getLabel(), position, length);
-		} else {
-			getModel().beginRecording(this, getLabel());
-		}
-		getViewer().startSelectionChange();
-		getModel().aboutToChangeModel();
-		return true;
-	}
-
-	/**
-	 * child class can override this method for any pre action.
-	 */
-	protected void preExecute() {
-        // does nothing; children may wish to implement
-	}
-
-	/**
-	 * child class should override this method for the real action.
-	 */
-	protected abstract void doExecute();
-
-	/**
-	 * child class can override this method for any post action. NOTE: if
-	 * preExecute() or doExecute() throw exception, then this method will NOT be
-	 * called.
-	 */
-	protected void postExecute() {
-        // does nothing; child may wish to implement
-	}
-
-	/**
-	 * if prePreExecute() return true, then this method will always be called
-	 * even preExecute()/doExecute() and postExecute() fail.
-	 */
-	protected void postPostExecute() {
-		getModel().changedModel();
-
-		// after "changedModel()" is called, model will fire out batched events
-		// about model change
-		// and EditPart will be refreshed. Only at this time, could we use
-		// EditPart to construct the
-		// result selection.
-
-		// enforce a validate, so things get layed out, thus all the figures
-		// will be valid.
-		this.getViewer().getViewport().validate();
-
-		ISelection sel = getAfterCommandDesignerSelection();
-		if (sel != null) {
-			ITextSelection textSel = SelectionHelper
-					.convertFromDesignSelectionToTextSelection(sel);
-			if (textSel != null) {
-				getModel().endRecording(this, textSel.getOffset(),
-						textSel.getLength());
-			} else {
-				getModel().endRecording(this);
-			}
-		} else {
-			getModel().endRecording(this);
-		}
-
-		if (sel != null) {
-			getViewer().setSelection(sel);
-		} else {
-			getViewer().deselectAll();
-		}
-		if (getViewer() != null) {
-			getViewer().selectionChanged();
-		}
-	}
-
-	/**
-	 * child class should override this method to provide the selection after
-	 * command. This method is called after model changed. So at time of this
-	 * call, the editpart should be valid. Default implementation.
-	 * 
-	 * @return the selection
-	 */
-	protected abstract ISelection getAfterCommandDesignerSelection();
-
-	/**
-	 * @param range
-	 * @return a selection that contains the dom range or null if one doesn't exist
-	 */
-	protected ISelection toDesignRange(DOMRange range) {
-		try {
-			if (range == null) {
-				return null;
-			}
-			IDOMPosition startPos = range.getStartPosition();
-			DesignPosition start = DOMPositionHelper.toDesignPosition(startPos);
-			if (range.isEmpty()) {
-				return new DesignRange(start, start);
-			}
-            IDOMPosition endPos = range.getEndPosition();
-            return new DesignRange(start, DOMPositionHelper
-            		.toDesignPosition(endPos));
-		} catch (Exception e) {
-			// "Selection error"
-			_log.error("Error.RangeModeCommand.SetSelection"); //$NON-NLS-1$
-			return null;
-		}
-
-	}
-
-	/**
-	 * @param node
-	 * @return a selection for the node
-	 */
-	protected IStructuredSelection toDesignSelection(Node node) {
-		if (node instanceof INodeNotifier) {
-			EditPart part = (EditPart) ((INodeNotifier) node)
-					.getAdapterFor(EditPart.class);
-			if (part != null) {
-				return new StructuredSelection(part);
-			}
-		}
-		return null;
-	}
-
-	//    
-	// /**
-	// * set selection to the specified node. Normally called by child class in
-	// <code>setSelection()</code> implementation.
-	// *
-	// * @param node
-	// */
-	// protected final void setSelection(Node node)
-	// {
-	// EditPart part = (EditPart) ((INodeNotifier)
-	// node).getAdapterFor(EditPart.class);
-	//
-	// StructuredSelection sel = new StructuredSelection(part);
-	// getViewer().setSelection(sel);
-	// }
-
-	/**
-	 * format the specified node in source code. Utility method that can be
-	 * called by child classes
-	 * 
-	 * @param node
-	 */
-	public void formatNode(Node node) {
-		// XXX: there should have some other way to get the FormatProcessor.
-		// currently hardcoded to HTMLFormatProcessorImpl().
-		new HTMLFormatProcessorImpl().formatNode(node);
-	}
-
-	/**
-	 * Re-executes the Command. This method should only be called after
-	 * <code>undo()</code> has been called.
-	 */
-	public void redo() {
-		// this method should in fact never be called, because we have already
-		// delegate undo
-		// operations to source view.
-		getModel().getUndoManager().redo();
-	}
-
-	/**
-	 * Undoes the changes performed during <code>execute()</code>. This
-	 * method should only be called after <code>execute</code> has been
-	 * called, and only when <code>canUndo()</code> returns <code>true</code>.
-	 * 
-	 * @see #canUndo()
-	 */
-	public void undo() {
-		// this method should in fact never be called, because we have already
-		// delegate undo
-		// operations to source view.
-		getModel().getUndoManager().undo();
-	}
-
-	/**
-	 * a utility method. NOTE: this method can ONLY be called BEFORE you change
-	 * anything in the model.
-	 * 
-	 * @param ele
-	 * @return the figure info for the  element
-	 */
-	public IFigure getFigureInfo(Element ele) {
-		if (ele instanceof IDOMElement) {
-			EditPart part = (EditPart) ((IDOMElement) ele)
-					.getAdapterFor(EditPart.class);
-			if (part instanceof GraphicalEditPart) {
-				return ((GraphicalEditPart) part).getFigure();
-			}
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/MoveNodeCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/MoveNodeCommand.java
deleted file mode 100644
index 327a2c7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/MoveNodeCommand.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * Move a node from one place to another place.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class MoveNodeCommand extends DesignerCommand {
-	private IDOMPosition insertPosition;
-
-	private Node originalNode;
-
-	/**
-	 * @param viewer
-	 * @param insertionPoint 
-	 * @param originalNode 
-	 */
-	public MoveNodeCommand(IHTMLGraphicalViewer viewer,
-			IDOMPosition insertionPoint, Node originalNode) {
-		super(
-				CommandResources.getString("MoveNodeCommand.Label.MoveNode"), viewer); //$NON-NLS-1$
-		this.insertPosition = insertionPoint;
-		this.originalNode = originalNode;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		getModel().beginRecording(this);
-		try {
-			Node originalParent = originalNode.getParentNode();
-			if (originalParent == null) {
-				return;
-			}
-			// when remove the _originalNode, may affect the insertionPosition.
-			if (originalParent == insertPosition.getContainerNode()) {
-				// under same parent, may affect it.
-				int insertIndex = insertPosition.getOffset();
-				int nodeIndex = -1;
-				NodeList list = originalParent.getChildNodes();
-				for (int i = 0, length = list.getLength(); i < length; i++) {
-					if (originalNode == list.item(i)) {
-						nodeIndex = i;
-					}
-				}
-				if (nodeIndex == -1) {
-					return; // should not happen.
-				}
-				if (insertIndex < nodeIndex) {
-					insertPosition = new DOMPosition(originalParent,
-							insertIndex);
-				} else if (insertIndex == nodeIndex
-						|| insertIndex == nodeIndex + 1) {
-					// move to same position, do nothing.
-					return;
-				} else {
-					insertPosition = new DOMPosition(originalParent,
-							insertIndex - 1);
-				}
-			}
-			originalParent.removeChild(originalNode);
-			DOMUtil.insertNode(insertPosition, originalNode);
-		} finally {
-			getModel().endRecording(this);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected ISelection getAfterCommandDesignerSelection() {
-		return toDesignSelection(originalNode);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PDDropRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PDDropRequest.java
deleted file mode 100644
index 75c1fcf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PDDropRequest.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.requests.DropRequest;
-import org.eclipse.swt.dnd.DropTargetEvent;
-
-/**
- * @author mengbo
- */
-public class PDDropRequest extends Request implements DropRequest {
-	private Point _location;
-
-	private DropTargetEvent _currentEvent;
-
-	/**
-	 * 
-	 */
-	public PDDropRequest() {
-		setType(PDRequestConstants.REQ_DROP);
-	}
-
-	/**
-	 * Returns the location of the object to be created.
-	 * 
-	 * @return the location
-	 */
-	public Point getLocation() {
-		return _location;
-	}
-
-	/**
-	 * Sets the location where the new object will be placed.
-	 * 
-	 * @param location
-	 *            the location
-	 */
-	public void setLocation(Point location) {
-		this._location = location;
-	}
-
-	/**
-	 * @param ev
-	 */
-	public void setCurrentEvent(DropTargetEvent ev) {
-		_currentEvent = ev;
-	}
-
-	/**
-	 * @return the current drop target event
-	 */
-	public DropTargetEvent getCurrentEvent() {
-		return _currentEvent;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PDRequestConstants.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PDRequestConstants.java
deleted file mode 100644
index ca4aa70..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PDRequestConstants.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-/**
- * @author mengbo
- */
-public interface PDRequestConstants {
-
-	/**
-	 * TODO: purpose?
-	 */
-	String REQ_DROP = "pd drop";
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PaletteDropInsertCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PaletteDropInsertCommand.java
deleted file mode 100644
index 95f1c82..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PaletteDropInsertCommand.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2008 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dnd.internal.SourceViewerDragDropHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.editors.palette.TagToolPaletteEntry;
-import org.eclipse.jst.pagedesigner.elementedit.ElementEditFactoryRegistry;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEdit;
-import org.eclipse.jst.pagedesigner.itemcreation.customizer.IDropCustomizer;
-import org.eclipse.jst.pagedesigner.utils.CommandUtil;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * Handles tag creation when dropped onto the WPE source view
- * 
- * @author mengbo
- */
-public class PaletteDropInsertCommand extends SourceViewerCommand {
-
-	private final Logger _log = PDPlugin
-			.getLogger(PaletteDropInsertCommand.class);
-
-	private TagToolPaletteEntry _tagItem;
-
-	private int _location;
-
-	private Element _element;
-
-	private IAdaptable _customizationData;
-
-	/**
-	 * @param label
-	 * @param editor
-	 * @param tagItem
-	 * @param location
-	 */
-	public PaletteDropInsertCommand(String label, StructuredTextEditor editor,
-			TagToolPaletteEntry tagItem, int location) {
-		super(label, editor);
-		_tagItem = tagItem;
-		_location = location;
-	}
-
-	public void doExecute() {
-		Node node;
-		try {
-			node = getSourceEditingTextTools().getNode(_location);
-		} catch (Exception e) {
-			_log.error("Bad text insertion location", e);		
-			return;
-		}
-		IDOMPosition position = null;
-		if (node != null) {
-			position = SourceViewerDragDropHelper.getInstance()
-					.findPosition(_location, node);
-		} else {
-			if (getModel().getDocument().getFirstChild() != null) {
-				//Fix for 224541 - When palette item is dropped to end of file in source view of Web Page Editor, the item is inserted at the top of file
-				//add inside at end of necessary container
-				position = SourceViewerDragDropHelper.getInstance()
-					.findPosition(getModel().getDocument().getEndOffset(), getModel().getDocument().getFirstChild());
-			} 
-			else {
-				// empty file
-				position = new DOMPosition(getModel().getDocument(), 0);
-			}
-		}
-		
-		//essentially copied from ItemCreationTool so that DesignView drop and SourceViewDrop are same.
-		// Note that SourceView does NO drop validation checking.   This is handled by ItemCreationPolicy in DesignView
-		IStatus status = performCustomization();
-		if (status.getSeverity() == IStatus.OK) {
-			Element element = CommandUtil.excuteInsertion(this._tagItem,
-					getModel(), position, getCustomizationData());
-			if (element != null) {				
-				formatNode(element);
-			}
-			this._element = element;
-		}
-	}
-
-	/**
-	 * @return status
-	 */
-	protected IStatus performCustomization() {
-		// essentially a copy from ItemCreationTool
-		IStatus status = Status.OK_STATUS;
-		TagIdentifier tagId = TagIdentifierFactory.createJSPTagWrapper(_tagItem
-				.getURI(), _tagItem.getTagName());
-
-		IElementEdit elementEdit = ElementEditFactoryRegistry.getInstance()
-				.createElementEdit(tagId);
-
-		if (elementEdit != null) {
-			IDropCustomizer customizer = elementEdit.getDropCustomizer(tagId);
-
-			if (customizer != null) {
-				status = customizer.runCustomizer();
-
-				if (status.getSeverity() == IStatus.OK) {
-					setCustomizationData(customizer.getDropCustomizationData());
-				}
-			} 
-
-		}
-		return status;
-	}
-	
-    /**
-	 * @param customizationData
-	 */
-	public void setCustomizationData(IAdaptable customizationData) {
-		_customizationData = customizationData;
-	}
-
-	/**
-	 * This method is for test purposes and should generally not be 
-	 * used by clients.
-	 * 
-	 * @return the customization data
-	 */
-	protected final IAdaptable getCustomizationData() {
-		return _customizationData;
-	}
-	
-	public void setSelection() {
-		if (_element != null) {
-			int offset = EditModelQuery.getNodeStartIndex(_element);
-			int length = EditModelQuery.getNodeEndIndex(_element) - offset;
-			_editor.getTextViewer().setSelectedRange(offset, length);
-		}
-	}
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PasteAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PasteAction.java
deleted file mode 100644
index 46c2050..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PasteAction.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.gef.dnd.TemplateTransfer;
-import org.eclipse.gef.ui.parts.GraphicalEditor;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.commands.range.PasteCommand;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.TextTransfer;
-
-/**
- * @author mengbo
- */
-public class PasteAction extends DesignAction {
-
-	/**
-	 * @param editor
-	 */
-	public PasteAction(GraphicalEditor editor) {
-		super(editor, PDPlugin.getResourceString("Action.Name.Paste"));//$NON-NLS-1$
-	}
-
-	public void perform() {
-		DesignerCommand command = null;
-		IHTMLGraphicalViewer viewer = getViewer();
-		if (viewer.isInRangeMode()) {
-			command = new PasteCommand(viewer);
-			command.execute();
-		} else {
-			return;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#isEnabled()
-	 */
-	public boolean isEnabled() {
-		IHTMLGraphicalViewer viewer = getViewer();
-		if (viewer != null && viewer.isInRangeMode()
-				&& viewer.getRangeSelection().isValid()) {
-			Clipboard clipboard = new Clipboard(viewer.getControl()
-					.getDisplay());
-			return clipboard.getContents(TemplateTransfer.getInstance()) != null
-					|| clipboard.getContents(TextTransfer.getInstance()) != null;
-		}
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PasteNodeCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PasteNodeCommand.java
deleted file mode 100644
index 81b25a0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/PasteNodeCommand.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.text.ITextOperationTarget;
-import org.eclipse.jface.text.source.SourceViewer;
-import org.eclipse.jst.pagedesigner.commands.nav.ICaretPositionMover;
-import org.eclipse.wst.html.core.internal.document.ElementStyleImpl;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class PasteNodeCommand extends Command implements ICaretPositionMover {
-	private static final String COMMAND_LABEL = CommandResources
-			.getString("PasteNodeCommand.Label.DeleteNode"); //$NON-NLS-1$
-
-	private Node child;
-
-	private SourceViewer _sourceViewer;
-
-	/**
-	 * @param viewer
-	 */
-	public PasteNodeCommand(SourceViewer viewer) {
-		super(COMMAND_LABEL);
-		this._sourceViewer = viewer;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#execute()
-	 */
-	public void execute() {
-		_sourceViewer.getTextWidget().setSelection(
-				((ElementStyleImpl) child).getStartOffset(),
-				((ElementStyleImpl) child).getStartOffset());
-		_sourceViewer.doOperation(ITextOperationTarget.PASTE);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#redo()
-	 */
-	public void redo() {
-		_sourceViewer.doOperation(ITextOperationTarget.REDO);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#undo()
-	 */
-	public void undo() {
-		_sourceViewer.doOperation(ITextOperationTarget.UNDO);
-
-	}
-
-	/**
-	 * @param child
-	 *            The child to set.
-	 */
-	public void setChild(Node child) {
-		this.child = child;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/SourceViewerCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/SourceViewerCommand.java
deleted file mode 100644
index 2974929..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/SourceViewerCommand.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.text.TextSelection;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.wst.html.core.internal.format.HTMLFormatProcessorImpl;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-import org.eclipse.wst.sse.ui.internal.provisional.extensions.ISourceEditingTextTools;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.eclipse.wst.xml.ui.internal.provisional.IDOMSourceEditingTextTools;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public abstract class SourceViewerCommand extends Command {
-	/**
-	 * the structured text editor containing the viewer
-	 */
-	protected final StructuredTextEditor _editor;
-
-	private Document _document;
-
-	private Logger _log = PDPlugin.getLogger(SourceViewerCommand.class);
-
-	/**
-	 * @param label 
-	 * @param editor 
-	 */
-	public SourceViewerCommand(String label, StructuredTextEditor editor) {
-		super();
-		_editor = editor;
-		IDOMSourceEditingTextTools tools = getSourceEditingTextTools();
-		_document = tools.getDOMDocument();
-	}
-
-	/**
-	 * @return the text tools
-	 */
-	protected IDOMSourceEditingTextTools getSourceEditingTextTools() {
-		IDOMSourceEditingTextTools tools = (IDOMSourceEditingTextTools) _editor
-				.getAdapter(ISourceEditingTextTools.class);
-		return tools;
-	}
-
-	/**
-	 * preExecute and postExecute is a pair. () SHOULD NOT throw any exception,
-	 * if it throw any exception, it should catch itself and return false to
-	 * indicate not continue.
-	 * @return true if preExec succeeded
-	 */
-	protected final boolean preExecute() {
-		int position = 0;
-		int length = 0;
-		ISelection selection = _editor.getTextViewer().getSelection();
-		if (selection instanceof TextSelection) {
-			position = ((TextSelection) selection).getOffset();
-			length = ((TextSelection) selection).getLength();
-		}
-		getModel().beginRecording(this, getLabel(), position, length);
-		getModel().aboutToChangeModel();
-		return true;
-	}
-
-	/**
-	 * if preExecute() return true, then this method will always be called even
-	 * preExecute()/doExecute() and postExecute() fail.
-	 */
-	protected final void postExecute() {
-		getModel().changedModel();
-		getModel().endRecording(this);
-		setSelection();
-	}
-
-	/**
-	 * format the specified node in source code. Utility method that can be
-	 * called by child classes
-	 * 
-	 * @param node
-	 */
-	public final void formatNode(Node node) {
-		new HTMLFormatProcessorImpl().formatNode(node);
-	}
-
-	/**
-	 * @return the dom model
-	 */
-	protected IDOMModel getModel() {
-		Assert.isTrue(_document != null && _document instanceof IDOMNode);
-		return ((IDOMNode) _document).getModel();
-	}
-
-	public final void execute() {
-		boolean ok = preExecute();
-		if (ok) {
-			try {
-				doExecute();
-			} catch (Exception ex) {
-				// "Error in command execution"
-				_log.error("Error.SourceViewerCommand.Execution", ex); //$NON-NLS-1$
-			} finally {
-				postExecute();
-			}
-		}
-	}
-
-	/**
-	 * execute
-	 */
-	public abstract void doExecute();
-
-	/**
-	 * set the selection
-	 */
-	public abstract void setSelection();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/SwitchSelectionCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/SwitchSelectionCommand.java
deleted file mode 100644
index 6092c52..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/SwitchSelectionCommand.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands;
-
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.EditValidateUtil;
-import org.eclipse.jst.pagedesigner.parts.DocumentEditPart;
-import org.eclipse.jst.pagedesigner.parts.SubNodeEditPart;
-import org.eclipse.jst.pagedesigner.validation.caret.Target;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * A command to switch the selection
- *
- */
-public class SwitchSelectionCommand extends Command {
-	IHTMLGraphicalViewer _viewer;
-
-	/**
-	 * @param viewer
-	 */
-	public SwitchSelectionCommand(IHTMLGraphicalViewer viewer) {
-		_viewer = viewer;
-	}
-
-	public void execute() {
-		if (_viewer.isInRangeMode()) {
-			ISelection selection = _viewer.getSelection();
-			if (selection instanceof DesignRange) {
-				DesignPosition posStart = ((DesignRange) selection)
-						.getStartPosition();
-				DesignPosition posEnd = ((DesignRange) selection)
-						.getEndPosition();
-				if (EditValidateUtil.validPosition(posStart)
-						&& EditValidateUtil.validPosition(posEnd)) {
-					Node ancestor = EditModelQuery.getInstance()
-							.getCommonAncestor(posStart.getContainerNode(),
-									posEnd.getContainerNode());
-					if (ancestor instanceof Text) {
-						ancestor = ancestor.getParentNode();
-					}
-					if (ancestor instanceof Element) {
-						EditPart part = Target.resolvePart(ancestor);
-						if (part instanceof SubNodeEditPart) {
-							_viewer.select(part);
-						}
-					}
-				}
-			}
-		} else {
-			List parts = _viewer.getSelectedEditParts();
-			if (parts.size() > 0) {
-				EditPart parent = ((EditPart) parts.get(0)).getParent();
-				if (!(parent instanceof DocumentEditPart)) {
-					_viewer.select(parent);
-				}
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableDeleteColumnCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableDeleteColumnCommand.java
deleted file mode 100644
index d9ba50d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableDeleteColumnCommand.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.html;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.dom.html.TableUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableDeleteColumnCommand extends DesignerCommand {
-	private Element _tableEle;
-
-	private int _columnIndex;
-
-	private TableUtil _tableUtil;
-
-	/**
-	 * @param viewer
-	 * @param dataTable
-	 * @param index
-	 */
-	public TableDeleteColumnCommand(IHTMLGraphicalViewer viewer,
-			Element dataTable, int index) {
-		super(
-				CommandResources
-						.getString("TableDeleteColumnCommand.Label.DeleteColumn"), viewer); //$NON-NLS-1$
-		this._tableEle = dataTable;
-		this._columnIndex = index;
-		this._tableUtil = new TableUtil(this._tableEle);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#canExecute()
-	 */
-	public boolean canExecute() {
-		if (this._columnIndex < 0) {
-			return false;
-		}
-		boolean hasColSpan = _tableUtil.hasColumnSpanElement(this._columnIndex);
-		boolean isAffectedByColSpan = _tableUtil
-				.isAffectedByColSpan(this._columnIndex);
-		if (hasColSpan || isAffectedByColSpan) {
-			return false;
-		}
-
-		return super.canExecute();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected ISelection getAfterCommandDesignerSelection() {
-		return toDesignSelection(_tableEle);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		List trList = new ArrayList();
-		TableUtil.getTrElements(this._tableEle, trList);
-
-		List[] lists = _tableUtil.getTrCellLists();
-
-		for (int i = 0, size = trList.size(); i < size; i++) {
-			Element tr = (Element) trList.get(i);
-			List cells = lists[i];
-			if (cells.size() <= this._columnIndex) {
-				continue;
-			}
-			Element cell = (Element) cells.get(this._columnIndex);
-			if (!cell.getTagName().equalsIgnoreCase("fake")) //$NON-NLS-1$
-			{
-				tr.removeChild(cell);
-			}
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableDeleteHeaderFooterCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableDeleteHeaderFooterCommand.java
deleted file mode 100644
index 432e204..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableDeleteHeaderFooterCommand.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.html;
-
-import java.util.List;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.dom.html.TableUtil;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableDeleteHeaderFooterCommand extends DesignerCommand {
-	private Element _table;
-
-	private boolean _isHeader;
-
-	/**
-	 * @param viewer
-	 * @param table
-	 * @param isHeader
-	 */
-	public TableDeleteHeaderFooterCommand(IHTMLGraphicalViewer viewer,
-			Element table, boolean isHeader) {
-		super(
-				isHeader ? CommandResources
-						.getString("TableDeleteHeaderFooterCommand.Label.DeleteHeader") : CommandResources.getString("TableDeleteHeaderFooterCommand.Label.DeleteFooter"), viewer); //$NON-NLS-1$ //$NON-NLS-2$
-		this._table = table;
-		this._isHeader = isHeader;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#canExecute()
-	 */
-	public boolean canExecute() {
-		String sectionName = this._isHeader ? IHTMLConstants.TAG_THEAD
-				: IHTMLConstants.TAG_TFOOT;
-		int rows = TableUtil.countSectionRows(this._table, sectionName);
-		if (rows == 0) {
-			return false;
-		}
-		return super.canExecute();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		String sectionName = this._isHeader ? IHTMLConstants.TAG_THEAD
-				: IHTMLConstants.TAG_TFOOT;
-		List list = DOMUtil.getChildElementsByTagIgnoreCase(this._table,
-				sectionName);
-		Node delNode = (Node) list.get(0);
-		this._table.removeChild(delNode);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected ISelection getAfterCommandDesignerSelection() {
-		return this.toDesignSelection(this._table);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableDeleteRowCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableDeleteRowCommand.java
deleted file mode 100644
index 3ee5ea7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableDeleteRowCommand.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.html;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.dom.html.TableUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableDeleteRowCommand extends DesignerCommand {
-	Element _tableEle;
-
-	int _rowIndex;
-
-	/**
-	 * @param viewer
-	 * @param table
-	 * @param index
-	 */
-	public TableDeleteRowCommand(IHTMLGraphicalViewer viewer, Element table,
-			int index) {
-		super(CommandResources
-				.getString("TableDeleteRowCommand.Label.DeleteRow"), viewer); //$NON-NLS-1$
-		this._tableEle = table;
-		this._rowIndex = index;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#canExecute()
-	 */
-	public boolean canExecute() {
-		if (this._rowIndex < 0) {
-			return false;
-		}
-		List list = new ArrayList();
-		TableUtil.getTrElements(this._tableEle, list);
-		// int index = TableUtil.countRowIndexInDOMTree(this._tableEle,
-		// this._rowIndex);
-		int index = this._rowIndex;
-		Element tr = (Element) list.get(index);
-		boolean hasRowSpan = TableUtil.hasRowSpanElement(tr);
-		boolean isAffectedByRowSpan = TableUtil.isAffectedByRowSpan(list, tr,
-				index);
-		if (hasRowSpan || isAffectedByRowSpan) {
-			return false;
-		}
-
-		return super.canExecute();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected ISelection getAfterCommandDesignerSelection() {
-		return toDesignSelection(_tableEle);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		List list = new ArrayList();
-		TableUtil.getTrElements(this._tableEle, list);
-		// int index = TableUtil.countRowIndexInDOMTree(this._tableEle,
-		// this._rowIndex);
-		int index = this._rowIndex;
-		Element tr = (Element) list.get(index);
-		tr.getParentNode().removeChild(tr);
-		formatNode(this._tableEle);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableInsertColumnCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableInsertColumnCommand.java
deleted file mode 100644
index 4db65c8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableInsertColumnCommand.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.commands.html;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.dom.html.TableUtil;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableInsertColumnCommand extends DesignerCommand {
-	private Element _tableEle;
-
-	private int _columnIndex;
-
-	private TableUtil _tableUtil;
-
-	/**
-	 * @param viewer
-	 * @param dataTable
-	 * @param index
-	 */
-	public TableInsertColumnCommand(IHTMLGraphicalViewer viewer,
-			Element dataTable, int index) {
-		super(
-				CommandResources
-						.getString("TableInsertColumnCommand.Label.InsertColumn"), viewer); //$NON-NLS-1$
-		this._tableEle = dataTable;
-		this._columnIndex = index;
-		this._tableUtil = new TableUtil(this._tableEle);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#canExecute()
-	 */
-	public boolean canExecute() {
-		if (this._columnIndex < 0) {
-			return false;
-		}
-		boolean isAffectedByColSpan = _tableUtil
-				.isAffectedByColSpan(this._columnIndex);
-		if (isAffectedByColSpan) {
-			return false;
-		}
-
-		return super.canExecute();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected ISelection getAfterCommandDesignerSelection() {
-		return toDesignSelection(_tableEle);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		List trList = new ArrayList();
-		TableUtil.getTrElements(this._tableEle, trList);
-
-		List[] lists = _tableUtil.getTrCellLists();
-		int maxColumn = _tableUtil.getColumnCount();
-
-		boolean isAtLastColumn = false;
-		if (this._columnIndex >= maxColumn) {
-			isAtLastColumn = true;
-		}
-
-		for (int i = 0, size = trList.size(); i < size; i++) {
-			Element tr = (Element) trList.get(i);
-			boolean hasTH = (DOMUtil.getChildElementsByTagIgnoreCase(tr,
-					IHTMLConstants.TAG_TH).size() > 0);
-
-			List cells = lists[i];
-			if (isAtLastColumn || (cells.size() <= this._columnIndex)) {
-				int index = this._columnIndex + 1;
-				for (int k = cells.size(); k < index; k++) {
-					tr.appendChild(createDefaultElement(hasTH));
-				}
-			} else {
-				Element cell = (Element) cells.get(this._columnIndex);
-				if (!cell.getTagName().equalsIgnoreCase("fake")) //$NON-NLS-1$
-				{
-					tr.insertBefore(createDefaultElement(hasTH), cell);
-				} else {
-					boolean hasRealElement = false;
-					for (int k = _columnIndex + 1; k < cells.size(); k++) {
-						Element td = (Element) cells.get(k);
-						if (!td.getTagName().equalsIgnoreCase("fake")) //$NON-NLS-1$
-						{
-							hasRealElement = true;
-							tr.insertBefore(createDefaultElement(hasTH), td);
-							break;
-						}
-					}
-					if (!hasRealElement) {
-						tr.appendChild(createDefaultElement(hasTH));
-					}
-				}
-			}
-
-		}
-		formatNode(this._tableEle);
-	}
-
-	private Element createDefaultElement(boolean createTH) {
-		Document doc = this._tableEle.getOwnerDocument();
-		Element td = null;
-		if (createTH) {
-			td = doc.createElement(IHTMLConstants.TAG_TH);
-		} else {
-			td = doc.createElement(IHTMLConstants.TAG_TD);
-		}
-
-		Node node = doc.createTextNode(""); //$NON-NLS-1$
-		td.appendChild(node);
-		return td;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableInsertHeaderFooterCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableInsertHeaderFooterCommand.java
deleted file mode 100644
index c3cc31e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableInsertHeaderFooterCommand.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.html;
-
-import java.util.List;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.dom.html.TableUtil;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableInsertHeaderFooterCommand extends DesignerCommand {
-	private Element _table;
-
-	private Element _headerOrFooter;
-
-	private boolean _isHeader;
-
-	private TableUtil _tableUtil;
-
-	/**
-	 * @param viewer
-	 * @param table
-	 * @param isHeader
-	 */
-	public TableInsertHeaderFooterCommand(IHTMLGraphicalViewer viewer,
-			Element table, boolean isHeader) {
-		super(
-				isHeader ? CommandResources
-						.getString("TableInsertHeaderFooterCommand.Label.InsertHeader") : CommandResources.getString("TableInsertHeaderFooterCommand.Label.InsertFooter"), viewer); //$NON-NLS-1$ //$NON-NLS-2$
-		this._table = table;
-		this._isHeader = isHeader;
-		this._tableUtil = new TableUtil(this._table);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#canExecute()
-	 */
-	public boolean canExecute() {
-		String sectionName = this._isHeader ? IHTMLConstants.TAG_THEAD
-				: IHTMLConstants.TAG_TFOOT;
-		int rows = TableUtil.countSectionRows(this._table, sectionName);
-		if (rows > 0) {
-			return false;
-		}
-		return super.canExecute();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		String sectionName = this._isHeader ? IHTMLConstants.TAG_THEAD
-				: IHTMLConstants.TAG_TFOOT;
-		this._headerOrFooter = this._table.getOwnerDocument().createElement(
-				sectionName);
-		Element tr = createDefaultElement();
-		this._headerOrFooter.appendChild(tr);
-		if (this._isHeader) {
-			Node child = this._table.getFirstChild();
-			this._table.insertBefore(this._headerOrFooter, child);
-		} else {
-			int headRows = TableUtil.countSectionRows(this._table,
-					IHTMLConstants.TAG_THEAD);
-			Node refNode = null;
-			if (headRows > 0) {
-				List list = DOMUtil.getChildElementsByTagIgnoreCase(
-						this._table, IHTMLConstants.TAG_THEAD);
-				Node header = (Node) list.get(0);
-				refNode = header.getNextSibling();
-			} else {
-				refNode = this._table.getFirstChild();
-			}
-			this._table.insertBefore(this._headerOrFooter, refNode);
-		}
-		formatNode(this._headerOrFooter);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected ISelection getAfterCommandDesignerSelection() {
-		return this.toDesignSelection(this._headerOrFooter);
-	}
-
-	private Element createDefaultElement() {
-		String key = this._isHeader ? "TableInsertHeaderFooterCommand.ColumnHeader" //$NON-NLS-1$
-				: "TableInsertHeaderFooterCommand.ColumnFooter"; //$NON-NLS-1$
-		String name = PDPlugin.getResourceString(key);
-		Document doc = this._table.getOwnerDocument();
-		Element ele = doc.createElement(IHTMLConstants.TAG_TR);
-		int columnCount = _tableUtil.getColumnCount();
-		for (int i = 0; i < columnCount; i++) {
-			Element td = null;
-			if (this._isHeader) {
-				td = doc.createElement(IHTMLConstants.TAG_TH);
-			} else {
-				td = doc.createElement(IHTMLConstants.TAG_TD);
-			}
-			Node node = doc.createTextNode(name);
-			td.appendChild(node);
-			ele.appendChild(td);
-		}
-		return ele;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableInsertRowCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableInsertRowCommand.java
deleted file mode 100644
index e9acb53..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableInsertRowCommand.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.html;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.dom.html.TableUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableInsertRowCommand extends DesignerCommand {
-	private Element _tableEle;
-
-	private int _rowIndex;
-
-	private boolean _isBefore;
-
-	private TableUtil _tableUtil;
-
-	/**
-	 * @param viewer
-	 * @param table
-	 * @param index
-	 * @param isBefore 
-	 */
-	public TableInsertRowCommand(IHTMLGraphicalViewer viewer, Element table,
-			int index, boolean isBefore) {
-		super(CommandResources
-				.getString("TableInsertRowCommand.Label.InsertRow"), viewer); //$NON-NLS-1$
-		this._tableEle = table;
-		this._rowIndex = index;
-		this._isBefore = isBefore;
-		this._tableUtil = new TableUtil(this._tableEle);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#canExecute()
-	 */
-	public boolean canExecute() {
-		if (this._rowIndex < 0) {
-			return false;
-		}
-		List list = new ArrayList();
-		TableUtil.getTrElements(this._tableEle, list);
-		// if the row neither at the beginning nor the end then count
-		if (_rowIndex > 0 && _rowIndex < list.size()) {
-			// int index = TableUtil.countRowIndexInDOMTree(this._tableEle,
-			// this._rowIndex);
-			int index = this._rowIndex;
-			Element tr = (Element) list.get(index);
-			boolean isAffectedByRowSpan = TableUtil.isAffectedByRowSpan(list,
-					tr, index);
-			if (isAffectedByRowSpan) {
-				return false;
-			}
-
-		}
-
-		return super.canExecute();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected ISelection getAfterCommandDesignerSelection() {
-		return toDesignSelection(_tableEle);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		List list = new ArrayList();
-		TableUtil.getTrElements(this._tableEle, list);
-		Element insertElement = createDefaultElement();
-
-		if (this._rowIndex < list.size()) {
-			// int index = TableUtil.countRowIndexInDOMTree(this._tableEle,
-			// this._rowIndex);
-			int index = this._rowIndex;
-			Element tr = (Element) list.get(index);
-			Element nextTr = tr;
-
-			// int headRows = TableUtil.countSectionRows(this._tableEle,
-			// IHTMLConstants.TAG_THEAD);
-			// int footRows = TableUtil.countSectionRows(this._tableEle,
-			// IHTMLConstants.TAG_TFOOT);
-			if (!_isBefore) {
-				int parentIndex = index - 1;
-				/**
-				 * doesn't need any more,since the row index is from model now
-				 * int bodyRows = list.size() - headRows - footRows; boolean
-				 * hasBodyRow = false; boolean hasFootRow = false; if (bodyRows >
-				 * 0) { hasBodyRow = true; } if (footRows > 0) { hasFootRow =
-				 * true; } //last row in THEAD excute insert row after command
-				 * if ((this._rowIndex == headRows) && hasBodyRow && hasFootRow) {
-				 * parentIndex = index - footRows - 1; } //last row in TBODY
-				 * excute insert row after command if ((this._rowIndex ==
-				 * (list.size() - footRows)) && hasBodyRow && hasFootRow) {
-				 * parentIndex = list.size() - 1; }
-				 */
-
-				tr = (Element) list.get(parentIndex);
-			}
-
-			if (tr.getParentNode() == nextTr.getParentNode()) {
-				tr.getParentNode().insertBefore(insertElement, nextTr);
-			} else {
-				tr.getParentNode().appendChild(insertElement);
-			}
-		} else {
-			// int index = TableUtil.countRowIndexInDOMTree(this._tableEle,
-			// this._rowIndex - 1);
-			int index = this._rowIndex - 1;
-			Element tr = (Element) list.get(index);
-			tr.getParentNode().insertBefore(insertElement, null);
-		}
-		formatNode(this._tableEle);
-
-	}
-
-	private Element createDefaultElement() {
-		Document doc = this._tableEle.getOwnerDocument();
-		Element ele = doc.createElement(IHTMLConstants.TAG_TR);
-		int columnCount = _tableUtil.getColumnCount();
-		for (int i = 0; i < columnCount; i++) {
-			Element td = doc.createElement(IHTMLConstants.TAG_TD);
-			Node node = doc.createTextNode(""); //$NON-NLS-1$
-			td.appendChild(node);
-			ele.appendChild(td);
-		}
-		return ele;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableResizeColumnCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableResizeColumnCommand.java
deleted file mode 100644
index d11ef19..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableResizeColumnCommand.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.html;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.dom.DOMStyleUtil;
-import org.eclipse.jst.pagedesigner.dom.html.TableUtil;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableResizeColumnCommand extends DesignerCommand {
-	private Element _table;
-
-	private TableUtil _tableUtil;
-
-	private int _columnIndex;
-
-	private int _delta;
-
-	/**
-	 * @param viewer
-	 * @param table
-	 * @param columnIndex
-	 * @param delta
-	 */
-	public TableResizeColumnCommand(IHTMLGraphicalViewer viewer, Element table,
-			int columnIndex, int delta) {
-		super(
-				CommandResources
-						.getString("TableResizeColumnCommand.Label.ResizeColumn"), viewer); //$NON-NLS-1$
-		this._table = table;
-		this._columnIndex = columnIndex;
-		this._delta = delta;
-		_tableUtil = new TableUtil(this._table);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected ISelection getAfterCommandDesignerSelection() {
-		return toDesignSelection(_table);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		int index = this._columnIndex - 1;
-		if (index < 0) {
-			index = 0;
-		}
-		List list = _tableUtil.getColumnCells(index);
-		Iterator itr = list.iterator();
-		Element cell = null;
-		while (itr.hasNext()) {
-			Element ele = (Element) itr.next();
-			if (ele.getTagName().equalsIgnoreCase("fake") || DOMUtil.getIntAttributeIgnoreCase(ele, IHTMLConstants.ATTR_COLSPAN, 1) > 1) //$NON-NLS-1$
-			{
-				continue;
-			}
-			cell = ele;
-			break;
-		}
-
-		IFigure cellFigure = getFigureInfo(cell);
-		int oldColumnWidth = cellFigure.getBounds().width;
-		int cellPadding = cellFigure.getInsets().getWidth();
-		int newWidth = oldColumnWidth + this._delta - cellPadding;
-		if (this._columnIndex - 1 < 0) {
-			newWidth = oldColumnWidth - this._delta - cellPadding;
-		}
-		Map map = new HashMap();
-		if (newWidth > 0) {
-			map.put(ICSSPropertyID.ATTR_WIDTH, newWidth + "px"); //$NON-NLS-1$
-			DOMStyleUtil.insertStyle(cell, map);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableResizeRowCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableResizeRowCommand.java
deleted file mode 100644
index cdd1002..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/html/TableResizeRowCommand.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.html;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.dom.DOMStyleUtil;
-import org.eclipse.jst.pagedesigner.dom.html.TableUtil;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableResizeRowCommand extends DesignerCommand {
-	private Element _table;
-
-	private int _rowIndex;
-
-	private int _delta;
-
-	/**
-	 * @param viewer
-	 * @param table
-	 * @param rowIndex
-	 * @param delta
-	 */
-	public TableResizeRowCommand(IHTMLGraphicalViewer viewer, Element table,
-			int rowIndex, int delta) {
-		super(CommandResources
-				.getString("TableResizeRowCommand.Label.ResizeColumn"), viewer); //$NON-NLS-1$
-		this._table = table;
-		this._rowIndex = rowIndex;
-		this._delta = delta;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected ISelection getAfterCommandDesignerSelection() {
-		return toDesignSelection(this._table);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		int index = this._rowIndex - 1;
-		if (index < 0) {
-			index = 0;
-		}
-		// int domIndex = TableUtil.countRowIndexInDOMTree(this._table, index);
-		int domIndex = index;
-
-		List list = new ArrayList();
-		TableUtil.getTrElements(this._table, list);
-		Element tr = (Element) list.get(domIndex);
-
-		IFigure cellFigure = getFigureInfo(tr);
-		int oldRowHeight = cellFigure.getBounds().height;
-		int cellPadding = cellFigure.getInsets().getHeight();
-		int newHeight = oldRowHeight + this._delta - cellPadding;
-		if (this._rowIndex - 1 < 0) {
-			newHeight = oldRowHeight - this._delta - cellPadding;
-		}
-		Map map = new HashMap();
-		if (newHeight > 0) {
-			map.put(ICSSPropertyID.ATTR_HEIGHT, newHeight + "px"); //$NON-NLS-1$ //$NON-NLS-2$
-			DOMStyleUtil.insertStyle(tr, map);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/CaretPositionTracker.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/CaretPositionTracker.java
deleted file mode 100644
index 7295210..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/CaretPositionTracker.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.nav;
-
-/**
- * @author mengbo
- */
-public interface CaretPositionTracker {
-	/**
-	 * @return Returns the xoffset.
-	 */
-	public int getXoffset();
-
-	/**
-	 * @param xoffset
-	 *            The xoffset to set.
-	 */
-	public void setXoffset(int xoffset);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/HorizontalMoveCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/HorizontalMoveCommand.java
deleted file mode 100644
index 044ab8e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/HorizontalMoveCommand.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.nav;
-
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dom.EditHelper;
-import org.eclipse.jst.pagedesigner.parts.SubNodeEditPart;
-import org.eclipse.jst.pagedesigner.parts.TextEditPart;
-import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.IMovementMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.InlineEditingNavigationMediator;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.DesignRefPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- */
-public class HorizontalMoveCommand extends Command implements
-		ICaretPositionMover {
-	private static Logger _log = PDPlugin
-			.getLogger(HorizontalMoveCommand.class);
-
-	IHTMLGraphicalViewer _viewer;
-
-	boolean _forward;
-
-	boolean _onlyMoveEnd;
-
-	/**
-	 * @param viewer
-	 * @param b
-	 * @param c
-	 */
-	public HorizontalMoveCommand(IHTMLGraphicalViewer viewer, boolean b,
-			boolean c) {
-		_viewer = viewer;
-		_forward = b;
-		_onlyMoveEnd = c;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#execute()
-	 */
-	public void execute() {
-		DesignPosition position = null;
-		if (_viewer.isInRangeMode()) {
-			if (_viewer.getRangeSelection() != null
-					&& _viewer.getRangeSelection().isValid()) {
-				position = _viewer.getRangeSelection().getEndPosition();
-				position = performInlineMode(_forward);
-			}
-		} else {
-			position = performObjectMode();
-		}
-		setRange(position);
-	}
-
-	private DesignPosition performObjectMode() {
-		DesignPosition result = null;
-		IMovementMediator validator = new InlineEditingNavigationMediator(
-				new ActionData(ActionData.KEYBOARD_NAVAGATION, null));
-		DesignPosition position = getCurrentObjectPosition();
-		if (position != null) {
-			_viewer.setRange(position, position);
-			if (!validator.isValidPosition(position)) {
-				position = performInlineMode(_forward);
-				if (validator.isValidPosition(position)) {
-					result = position;
-				} else {
-					result = performInlineMode(!_forward);
-				}
-			} else {
-				result = position;
-			}
-		}
-		return result;
-	}
-
-	private DesignPosition performInlineMode(boolean forward) {
-		DesignRange range = _viewer.getRangeSelection();
-
-		if (range == null || !range.isValid()) {
-			_log.error("invalud range");
-			return null;
-		}
-
-		DesignPosition position = range.getEndPosition();
-		if (position.getContainerPart() instanceof TextEditPart) {
-			int length = ((TextEditPart) position.getContainerPart())
-					.getTextData().length();
-			int newoffset = position.getOffset() + (_forward ? 1 : -1);
-			if (newoffset >= 0 && newoffset <= length) {
-				DesignPosition newposi = new DesignPosition(position
-						.getContainerPart(), newoffset);
-				return newposi;
-			}
-		}
-		DesignPosition newpos = EditHelper.moveToNextEditPosition(
-				ActionData.KEYBOARD_NAVAGATION, position, forward);
-		return newpos;
-	}
-
-	private void setRange(DesignPosition newpos) {
-		if (_onlyMoveEnd) {
-			_viewer.setRangeEndPosition(newpos);
-		} else {
-			_viewer.setRange(newpos, newpos);
-		}
-	}
-
-	private DesignPosition getCurrentObjectPosition() {
-		DesignRange result = null;
-		if (_viewer.isInRangeMode()) {
-			result = _viewer.getRangeSelection();
-		} else {
-			List parts = _viewer.getSelectedEditParts();
-			if (parts.size() > 0) {
-				EditPart selection = (EditPart) parts.get(0);
-				if (selection instanceof SubNodeEditPart) {
-					DesignPosition position = new DesignRefPosition(selection,
-							_forward);
-					result = new DesignRange(position, position);
-				}
-			}
-		}
-		return result != null && result.isValid() ? result.getEndPosition()
-				: null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/ICaretPositionMover.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/ICaretPositionMover.java
deleted file mode 100644
index ca75659..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/ICaretPositionMover.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.nav;
-
-/**
- * Tags commands that care about caret position
- * TODO: does presently appear to have a purpose
- * 
- * @author mengbo
- * 
- */
-public interface ICaretPositionMover {
-    // empty; tagging interface
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/VerticalMoveCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/VerticalMoveCommand.java
deleted file mode 100644
index 492b495..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/nav/VerticalMoveCommand.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.nav;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.IMovementMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.InlineEditingNavigationMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.Target;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.EditPartPositionHelper;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.widgets.Caret;
-
-/**
- * @author mengbo
- */
-public class VerticalMoveCommand extends Command {
-	private static Logger _log = PDPlugin
-			.getLogger(HorizontalMoveCommand.class);
-
-	IHTMLGraphicalViewer _viewer;
-
-	boolean _up;
-
-	boolean _onlyMoveEnd;
-
-	/**
-	 * @param viewer
-	 * @param up
-	 * @param c
-	 */
-	public VerticalMoveCommand(IHTMLGraphicalViewer viewer, boolean up,
-			boolean c) {
-		_viewer = viewer;
-		_up = up;
-		_onlyMoveEnd = c;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#execute()
-	 */
-	public void execute() {
-		int OFFSET = 2;
-		DesignRange range = _viewer.getRangeSelection();
-		if (range == null || !range.isValid()) {
-			_log.error("invalud range");
-			return;
-		}
-		IMovementMediator moveMediator = new InlineEditingNavigationMediator(
-				new ActionData(ActionData.KEYBOARD_NAVAGATION, null));
-		DesignPosition position = range.getEndPosition();
-		Caret caret = _viewer.getCaret();
-		Point point = null;
-		DesignPosition newPos = position;
-		EditPart containerpart = null, rootpart1;
-		if (_up) {
-			point = new Point(((CaretPositionTracker) _viewer).getXoffset(),
-					caret.getBounds().y);
-		} else {
-			point = new Point(((CaretPositionTracker) _viewer).getXoffset(),
-					caret.getBounds().y + caret.getBounds().height);
-
-		}
-		rootpart1 = getRootEditablePart(position.getContainerPart(),
-				moveMediator);// position.getContainerPart();
-		if (rootpart1 == null) {
-			return;
-		}
-        
-        point = adjustLocation(rootpart1, point);
-		Rectangle bound = EditPartPositionHelper.getAbsoluteBounds(rootpart1);
-		// get current according to the point.
-		// FlowBoxLine line =
-		// getCurrentLine(moveMediator.getEditableContainer(new
-		// Target(rootpart)), point, moveMediator);
-		while (true) {
-			// try to change offset and then to search for new point.
-			if (_up) {
-				point.y -= OFFSET;
-				if (point.y <= bound.y) {
-					newPos = position;
-					break;
-				}
-			} else {
-				point.y += OFFSET;
-				if (point.y >= bound.y + bound.height) {
-					newPos = position;
-					break;
-				}
-			}
-			containerpart = ((InlineEditingNavigationMediator) moveMediator)
-					.getConstainedEditableContainer(position, point, _viewer);
-			if (containerpart != null) {
-				if (!EditModelQuery.isChild(Target.resolveNode(rootpart1),
-						Target.resolveNode(containerpart))) {
-					containerpart = rootpart1;
-				}
-				bound = EditPartPositionHelper.getAbsoluteBounds(rootpart1);
-				newPos = EditPartPositionHelper
-						.findEditPartPositionConstrained(containerpart, point,
-								moveMediator);
-			} else {
-				newPos = position;
-				break;
-			}
-			if (newPos != null) {
-				if (found(newPos, position)) {
-					break;
-				}
-			}
-		}
-		setRange(position, newPos);
-	}
-
-	private void setRange(DesignPosition position, DesignPosition newPos) {
-		if (!EditModelQuery.isSame(position, newPos)) {
-			{
-				if (_onlyMoveEnd) {
-					_viewer.setRangeEndPosition(newPos);
-				} else {
-					_viewer.setRange(newPos, newPos);
-				}
-			}
-		}
-	}
-
-	/*
-	 * We should change this, it is too tricky to do in this way.
-	 */
-	private Point adjustLocation(EditPart rootPart, Point point) {
-		Point result = point.getCopy();
-		Rectangle bounds = EditPartPositionHelper.getAbsoluteBounds(rootPart);
-		if (!bounds.contains(point)) {
-			if (bounds.getLeft().x > point.x) {
-				result.x = bounds.getLeft().x;
-			} else if (bounds.getRight().x < point.x) {
-				result.x = bounds.getRight().x;
-			}
-		}
-		return result;
-	}
-
-	private EditPart getRootEditablePart(EditPart part,
-			IMovementMediator moveMediator) {
-		EditPart rootpart = null;
-		if ((rootpart = ((InlineEditingNavigationMediator) moveMediator)
-				.getRootConstainedEditableContainer(new Target(part))) == null) {
-			rootpart = moveMediator.getEditableContainer(new Target(part));
-		}
-		return rootpart;
-	}
-
-	private boolean found(DesignPosition newPos, DesignPosition prevPos) {
-		Rectangle newRec = EditPartPositionHelper
-				.convertToAbsoluteCaretRect(newPos);
-		Rectangle prevRec = EditPartPositionHelper
-				.convertToAbsoluteCaretRect(prevPos);
-		if (_up) {
-			return getYDistance(newRec, prevRec, _up) < 0;
-		}
-        return getYDistance(newRec, prevRec, _up) > 0;
-	}
-
-	/**
-	 * Distance from rec1 to rec2 at y coordination, if top, compare top,
-	 * otherwise compare bottom.
-	 * 
-	 * @param rec1
-	 * @param rec2
-	 * @param up
-	 * @return
-	 */
-	private int getYDistance(Rectangle rec1, Rectangle rec2, boolean top) {
-		if (rec1.getCopy().intersect(rec2).height > 0) {
-			return 0;
-		}
-        if (top) {
-        	return rec1.getTop().y - rec2.getTop().y;
-        }
-        return rec1.getBottom().y - rec2.getBottom().y;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ApplyStyleCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ApplyStyleCommand.java
deleted file mode 100644
index 2f087a6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ApplyStyleCommand.java
+++ /dev/null
@@ -1,509 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public class ApplyStyleCommand extends RangeModeCommand {
-	private String _tag;
-
-	private String _cssProperty;
-
-	private String _cssPropertyValue;
-
-	private final Element _applyingNode;
-
-	/**
-	 * @param viewer
-	 * @param tag 
-	 * @param property 
-	 * @param value 
-	 */
-	public ApplyStyleCommand(IHTMLGraphicalViewer viewer, String tag,
-			String property, String value) {
-		super(
-				CommandResources
-						.getString("ApplyStyleCommand.Label.ApplyStyle"), viewer); //$NON-NLS-1$
-		this._tag = tag;
-		this._cssProperty = property;
-		this._cssPropertyValue = value;
-		this._applyingNode = null;
-	}
-
-	/**
-	 * @param viewer
-	 * @param node
-	 * @param property
-	 * @param value
-	 */
-	public ApplyStyleCommand(IHTMLGraphicalViewer viewer, Element node,
-			String property, String value) {
-		super(
-				CommandResources
-						.getString("ApplyStyleCommand.Label.ApplyStyle"), viewer); //$NON-NLS-1$
-		this._applyingNode = node;
-	}
-
-	/**
-	 * @return the applying node (may be null)
-	 */
-	protected final Element getApplyingNode() {
-        return _applyingNode;
-    }
-
-    /*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected DOMRange doRangeExecute(DOMRange range) {
-		if (range == null || range.isEmpty()) {
-			return null;
-		}
-
-		boolean ordered = range.isOrdered();
-		IDOMPosition start = ordered ? range.getStartPosition() : range
-				.getEndPosition();
-		IDOMPosition end = ordered ? range.getEndPosition() : range
-				.getStartPosition();
-
-		Node startContainer = start.getContainerNode();
-		Node endContainer = end.getContainerNode();
-
-		Node common = DOMUtil.findCommonAncester(start.getContainerNode(), end
-				.getContainerNode());
-		if (common == null) {
-			// should not happen.
-			return null;
-		}
-
-		if (common instanceof Text) {
-			// under the same Text scope
-			range = doTextNodeStyleApply((Text) common, start.getOffset(), end
-					.getOffset());
-
-			return range;
-		}
-        
-        if (startContainer instanceof Text) {
-        	// if the start offset is 0,then skip split the Text
-        	if (start.getOffset() > 0) {
-        		startContainer = ((Text) startContainer).splitText(start
-        				.getOffset());
-        		start = new DOMRefPosition(startContainer, false);
-        	}
-        } else {
-        	startContainer = start.getNextSiblingNode();
-        }
-        if (endContainer instanceof Text) {
-        	if (end.getOffset() > 0) {
-        		endContainer = ((Text) endContainer).splitText(end
-        				.getOffset());
-        		endContainer = endContainer.getPreviousSibling();
-        	} else {
-        		endContainer = endContainer.getPreviousSibling();
-        	}
-        } else {
-        	endContainer = end.getPreviousSiblingNode();
-        }
-
-        for (Node node = startContainer; node != endContainer; node = EditModelQuery
-        		.getInstance().getNextLeafNeighbor(node)) {
-        	if (EditModelQuery.hasAncestor(node, getTag(), true)) {
-        		continue;
-        	}
-        	Element newnode = createStyleElement();
-        	node.getParentNode().insertBefore(newnode, node);
-        	newnode.appendChild(node);
-        }
-        if (!EditModelQuery.hasAncestor(endContainer, getTag(), true)) {
-        	Element newnode = createStyleElement();
-        	endContainer.getParentNode()
-        			.insertBefore(newnode, endContainer);
-        	newnode.appendChild(endContainer);
-        }
-
-		// merge the style tags
-
-		for (Node node = startContainer; node != endContainer; node = EditModelQuery
-				.getInstance().getNextLeafNeighbor(node)) {
-			Node stylenode = node;
-			while (stylenode != null
-					&& !stylenode.getNodeName().equalsIgnoreCase(getTag())) {
-				stylenode = stylenode.getParentNode();
-			}
-			if (stylenode == null) {
-				continue;
-			}
-			if (stylenode.getNextSibling() != null
-					&& stylenode.getNextSibling().getNodeName()
-							.equalsIgnoreCase(getTag())) {
-				Node sibling = stylenode.getNextSibling();
-				while (sibling.getFirstChild() != null) {
-					stylenode.appendChild(sibling.getFirstChild());
-				}
-				stylenode.getParentNode().removeChild(sibling);
-				node = startContainer;
-			}
-		}
-
-		return new DOMRange(start, end);
-
-		/*
-		 * boolean ordered = range.isOrdered(); IDOMPosition start = ordered ?
-		 * range.getStartPosition() : range.getEndPosition(); IDOMPosition end =
-		 * ordered ? range.getEndPosition() : range.getStartPosition();
-		 * 
-		 * Node common = DOMUtil.findCommonAncester(start.getContainerNode(),
-		 * end.getContainerNode()); if (common == null) { // should not happen.
-		 * return null; }
-		 * 
-		 * DOMRange result = null; if (common instanceof Text) { result =
-		 * doTextNodeStyleApply((Text) common, start.getOffset(),
-		 * end.getOffset()); } else { IDOMPosition startPosition = start;
-		 * IDOMPosition endPosition = end; Node ancester = common; DOMRange[]
-		 * leftRange = new DOMRange[1]; DOMRange[] rightRange = new DOMRange[1];
-		 * 
-		 * startPosition = partialApply(startPosition, ancester, true,
-		 * leftRange); endPosition = partialApply(endPosition, ancester, false,
-		 * rightRange); DOMRange middle = middleApply(ancester, startPosition,
-		 * endPosition);
-		 * 
-		 * IDOMPosition startref = null; if (leftRange[0] != null &&
-		 * leftRange[0].getStartPosition() != null) { startref =
-		 * leftRange[0].getStartPosition(); } else if (middle != null &&
-		 * middle.getStartPosition() != null) { startref =
-		 * middle.getStartPosition(); } else if (rightRange[0] != null &&
-		 * rightRange[0].getStartPosition() != null) { startref =
-		 * rightRange[0].getStartPosition(); }
-		 * 
-		 * IDOMPosition endref = null; if (rightRange[0] != null &&
-		 * rightRange[0].getEndPosition() != null) { endref =
-		 * rightRange[0].getEndPosition(); } else if (middle != null &&
-		 * middle.getEndPosition() != null) { endref = middle.getEndPosition(); }
-		 * else if (leftRange[0] != null && leftRange[0].getEndPosition() !=
-		 * null) { endref = leftRange[0].getEndPosition(); }
-		 * 
-		 * if (startref == null) { result = null; } else { startref = new
-		 * DOMPosition(EditModelQuery.getInstance().getNextLeafNeighbor(startref.getContainerNode()),
-		 * 0); System.out.println(startref.toString()); endref = new
-		 * DOMPosition(endref.getContainerNode(), 0); result = new
-		 * DOMRange(startref, endref); } }
-		 * 
-		 * if (result == null) { return null; }
-		 * 
-		 * if (ordered) { return result; } else { return new
-		 * DOMRange(result.getEndPosition(), result.getStartPosition()); }
-		 */
-	}
-
-    // TODO: unused code.  Dead?
-//	private DOMRange middleApply(Node ancester, IDOMPosition startPosition,
-//			IDOMPosition endPosition) {
-//		startPosition = skip(startPosition, true);
-//		if (startPosition.getNextSiblingNode() == null
-//				|| startPosition.getOffset() >= endPosition.getOffset()) {
-//			return null;
-//		} else {
-//			List needMove = new ArrayList();
-//			Node startNext = startPosition.getNextSiblingNode();
-//			Node endNext = endPosition.getNextSiblingNode();
-//			while (startNext != null && startNext != endNext) {
-//				needMove.add(startNext);
-//				startNext = startNext.getNextSibling();
-//			}
-//			Element newEle = createStyleElement();
-//			ancester.insertBefore(newEle, startPosition.getNextSiblingNode());
-//			for (int i = 0, n = needMove.size(); i < n; i++) {
-//				newEle.appendChild((Node) needMove.get(i));
-//			}
-//			return new DOMRange(new DOMRefPosition(newEle, false),
-//					new DOMRefPosition(newEle, true));
-//		}
-//	}
-
-    // TODO: unused code.  Dead?
-//	private IDOMPosition partialApply(IDOMPosition position, Node ancester,
-//			boolean forward, DOMRange[] result) {
-//		IDOMPosition startRef = null, endRef = null;
-//
-//		while (position != null && position.getContainerNode() != ancester) {
-//			Node container = position.getContainerNode();
-//			if (container instanceof Text) {
-//				// splitText will move the position up one level
-//				position = splitText(position);
-//			} else {
-//				// skip those nodes that can't have the style applied.
-//				position = skip(position, forward);
-//				Node sibling = position.getSibling(forward);
-//				if (sibling != null) {
-//					List needMove = new ArrayList();
-//					while (sibling != null) {
-//						needMove.add(sibling);
-//						sibling = forward ? sibling.getNextSibling() : sibling
-//								.getPreviousSibling();
-//					}
-//
-//					// ok, there is nodes that need the style
-//					Element newEle = createStyleElement();
-//					container.insertBefore(newEle, position
-//							.getNextSiblingNode());
-//					for (int i = 0, size = needMove.size(); i < size; i++) {
-//						newEle.appendChild((Node) needMove.get(i));
-//					}
-//					if (startRef == null) {
-//						startRef = new DOMRefPosition(newEle, !forward);
-//					}
-//					endRef = new DOMRefPosition(newEle, forward);
-//				}
-//				// move the position up one level
-//				position = new DOMRefPosition(container, forward);
-//			}
-//		}
-//		if (startRef == null) {
-//			result[0] = null;
-//		} else {
-//			result[0] = forward ? new DOMRange(startRef, endRef)
-//					: new DOMRange(endRef, startRef);
-//		}
-//		return position;
-//	}
-
-	/**
-	 * @param position
-	 * @return
-	 */
-    // TODO: dead?
-//	private IDOMPosition splitText(IDOMPosition position) {
-//		Text text = (Text) position.getContainerNode();
-//		int offset = position.getOffset();
-//		if (offset <= 0) {
-//			return new DOMRefPosition(text, false);
-//		} else if (offset >= text.getData().length()) {
-//			return new DOMRefPosition(text, true);
-//		} else {
-//			text.splitText(offset);
-//			return new DOMRefPosition(text, true);
-//		}
-//	}
-
-	/**
-	 * @param start
-	 * @param end
-	 * @param common
-	 */
-	private DOMRange doTextNodeStyleApply(Text textNode, int startOffset,
-			int endOffset) {
-		String data = textNode.getData();
-		String before = data.substring(0, startOffset);
-		String middle = data.substring(startOffset, endOffset);
-		String tail = data.substring(endOffset);
-
-		Text middleText = getModel().getDocument().createTextNode(middle);
-
-		// case 1: normal one
-		if (!isEmptyString(before) && !isEmptyString(tail)) {
-			Node parent = textNode.getParentNode();
-			parent.insertBefore(
-					getModel().getDocument().createTextNode(before), textNode);
-			Element bnode = createStyleElement();
-			bnode.appendChild(middleText);
-			parent.insertBefore(bnode, textNode);
-			textNode.setNodeValue(tail);
-		}
-
-		if (isEmptyString(before) && !isEmptyString(tail)) {
-			Node sibling = textNode.getPreviousSibling();
-			if (sibling != null
-					&& sibling.getNodeName().equalsIgnoreCase(getTag())) {
-				sibling.appendChild(middleText);
-			} else {
-				Node parent = textNode.getParentNode();
-				parent.insertBefore(getModel().getDocument().createTextNode(
-						before), textNode);
-				Element bnode = createStyleElement();
-				bnode.appendChild(middleText);
-				parent.insertBefore(bnode, textNode);
-			}
-			textNode.setNodeValue(tail);
-		}
-
-		if (!isEmptyString(before) && isEmptyString(tail)) {
-			Node sibling = textNode.getNextSibling();
-			textNode.setNodeValue(before);
-			if (sibling != null
-					&& sibling.getNodeName().equalsIgnoreCase(getTag())) {
-				sibling.insertBefore(middleText, sibling.getFirstChild());
-			} else {
-				Element bnode = createStyleElement();
-				bnode.appendChild(middleText);
-				textNode.getParentNode().insertBefore(bnode, sibling);
-			}
-		}
-
-		if (isEmptyString(before) && isEmptyString(tail)) {
-
-			Node previousSibling = textNode.getPreviousSibling();
-			Node nextSibling = textNode.getNextSibling();
-			//
-			if (getTag().equalsIgnoreCase(IHTMLConstants.TAG_P)) {
-				Element bnode = createStyleElement();
-				bnode.appendChild(middleText);
-				textNode.getParentNode().insertBefore(bnode, textNode);
-				textNode.getParentNode().removeChild(textNode);
-			}
-			//
-			else {
-				if (previousSibling != null
-						&& previousSibling.getNodeName().equalsIgnoreCase(
-								getTag()) && nextSibling != null
-						&& nextSibling.getNodeName().equalsIgnoreCase(getTag())) {
-					previousSibling.appendChild(middleText);
-					while (nextSibling.getFirstChild() != null) {
-						previousSibling
-								.appendChild(nextSibling.getFirstChild());
-					}
-					nextSibling.getParentNode().removeChild(nextSibling);
-				} else if (previousSibling != null
-						&& previousSibling.getNodeName().equalsIgnoreCase(
-								getTag())) {
-					previousSibling.appendChild(middleText);
-				} else if (nextSibling != null
-						&& nextSibling.getNodeName().equalsIgnoreCase(getTag())) {
-					nextSibling.insertBefore(middleText, nextSibling
-							.getFirstChild());
-				} else {
-					Element bnode = createStyleElement();
-					bnode.appendChild(middleText);
-					textNode.getParentNode().insertBefore(bnode, textNode);
-				}
-				textNode.getParentNode().removeChild(textNode);
-			}
-		}
-
-		return new DOMRange(new DOMRefPosition(middleText, false),
-				new DOMRefPosition(middleText, true));
-	}
-
-	private boolean isEmptyString(String str) {
-		if (str == null || str.length() == 0) {
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * @return a style element (cached on create)
-	 */
-	protected Element createStyleElement() {
-		if (_applyingNode != null) {
-			return _applyingNode;
-		}
-        Element element = getModel().getDocument().createElement(getTag());
-        if (_cssProperty != null && _cssPropertyValue != null) {
-        	element.setAttribute(_cssProperty, _cssPropertyValue);
-        }
-        return element;
-	}
-
-	/**
-	 * @param position
-	 * @param b
-	 * @return
-	 */
-    // TODO: dead?
-//	private IDOMPosition skip(IDOMPosition position, boolean forward) {
-//		Node node = position.getSibling(forward);
-//
-//		if (node == null) {
-//			return position;
-//		}
-//		boolean canSkip = false;
-//		if (node instanceof Text) {
-//			canSkip = ((IDOMText) node).isElementContentWhitespace();
-//		} else if (node instanceof Element) {
-//			if (getTag().equalsIgnoreCase(((Element) node).getTagName())) {
-//				canSkip = true;
-//			} else {
-//				canSkip = false;
-//			}
-//		} else {
-//			canSkip = true;
-//		}
-//		if (canSkip) {
-//			return new DOMRefPosition(node, forward);
-//		} else {
-//			return position;
-//		}
-//	}
-
-	/**
-	 * @return Returns the _cssProperty.
-	 */
-	public final String getCssProperty() {
-		return _cssProperty;
-	}
-
-	/**
-	 * @param property
-	 *            The _cssProperty to set.
-	 */
-	public final void setCssProperty(String property) {
-		_cssProperty = property;
-	}
-
-	/**
-	 * @return Returns the _cssPropertyValue.
-	 */
-	public final String getCssPropertyValue() {
-		return _cssPropertyValue;
-	}
-
-	/**
-	 * @param propertyValue
-	 *            The _cssPropertyValue to set.
-	 */
-	public final void setCssPropertyValue(String propertyValue) {
-		_cssPropertyValue = propertyValue;
-	}
-
-	/**
-	 * @return Returns the _tag.
-	 */
-	public final String getTag() {
-		if (_tag != null) {
-			return _tag;
-		}
-        return _applyingNode.getNodeName();
-	}
-
-	/**
-	 * @param _tag
-	 *            The _tag to set.
-	 */
-	public final void setTag(String _tag) {
-		this._tag = _tag;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/BlockNodeFinder.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/BlockNodeFinder.java
deleted file mode 100644
index 5f1bbc4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/BlockNodeFinder.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class BlockNodeFinder {
-	private String[] _additionalTags;
-
-	private IDOMPosition _position;
-
-	/**
-	 * @param position
-	 * @param additionalTags
-	 */
-	public BlockNodeFinder(IDOMPosition position, String[] additionalTags) {
-		_position = position;
-		_additionalTags = additionalTags;
-	}
-
-	private Node findInlineSiblings(IDOMPosition position, List result,
-			boolean forward) {
-		Node container = EditModelQuery.getInstance().getSibling(position,
-				forward);
-		if (!forward) {
-			while (container != null) {
-				if (EditModelQuery.isInline(container)) {
-					result.add(container);
-				} else {
-					return container;
-				}
-				container = container.getPreviousSibling();
-			}
-		} else {
-			while (container != null) {
-				if (EditModelQuery.isInline(container)) {
-					result.add(container);
-				} else {
-					return container;
-				}
-				container = container.getNextSibling();
-			}
-		}
-		// the result will be non-zero length.
-		return null;
-	}
-
-	private Node getParagraphNodes(IDOMPosition position, List result,
-			boolean forward) {
-		Node sResult = findInlineSiblings(position, result, forward);
-		Node container = position.getContainerNode();
-		container = position.isText() ? container.getParentNode() : container;
-		while (sResult == null) {
-			// stop at block, special container and H style nodes.
-			if (EditModelQuery.isBlockNode(container)
-					|| EditModelQuery.isDocument(container)
-					|| (container.getLocalName() != null && (container
-							.getLocalName().equals(IJSFConstants.TAG_VIEW) || container
-							.getLocalName().equalsIgnoreCase(
-									IHTMLConstants.TAG_HTML))) || //
-					(_additionalTags != null
-							&& Arrays.asList(_additionalTags).contains(
-									getTagName()) && Arrays.asList(
-							_additionalTags).contains(container))) {
-				return container;
-			}
-			position = new DOMRefPosition(container, forward);
-			sResult = findInlineSiblings(position, result, forward);
-			container = container.getParentNode();
-		}
-		return sResult;
-	}
-
-	/**
-	 * Search for an area between two block nodes or within a block node, search
-	 * will stop before or under a node which has block display-type, or
-	 * particular container like "html", jsf "view", .etc, two positions (left
-	 * and right) are returned in result.
-	 * 
-	 * The searcher will search parent's directly children, if no block node is
-	 * found, then go up the node tree to search again.
-	 * 
-	 * @param position
-	 * @param result
-	 */
-	public void getParagraphNodes(IDOMPosition position, List result) {
-		List tempResult = new ArrayList();
-		Node r1 = getParagraphNodes(position, tempResult, true);
-		if (EditModelQuery.isChild(r1, position.getContainerNode())) {
-			result.add(new DOMPosition(r1, r1.getChildNodes().getLength()));
-		} else {
-			result.add(new DOMRefPosition(r1, false));
-		}
-
-		Node r2 = getParagraphNodes(position, tempResult, false);
-		if (EditModelQuery.isChild(r2, position.getContainerNode())) {
-			result.add(new DOMPosition(r2, 0));
-		} else {
-			result.add(new DOMRefPosition(r2, true));
-		}
-	}
-
-	private String getTagName() {
-		String name = _position.getContainerNode().getNodeName();
-		name = name == null ? "" : name.toLowerCase();
-		return name;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ClipboardData.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ClipboardData.java
deleted file mode 100644
index 8900ab4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ClipboardData.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import java.util.Vector;
-
-import org.eclipse.gef.dnd.TemplateTransfer;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.widgets.Control;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class ClipboardData implements IInputSourceProvider {
-
-	private Control _control;
-
-	/**
-	 * @param control 
-	 */
-	public ClipboardData(Control control) {
-		super();
-		_control = control;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.IInputSourceProvider#getNodes()
-	 */
-	public Node[] getNodes() {
-		Object data = getClipboardData();
-		if (data instanceof Vector && ((Vector) data).size() > 0) {
-			return (Node[]) ((Vector) data).toArray(new Node[] {});
-		} else if (data instanceof Node[]) {
-			return (Node[]) data;
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.IInputSourceProvider#getStringData()
-	 */
-	public String getStringData() {
-		Object data = getClipboardData();
-		if (data instanceof String) {
-			return (String) data;
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.IInputSourceProvider#getCharacterData()
-	 */
-	public Character getCharacterData() {
-		return null;
-	}
-
-	/**
-	 * @return the clip board data
-	 */
-	public Object getClipboardData() {
-		Clipboard clipboard = new Clipboard(_control.getDisplay());
-
-		final Object cuted = clipboard.getContents(TemplateTransfer.getInstance());
-		if (cuted instanceof Node[] || cuted instanceof Vector) {
-			return cuted;
-		}
-        return clipboard.getContents(TextTransfer.getInstance());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ContentCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ContentCommand.java
deleted file mode 100644
index c612aac..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ContentCommand.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Text;
-
-/**
- * This command can used to handle things like "paste". Or keyboard printable
- * ascii key. Note: ENTER key is not handled here.
- * 
- * @author mengbo
- */
-// FIXME: \r \n in the content string is not handled.
-public class ContentCommand extends RangeModeCommand {
-
-	private String _content;
-
-	/**
-	 * @param viewer
-	 * @param content 
-	 */
-	public ContentCommand(IHTMLGraphicalViewer viewer, String content) {
-		super("", viewer);
-		_content = content;
-	}
-
-	/**
-	 * @param viewer
-	 * @param c
-	 */
-	public ContentCommand(IHTMLGraphicalViewer viewer, char c) {
-		super("", viewer);
-		_content = String.valueOf(c);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected DOMRange doRangeExecute(DOMRange range) {
-		if (range == null)
-			return null;
-
-		IDOMPosition position = DOMPositionHelper.removeRange(range);
-		position = doContent(position);
-		return new DOMRange(position, position);
-
-	}
-
-	/**
-	 * @param position
-	 * @return ??
-	 */
-	protected IDOMPosition doContent(IDOMPosition position) {
-		position = DOMPositionHelper.mergeIntoText(position);
-
-		if (position.getContainerNode() instanceof Text) {
-			Text text = (Text) position.getContainerNode();
-			String data = text.getData();
-			int offset = position.getOffset();
-			String newData = data.substring(0, offset) + _content
-					+ data.substring(offset);
-			text.setData(newData);
-			return new DOMPosition(text, offset + _content.length());
-		}
-        // we need to create a text node.
-        Text text = getDocument().createTextNode(_content);
-        position.getContainerNode().insertBefore(text,
-        		position.getNextSiblingNode());
-        return new DOMRefPosition(text, true);
-	}
-
-	// protected DesignPosition doContent()
-	// {
-	// // DesignPosition position = removeRange();
-	// DesignPosition position = this.getSelectionRange().getEndPosition();
-	// if ('\r' == _content || '\n' == _content)
-	// {
-	// Element br = getModel().getDocument().createElement("BR");
-	// Node node = RangeUtil.insertElement(position, br);
-	//
-	// // we need set the new range to the node.
-	// // FIXME: temp code, need to reconsider how to do refresh, when those
-	// editpart
-	// // are recreated.
-	// IDOMNode parent = (IDOMNode) node.getParentNode();
-	// EditPart parentPart = (EditPart) parent.getAdapterFor(EditPart.class);
-	// List childParts = parentPart.getChildren();
-	// for (int i=0; i<childParts.size(); i++)
-	// {
-	// if (node == ((EditPart)childParts.get(i)).getModel())
-	// {
-	// return new DesignPosition(parentPart, i+1);
-	// }
-	// }
-	// return new DesignPosition(parentPart, childParts.size());
-	// }
-	// else
-	// {
-	// TextPosition textPosition = RangeUtil.insertText(position,
-	// String.valueOf(_content));
-	// IDOMText text = textPosition.getTextNode();
-	// EditPart part = (EditPart) text.getAdapterFor(EditPart.class);
-	// return new DesignPosition(part, textPosition.getOffset());
-	// }
-	// }
-	//
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CopyCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CopyCommand.java
deleted file mode 100644
index 594cf62..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CopyCommand.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- */
-public class CopyCommand extends RangeModeCommand {
-
-	/**
-	 * @param viewer
-	 */
-	public CopyCommand(IHTMLGraphicalViewer viewer) {
-		super(CommandResources.getString("CopyCommand.Label.Copy"), viewer); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.RangeModeCommand#doRangeExecute(org.eclipse.jst.pagedesigner.dom.DOMRange)
-	 */
-	protected DOMRange doRangeExecute(DOMRange selection) {
-		DesignEdit edit = new CopyEdit(selection, getViewer());
-		edit.operate();
-		return selection;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CopyEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CopyEdit.java
deleted file mode 100644
index a94540e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CopyEdit.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import java.util.Stack;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.EditHelper;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.w3c.dom.DOMException;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public class CopyEdit extends DesignEdit {
-	private static Logger _log = PDPlugin.getLogger(CopyEdit.class);
-
-	private Stack result = new Stack();
-
-	/**
-	 * @param range
-	 * @param viewer
-	 */
-	public CopyEdit(DOMRange range, GraphicalViewer viewer) {
-		super(range, viewer);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.DesignEdit#operate()
-	 */
-	protected boolean operate() {
-		WorkNode root = getRootWorkNode();
-		Node rootNode = root.getNode();
-		result = getProcessedResult();
-		collectOtherStyles(rootNode, result);
-		setClipboard(result);
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.DesignEdit#processContainer(org.eclipse.jst.pagedesigner.commands.range.WorkNode)
-	 */
-	protected Node processContainer(WorkNode node) {
-		return node.getNode().cloneNode(false);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.AbstractCopyEdit#processNode(org.w3c.dom.Node,
-	 *      int[], java.util.Stack)
-	 */
-	protected Node processNode(WorkNode node) {
-		int pos[] = node.getPosOffsets();
-		// the text could be tranparent, or 0 length.
-		Assert.isTrue(pos[0] <= pos[1]);
-		if (pos[0] == pos[1]) {
-			return null;
-		}
-		return node.getNode().cloneNode(true);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.AbstractCopyEdit#processText(org.w3c.dom.Text,
-	 *      int[], java.util.Stack)
-	 */
-	protected Text processText(WorkNode node) {
-		Text currentNode = (Text) node.getNode();
-		int left = EditModelQuery.getNodeStartIndex(currentNode);
-		int right = EditModelQuery.getNodeEndIndex(currentNode);
-		int location1 = EditHelper.getInstance().getLocation(currentNode,
-				node.getPosOffsets()[0], true);
-		int location2 = EditHelper.getInstance().getLocation(currentNode,
-				node.getPosOffsets()[1], true);
-		int start = 0;
-		int end = right - left;
-		// left index
-		if (location1 > EditHelper.IN_MIDDLE
-				|| location2 < EditHelper.IN_MIDDLE) {
-			return null;
-		}
-		if (location1 <= EditHelper.IN_MIDDLE) {
-			start = node.getQualifiedOffsets()[0];
-		}
-		if (location2 >= EditHelper.IN_MIDDLE) {
-			end = node.getQualifiedOffsets()[1];
-		}
-		if (start == end) {
-			return null;
-		}
-        
-        try {
-        	String text = currentNode.getData().substring(start, end);
-        	return EditModelQuery.getDocumentNode(currentNode)
-        			.createTextNode(text);
-        } catch (DOMException e) {
-            // TODO: changed this from catching Exception
-            // DOMException is the only exception that 
-            // anything in the try is threatening to throw
-            // and even that is Runtime
-        	_log.error("Exception", e);
-        	return null;
-        }
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CutCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CutCommand.java
deleted file mode 100644
index 985967b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CutCommand.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- */
-public class CutCommand extends RangeModeCommand {
-	/**
-	 * @param viewer
-	 */
-	public CutCommand(IHTMLGraphicalViewer viewer) {
-		super(CommandResources.getString("CutCommand.Label.Cut"), viewer); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.RangeModeCommand#doRangeExecute(org.eclipse.jst.pagedesigner.dom.DOMRange)
-	 */
-	protected DOMRange doRangeExecute(DOMRange selection) {
-		DesignEdit edit = new CutEdit(selection, getViewer());
-		if (EditModelQuery.isSame(selection)) {
-			return null;
-		}
-        if (edit.perform()) {
-        	return new DOMRange(edit.getOperationPosition(), edit
-        			.getOperationPosition());
-        }
-        return selection;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CutEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CutEdit.java
deleted file mode 100644
index c0a8104..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/CutEdit.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import java.util.Stack;
-
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-
-/**
- * @author mengbo
- */
-public class CutEdit extends DeleteEdit {
-	/**
-	 * @param range
-	 * @param viewer 
-	 */
-	public CutEdit(DOMRange range, GraphicalViewer viewer) {
-		super(range, viewer);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.DesignEdit#operate()
-	 */
-	protected boolean operate() {
-		Stack result = deleteRange();
-		setClipboard(result);
-		return true;
-	}
-
-	/*
-	 * private Text cutText(Text text, int start, int end) {
-	 * EditValidateUtil.validStringIndexOffset(text, start, end - start); String
-	 * content = text.substringData(start, end - start); if (content == null ||
-	 * content.length() == 0) { return null; } text.deleteData(start, end -
-	 * start); return _document.createTextNode(content); }
-	 */
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/DeleteCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/DeleteCommand.java
deleted file mode 100644
index 26ea1d9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/DeleteCommand.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.commands.nav.ICaretPositionMover;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-
-/**
- * @author mengbo
- */
-public class DeleteCommand extends RangeModeCommand implements
-		ICaretPositionMover {
-	private boolean _forward;
-
-	/**
-	 * @param forward
-	 * @param viewer
-	 */
-	public DeleteCommand(boolean forward, IHTMLGraphicalViewer viewer) {
-		super(CommandResources.getString("DeleteCommand.Label.Delete"), viewer); //$NON-NLS-1$
-		_forward = forward;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected DOMRange doRangeExecute(DOMRange selection) {
-		if (selection == null) {
-			return null;
-		}
-
-		DesignEdit edit = new DeleteEdit(selection, getViewer(), _forward);
-		Listener listener = new Listener() {
-			public void handleEvent(Event event) {
-				event.type = SWT.NONE;
-			}
-		};
-		getViewer().getControl().getDisplay()
-				.addFilter(SWT.Selection, listener);
-		boolean status = edit.perform();
-		getViewer().getControl().getDisplay().removeFilter(SWT.Selection,
-				listener);
-		if (status) {
-			return new DOMRange(edit.getOperationPosition(), edit
-					.getOperationPosition());
-		}
-        return selection;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/DeleteEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/DeleteEdit.java
deleted file mode 100644
index d7b48ba..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/DeleteEdit.java
+++ /dev/null
@@ -1,291 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import java.util.Stack;
-import java.util.Vector;
-
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.EditHelper;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.IETablePositionRule;
-import org.eclipse.jst.pagedesigner.validation.caret.InlineEditingNavigationMediator;
-import org.eclipse.jst.pagedesigner.viewer.LayoutPart;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public class DeleteEdit extends DesignEdit {
-	private static final Logger _log = PDPlugin.getLogger(DeleteEdit.class);
-
-	private static final boolean INNER_DEBUG = false;
-
-	private boolean _forward;
-
-	Vector deleted = new Vector();
-
-	/**
-	 * @param range
-	 * @param viewer
-	 * @param forward 
-	 */
-	public DeleteEdit(DOMRange range, GraphicalViewer viewer, boolean forward) {
-		super(range, viewer);
-		_forward = forward;
-	}
-
-	/**
-	 * @param range
-	 * @param viewer
-	 */
-	public DeleteEdit(DOMRange range, GraphicalViewer viewer) {
-		super(range, viewer);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.DesignEdit#operate()
-	 */
-	protected boolean operate() {
-		try {
-			boolean result = true;
-			if (EditModelQuery.isSame(getRange())) {
-				deleteSingle();
-			} else {
-				deleteRange();
-			}
-			return result;
-		} catch (Exception e) {
-			_log.error("Exception", e);
-			return false;
-		}
-	}
-
-	/**
-	 * Delete one node or char at operation position.
-	 */
-	private void deleteSingle() {
-		IDOMPosition opPosition = getOperationPosition();
-		opPosition = EditHelper.moveToNextEditPosition(getOperationPosition(),
-				_forward, new InlineEditingNavigationMediator(new ActionData(
-						ActionData.INLINE_EDIT, null)));
-		// for inner debug
-		if (INNER_DEBUG) {
-			_log.info("EditHelper, now we are at:" + opPosition);
-		}
-		if (EditModelQuery.isSame(opPosition, getOperationPosition())) {
-			return;
-		}
-        setRange(new DOMRange(opPosition, getOperationPosition()));
-        deleteRange();
-	}
-
-	/**
-	 * @return the stack
-	 */
-	protected Stack deleteRange() {
-		WorkNode root = getRootWorkNode();
-		Node rootNode = root.getNode();
-		Stack result = getProcessedResult();
-		collectOtherStyles(rootNode, result);
-		return result;
-	}
-
-	private boolean isTableComponents(WorkNode node) {
-		String name = node.getNode().getNodeName();
-		return (IHTMLConstants.TAG_TD.equalsIgnoreCase(name) || //
-				IHTMLConstants.TAG_TH.equalsIgnoreCase(name) || //
-				IHTMLConstants.TAG_TR.equalsIgnoreCase(name) || // 
-				IHTMLConstants.TAG_THEAD.equalsIgnoreCase(name) || //
-				IHTMLConstants.TAG_TBODY.equalsIgnoreCase(name) || //
-		IHTMLConstants.TAG_TFOOT.equalsIgnoreCase(name));
-	}
-
-	private Node processContainerTable(WorkNode node) {
-		Node result = null;
-		if ((isTableComponents(node) || IHTMLConstants.TAG_TABLE
-				.equalsIgnoreCase(node.getNode().getNodeName())) //
-				&& new IETablePositionRule(null).isInValidTable(node
-						.getNode())) {
-			result = node.getNode().cloneNode(false);
-		}
-		return result;
-	}
-
-	private Node processContainerStyleNodes(WorkNode node) {
-		String name = node.getNode().getNodeName();
-		Node result = null;
-		if (IHTMLConstants.TAG_LI.equalsIgnoreCase(name) || // 
-				EditModelQuery.HTML_STYLE_NODES.contains(node.getNode()
-						.getLocalName())) {
-			if (node.getNode().hasChildNodes()) {
-				result = node.getNode().cloneNode(false);
-			}
-		}
-		return result;
-	}
-
-	private Node processContainerView(WorkNode node) {
-		Node result = null;
-		if (IJSFConstants.TAG_VIEW.equalsIgnoreCase(node.getNode()
-				.getLocalName())) {
-			result = EditModelQuery.getDocumentNode(node.getNode())
-					.createElement(IJSFConstants.TAG_SUBVIEW);
-			result.setPrefix(node.getNode().getPrefix());
-		} else if (IHTMLConstants.TAG_BODY.equalsIgnoreCase(node.getNode()
-				.getNodeName())
-				|| IHTMLConstants.TAG_HTML.equalsIgnoreCase(node.getNode()
-						.getNodeName())) {
-			result = EditModelQuery.getDocumentNode(node.getNode())
-					.createElement(node.getNode().getNodeName());
-		}
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.AbstractCopyEdit#processContainer(org.eclipse.jst.pagedesigner.commands.range.WorkNode)
-	 */
-	protected Node processContainer(WorkNode node) {
-		Node result = processContainerView(node);
-		if (result == null) {
-			result = processContainerTable(node);
-		}
-		if (result == null) {
-			result = processContainerStyleNodes(node);
-		}
-		if (result == null) {
-			// strip out container
-			if (LayoutPart.getConcreteNode(node.getNode()) != null) {
-				Node parent = node.getNode().getParentNode();
-				Node refNode = node.getNode();
-				Node child = node.getNode().getFirstChild();
-				Node first = null, last = null;
-				int index = 0;
-				NodeList children = node.getNode().getChildNodes();
-				int size = children.getLength();
-				while (child != null) {
-					Node next = child.getNextSibling();
-					Node n = EditHelper.deleteNode(child);
-					parent.insertBefore(n, refNode);
-					if (index == 0) {
-						if (refNode != null) {
-							first = refNode.getPreviousSibling();
-						} else {
-							first = parent.getLastChild();
-						}
-					}
-					if (index == size - 1) {
-						if (refNode != null) {
-							last = refNode.getPreviousSibling();
-						} else {
-							last = parent.getLastChild();
-						}
-					}
-					index++;
-					child = next;
-				}
-				if (node.getPosOffsets()[0] <= 0) {
-					setOperationPosition(new DOMRefPosition(first, false));
-				} else {
-					setOperationPosition(new DOMRefPosition(last, true));
-				}
-			} else {
-				setOperationPosition(new DOMRefPosition(node.getNode(), false));
-			}
-			result = EditHelper.deleteNode(node.getNode());
-		}
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.AbstractCopyEdit#processNode(org.w3c.dom.Node,
-	 *      int[])
-	 */
-	protected Node processNode(WorkNode node) {
-		Node result = null;
-		if (!isTableComponents(node)
-				|| !new IETablePositionRule(null).isInValidTable(node
-						.getNode())) {
-			// it's not table components.
-			setOperationPosition(new DOMRefPosition(node.getNode(), false));
-			result = EditHelper.deleteNode(node.getNode());
-		}
-		return result;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.AbstractCopyEdit#processText(org.w3c.dom.Text,
-	 *      int[])
-	 */
-	protected Text processText(WorkNode node) {
-		Text currentNode = (Text) node.getNode();
-		int[] offsets = node.getPosOffsets();
-		Node second = null;
-		int location1 = EditHelper.getInstance().getLocation(currentNode,
-				node.getPosOffsets()[0], true);
-		int location2 = EditHelper.getInstance().getLocation(currentNode,
-				node.getPosOffsets()[1], true);
-		// left index
-		if (currentNode.getData().length() > 0) {
-			if (location1 == EditHelper.IN_MIDDLE) {
-				IDOMPosition position = new DOMPosition(currentNode, node
-						.getPosOffsets()[0]);
-				setOperationPosition(position);
-				position = DOMPositionHelper.splitText(position);
-				Node nnode = position.getNextSiblingNode();
-				if (nnode instanceof Text) {
-					currentNode = (Text) nnode;
-					offsets[1] -= offsets[0] > 0 ? offsets[0] : 0;
-				}
-			} else {
-				// setOperationPosition(new DOMRefPosition(currentNode, false));
-				if (currentNode.getPreviousSibling() != null) {
-					setOperationPosition(new DOMRefPosition(currentNode
-							.getPreviousSibling(), true));
-				} else {
-					setOperationPosition(new DOMPosition(currentNode
-							.getParentNode(), 0));
-				}
-			}
-			// right index
-			if (location2 >= EditHelper.IN_MIDDLE) {
-				IDOMPosition position = new DOMPosition(currentNode, offsets[1]);
-				position = DOMPositionHelper.splitText(position);
-				second = position.getPreviousSiblingNode();
-			}
-			return second != null ? (Text) EditHelper.deleteNode(second) : null;
-		}
-        setOperationPosition(new DOMRefPosition(currentNode, false));
-        return (Text) EditHelper.deleteNode(currentNode);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/DesignEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/DesignEdit.java
deleted file mode 100644
index cba2d46..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/DesignEdit.java
+++ /dev/null
@@ -1,480 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import java.util.Stack;
-import java.util.Vector;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.gef.dnd.TemplateTransfer;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.CSSUtil;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.EditHelper;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.EditValidateUtil;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.swt.dnd.Clipboard;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public abstract class DesignEdit {
-
-    private Stack _selections;
-
-	private DOMRange _range;
-
-	private GraphicalViewer _viewer;
-
-	private IDOMPosition _operationPosition;
-
-	private final Document _document;
-
-	private Stack _processedResult;
-
-	/**
-	 * @param range
-	 * @param viewer
-	 */
-	public DesignEdit(DOMRange range, GraphicalViewer viewer) {
-		setRange(range);
-		_viewer = viewer;
-		_operationPosition = getRange().getStartPosition();
-		_document = ((IDOMNode) _operationPosition.getContainerNode())
-				.getModel().getDocument();
-	}
-
-	
-	/**
-	 * @return the target document
-	 */
-	protected final Document getDocument() {
-        return _document;
-    }
-
-    /**
-     * @return the result
-     */
-    protected abstract boolean operate();
-
-	/**
-	 * @param node
-	 * @return the text
-	 */
-	protected abstract Text processText(WorkNode node);
-
-	/**
-	 * @param node
-	 * @return the node 
-	 */
-	protected abstract Node processNode(WorkNode node);
-
-	/**
-	 * @param node
-	 * @return the node
-	 */
-	protected abstract Node processContainer(WorkNode node);
-
-	/**
-	 * @return the dom range
-	 */ 
-	public DOMRange getRange() {
-		return _range;
-	}
-
-	void setRange(DOMRange range) {
-		range = EditHelper.normal(range);
-		IDOMPosition start = EditHelper.ensureDOMPosition(range
-				.getStartPosition());
-		IDOMPosition end = EditHelper.ensureDOMPosition(range.getEndPosition());
-		_range = new DOMRange(start, end);
-		EditValidateUtil.validRange(range);
-	}
-
-	/**
-	 * @return the clipboard
-	 */
-	protected Clipboard getClipboard() {
-		return new Clipboard(_viewer.getControl().getDisplay());
-	}
-
-	/**
-	 * @return the position
-	 */
-	public IDOMPosition getOperationPosition() {
-		// try
-		// {
-		// Assert.isTrue(_operationPosition != null &&
-		// _operationPosition.getContainerNode() != null &&
-		// _operationPosition.getOffset() > -1);
-		// if (_operationPosition.isText())
-		// {
-		// int length = ((Text)
-		// _operationPosition.getContainerNode()).getLength();
-		// Assert.isTrue(_operationPosition.getOffset() >= 0 &&
-		// _operationPosition.getOffset() <= length);
-		// }
-		// }
-		// catch (Exception e)
-		// {
-		// // "Error", "Error in operation location move"
-		// PDPlugin.getAlerts().confirm("Alert.DesignEdit.opLocationValidTitle",
-		// "Alert.DesignEdit.opLocationValidMessage"); //$NON-NLS-1$
-		// //$NON-NLS-2$
-		// }
-
-		return _operationPosition;
-	}
-
-	/**
-	 * @param position
-	 */
-	protected void setOperationPosition(IDOMPosition position) {
-		if (!EditValidateUtil.validPosition(position)) {
-			return;
-		}
-		position = EditHelper.ensureDOMPosition(position);
-		_operationPosition = position;
-	}
-
-	/**
-	 * @return the result of performing the edit
-	 */
-	public boolean perform() {
-		boolean result = false;
-
-		result = operate();
-		return result;
-	}
-
-	/**
-	 * @return Returns the _viewer.
-	 */
-	public GraphicalViewer getViewer() {
-		return _viewer;
-	}
-
-	private Stack collectNodes() {
-		Node node;
-		Stack result = new Stack();
-		IDOMPosition start = getRange().getStartPosition(), end = getRange()
-				.getEndPosition();
-		int pos[] = new int[] { EditModelQuery.getIndexedRegionLocation(start),
-				EditModelQuery.getIndexedRegionLocation(end), };
-		if (!EditModelQuery.isSame(start, end)) {
-			Node ancestor = EditModelQuery.getInstance().getCommonAncestor(
-					start, end);
-			WorkNode rootWorkNode = new WorkNode(ancestor, pos[0], pos[1]);
-			rootWorkNode.setRoot(true);
-			result.push(rootWorkNode);
-			try {
-				// Loop all the children of the ancestor, and and the result
-				// will be collected
-				if (EditModelQuery.isText(ancestor)) {
-					Stack temp = new Stack();
-					EditHelper.getInstance().collectNodes(ancestor, pos[0],
-							pos[1], ancestor, temp);
-					WorkNode wNode = (WorkNode) temp.remove(0);
-					wNode.setParent(rootWorkNode);
-					result.push(wNode);
-				} else {
-					node = ancestor.getFirstChild();
-					Stack temp = new Stack();
-					while (node != null) {
-						EditHelper.getInstance().collectNodes(node, pos[0],
-								pos[1], ancestor, temp);
-						while (temp.size() > 0) {
-							WorkNode wNode = (WorkNode) temp.remove(0);
-							if (wNode.getNode().getParentNode() == ancestor) {
-								wNode.setParent(rootWorkNode);
-							}
-							result.push(wNode);
-						}
-						node = node.getNextSibling();
-					}
-				}
-			} catch (Exception e) {
-				result.clear();
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @return Returns the result.
-	 */
-	public Stack getSelections() {
-		if (_selections == null) {
-			_selections = collectNodes();
-		}
-		return _selections;
-	}
-
-	/**
-	 * @return the result stack
-	 */
-	public Stack getProcessedResult() {
-		if (_processedResult == null) {
-			_processedResult = new Stack();
-			WorkNode rootNode = getRootWorkNode();
-			if (rootNode != null) {
-				processNodes(rootNode, _processedResult);
-			}
-		}
-		return _processedResult;
-	}
-
-	/**
-	 * @return the root work node
-	 */
-	protected final WorkNode getRootWorkNode() {
-		WorkNode result = null;
-		if (getSelections().size() > 0) {
-			WorkNode node = (WorkNode) getSelections().get(0);
-			while (node.getParent() != null) {
-				node = node.getParent();
-			}
-			result = node;
-			Assert.isTrue(node.isRoot());
-		}
-		return result;
-	}
-
-	/**
-	 * @param node
-	 * @param result
-	 * @return true if node
-	 */
-	private final boolean processText(WorkNode node, Stack result) {
-		boolean done = false;
-		if (EditModelQuery.isText(node.getNode())) {
-			Node text = processText(node);
-			if (text != null) {
-				result.add(text);
-			}
-			getSelections().remove(node);
-			done = true;
-		}
-		return done;
-	}
-
-	/**
-	 * @param node
-	 * @param result
-	 */
-	private final void processContainer(WorkNode node, Stack result) {
-		processContainer(node);
-		getSelections().remove(node);
-	}
-
-	/**
-	 * @param node
-	 * @param result
-	 * @return true if done
-	 */
-	private final boolean processChildren(WorkNode node, Stack result) {
-		boolean done = false;
-		if (getFirstSelectedChild(node) != null) {
-			Stack myResult = new Stack();
-			{
-				WorkNode child = null;
-				while ((child = getFirstSelectedChild(node)) != null) {
-					{
-						processNodes(child, myResult);
-					}
-				}
-				Node newParent = processContainer(node);
-				newParent = toBeParent(newParent, myResult);
-				result.push(newParent);
-			}
-			getSelections().remove(node);
-			done = true;
-		}
-		return done;
-	}
-
-	/**
-	 * @param node
-	 * @param result
-	 * @return true if done
-	 */
-	private final boolean processChildren1(WorkNode node, Stack result) {
-		boolean done = false;
-		if (node.getNode().hasChildNodes()) {
-			Stack myResult = new Stack();
-			{
-				Node childNode = node.getNode().getFirstChild();
-				Node next = null;
-				while (childNode != null) {
-					next = childNode.getNextSibling();
-					int x1 = EditModelQuery.getNodeStartIndex(childNode) - 1;
-					int x2 = EditModelQuery.getNodeEndIndex(childNode) + 1;
-					processNodes(new WorkNode(childNode, x1, x2), myResult);
-					childNode = next;
-				}
-				Node newParent = processContainer(node);
-				newParent = toBeParent(newParent, myResult);
-				result.push(newParent);
-			}
-			getSelections().remove(node);
-			done = true;
-		}
-		return done;
-	}
-
-	/**
-	 * Process the nodes that are selected, the result is a collection of nodes
-	 * that either are clones or the nodes cuted.
-	 * 
-	 * @param node
-	 * @param result
-	 */
-	protected final void processNodes(WorkNode node, Stack result) {
-		WorkNode child = null;
-		if (node.isRoot()) {
-			while ((child = getFirstSelectedChild(node)) != null) {
-				processNodes(child, result);
-			}
-		} else {
-			if (node.isWholeSelected()
-					|| //
-					(!EditModelQuery.isText(node.getNode()) && EditModelQuery
-							.getInstance().isSingleRegionNode(node.getNode()))
-					|| //
-					EditModelQuery.isWidget(node.getNode())) {
-				Node temp = processNode(node);
-				if (temp != null) {
-					result.push(temp);
-					getSelections().remove(node);
-				} else {
-					if (!processText(node, result)) {
-						if (!processChildren1(node, result)) {
-							processContainer(node, result);
-						}
-					}
-				}
-			} else {
-				if (!processText(node, result)) {
-					if (!processChildren(node, result)) {
-						processContainer(node, result);
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * @param result
-	 */
-	protected void setClipboard(Stack result) {
-		Node[] nodes = (Node[]) result.toArray(new Node[result.size()]);
-		StringBuffer sb = new StringBuffer();
-		for (int i = 0, size = nodes.length; i < size; i++) {
-			DOMUtil.nodeToString(nodes[i], sb);
-		}
-		getClipboard().setContents(
-				new Object[] { result, sb.toString() },
-				new Transfer[] { TemplateTransfer.getInstance(),
-						TextTransfer.getInstance() });
-	}
-
-	private Node toBeParent(Node parent, Stack children) {
-		while (children.size() > 0) {
-			parent.appendChild((Node) children.remove(0));
-		}
-		return parent;
-	}
-
-	private WorkNode getFirstSelectedChild(WorkNode node) {
-		for (int i = 0, n = getSelections().size(); i < n; i++) {
-			WorkNode wNode = (WorkNode) getSelections().get(i);
-			if (wNode.getParent() == node) {
-				return wNode;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param rootNode
-	 * @param result
-	 * @return the node
-	 */
-	Node collectStyleNodes(Node rootNode, Vector result) {
-		Element element = null;
-		if (rootNode instanceof Element) {
-			element = (Element) rootNode;
-		} else if (rootNode.getParentNode() != null) {
-			element = (Element) rootNode.getParentNode();
-		}
-		ICSSStyle style = CSSUtil.getCSSStyle(element);
-
-		Node node = EditModelQuery.getDocumentNode(rootNode).createElement(
-				"span");
-		for (int i = 0, n = result.size(); i < n; i++) {
-			node.appendChild((Node) result.elementAt(i));
-		}
-		((Element) node).setAttribute(IHTMLConstants.ATTR_STYLE, CSSUtil
-				.resolveCSSStyle(style));
-		result.removeAllElements();
-		result.add(node);
-		return node;
-	}
-
-	/**
-	 * @param rootNode
-	 * @param result 
-	 * @return the node
-	 */
-	protected final Node collectOtherStyles(Node rootNode, Vector result) {
-		Node cur = rootNode, prev = null, appendPoint = null;
-		if (EditValidateUtil.validNode(rootNode)) {
-			while (!EditModelQuery.isDocument(cur)) {
-				if (!EditValidateUtil.validNode(cur)) {
-					return null;
-				}
-				String name = cur.getNodeName() != null ? cur.getNodeName()
-						.toLowerCase() : "";
-				if (EditModelQuery.HTML_STYLE_NODES.contains(name)) {
-					if (prev != null) {
-						Node newone = cur.cloneNode(false);
-						newone.appendChild(prev);
-						prev = newone;
-					} else {
-						prev = cur.cloneNode(false);
-						appendPoint = prev;
-					}
-				}
-				cur = cur.getParentNode();
-			}
-			if (appendPoint != null) {
-				for (int i = 0, n = result.size(); i < n; i++) {
-					appendPoint.appendChild((Node) result.elementAt(i));
-				}
-				result.removeAllElements();
-				result.add(prev);
-			}
-		}
-		return prev;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/IInputSourceProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/IInputSourceProvider.java
deleted file mode 100644
index 9922329..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/IInputSourceProvider.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public interface IInputSourceProvider {
-	/**
-	 * @return Returns the _data.
-	 */
-	public Node[] getNodes();
-
-	/**
-	 * @return the string data
-	 */
-	public String getStringData();
-
-	/**
-	 * @return the character data
-	 */
-	public Character getCharacterData();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/InsertCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/InsertCommand.java
deleted file mode 100644
index 0723268..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/InsertCommand.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jst.pagedesigner.commands.nav.ICaretPositionMover;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- */
-public class InsertCommand extends RangeModeCommand implements
-		ICaretPositionMover {
-
-	private IInputSourceProvider _data;
-
-	/**
-	 * @param label
-	 * @param viewer
-	 * @param data 
-	 */
-	public InsertCommand(String label, IHTMLGraphicalViewer viewer,
-			IInputSourceProvider data) {
-		super(label, viewer);
-		_data = data;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.RangeModeCommand#doRangeExecute(org.eclipse.jst.pagedesigner.dom.DOMRange)
-	 */
-	protected DOMRange doRangeExecute(DOMRange selection) {
-		DesignEdit edit = null;
-		edit = new InsertEdit(selection, getViewer(), _data);
-		edit.perform();
-		selection = new DOMRange(edit.getOperationPosition(), edit
-				.getOperationPosition());
-		return selection;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/InsertEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/InsertEdit.java
deleted file mode 100644
index bcf96eb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/InsertEdit.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.jsp.core.IJSPCoreConstants;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * InsertEdit will perform action at a single location, the data souce could be
- * clipboard or keyboard.
- * 
- * @author mengbo
- */
-public class InsertEdit extends DeleteEdit {
-	private IInputSourceProvider _data;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.DesignEdit#operate()
-	 */
-	public boolean operate() {
-		DOMRange range = getRange();
-		if (!EditModelQuery.isSame(range.getStartPosition(), range
-				.getEndPosition())) {
-			deleteRange();
-			range = new DOMRange(getOperationPosition(), getOperationPosition());
-			setRange(range);
-		}
-		if (insertNodes()) {
-			return true;
-		} else if (insertString()) {
-			return true;
-		} else {
-			return insertChar();
-		}
-	}
-
-	/**
-	 * @param range
-	 * @param viewer
-	 * @param data 
-	 */
-	public InsertEdit(DOMRange range, GraphicalViewer viewer,
-			IInputSourceProvider data) {
-		super(range, viewer);
-		_data = data;
-	}
-
-	/**
-	 * @param position
-	 * @param viewer
-	 * @param data
-	 */
-	public InsertEdit(IDOMPosition position, GraphicalViewer viewer,
-			IInputSourceProvider data) {
-		super(new DOMRange(position, position), viewer);
-		setOperationPosition(position);
-		_data = data;
-	}
-
-	/**
-	 * @return ??
-	 */
-	public boolean insertChar() {
-		if (_data.getStringData() == null) {
-			return false;
-		}
-		IDOMPosition position = getOperationPosition();
-		if (position.isText()) {
-			Text text = EditModelQuery.getInstance().getText(position);
-			text.insertData(getOperationPosition().getOffset(), _data
-					.getCharacterData().toString());
-			setOperationPosition(new DOMPosition(text, position.getOffset() + 1));
-		} else {
-			Node refNode = position.getNextSiblingNode();
-			Text text = getDocument().createTextNode(_data.getCharacterData()
-					.toString());
-			position.getContainerNode().insertBefore(text, refNode);
-			setOperationPosition(new DOMPosition(text, text.getLength()));
-		}
-		return true;
-	}
-
-	/**
-	 * @return ????
-	 */
-	public boolean insertString() {
-		String content = _data.getStringData();
-		if (content != null) {
-			IDOMPosition position = getOperationPosition();
-			if (position.isText()) {
-				Text text = EditModelQuery.getInstance().getText(position);
-				text.insertData(getOperationPosition().getOffset(), content);
-				setOperationPosition(new DOMPosition(text, position.getOffset()
-						+ content.length()));
-			} else {
-				Node refNode = position.getNextSiblingNode();
-				Text text = getDocument().createTextNode(content);
-				position.getContainerNode().insertBefore(text, refNode);
-				setOperationPosition(new DOMPosition(text, text.getLength()));
-			}
-			return true;
-		}
-		return false;
-	}
-
-	private boolean insertNodes() {
-		Node[] nodes = _data.getNodes();
-		if (nodes == null) {
-			return false;
-		}
-		IDOMPosition position = getOperationPosition();
-		if (position == null) {
-			return false;
-		}
-		Node refNode = null;
-		if (position.isText()) {
-			position = DOMPositionHelper.splitText(position);
-		}
-		refNode = position.getNextSiblingNode();
-		Node parent = position.getContainerNode();
-		Node node = null;
-		for (int i = 0; i < nodes.length; i++) {
-			node = DOMUtil.cloneNodeDeep(getDocument(), nodes[i]);
-			String prefix = node.getPrefix();
-			String name = node.getLocalName();
-			if (name != null
-					&& ITLDConstants.URI_JSP.equals(prefix)
-					&& (node.getLocalName().startsWith(
-							IJSPCoreConstants.TAG_LEADING_DIRECTIVE)
-							|| IJSPCoreConstants.TAG_DECLARATION.equals(name)
-							|| IJSPCoreConstants.TAG_EXPRESSION.equals(name) || IJSPCoreConstants.TAG_SCRIPTLET
-							.equals(name))) {
-				// it is a jsp tag
-				((IDOMElement) node).setJSPTag(true);
-			}
-			node = parent.insertBefore(node, refNode);
-		}
-
-		if (node != null) {
-			setOperationPosition(new DOMRefPosition(node, true));
-		} else if (refNode != null) {
-			setOperationPosition(new DOMRefPosition(refNode, false));
-		} else {
-			setOperationPosition(new DOMRefPosition(parent.getLastChild(), true));
-		}
-		return true;
-	}
-
-    // TODO: dead?
-//	private boolean splitNode() {
-//		if ((getViewer()).getSelection() instanceof DesignRange
-//				&& _data.getCharacterData() != null
-//				&& _data.getCharacterData().charValue() == '\r') {
-//			DesignRange range = (DesignRange) (getViewer()).getSelection();
-//			Node node = range.getStartPosition().getContainerNode();
-//			if (EditModelQuery.isText(node)) {
-//				node = node.getParentNode();
-//			}
-//			if (EditModelQuery.isListItem(node)) {
-//				IDOMPosition position = DOMPositionHelper.toDOMPosition(range
-//						.getStartPosition());
-//				// split text and it's parent.
-//				position = EditHelper.splitNode(position);
-//				position = EditHelper.splitNode(position);
-//				position = EditHelper.moveInto(position.getNextSiblingNode(),
-//						new InlineEditingNavigationMediator(new ActionData(
-//								ActionData.INLINE_EDIT, null)), true);
-//				setOperationPosition(position);
-//				return true;
-//			}
-//		}
-//		return false;
-//	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/KeyboardData.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/KeyboardData.java
deleted file mode 100644
index 7f194bc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/KeyboardData.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.gef.DefaultEditDomain;
-import org.eclipse.gef.EditDomain;
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.swt.SWT;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class KeyboardData implements IInputSourceProvider {
-	private Character _keyCode;
-
-	private int _stateMask;
-
-	private GraphicalViewer _viewer;
-
-	/**
-	 * @param code
-	 * @param mask
-	 * @param viewer
-	 */
-	public KeyboardData(char code, int mask, GraphicalViewer viewer) {
-		if ((mask & SWT.SHIFT) != 0) {
-			_keyCode = new Character(Character.toUpperCase(code));
-		} else {
-			_keyCode = new Character(code);
-		}
-		_stateMask = mask;
-		_viewer = viewer;
-	}
-
-	/**
-	 * @return Returns the keyCode.
-	 */
-	public int getKeyCode() {
-		return _keyCode.charValue();
-	}
-
-	/**
-	 * @param keyCode
-	 *            The keyCode to set.
-	 */
-	public void setKeyCode(char keyCode) {
-		this._keyCode = new Character(keyCode);
-	}
-
-	/**
-	 * @return Returns the stateMask.
-	 */
-	public int getStateMask() {
-		return _stateMask;
-	}
-
-	/**
-	 * @param stateMask
-	 *            The stateMask to set.
-	 */
-	public void setStateMask(int stateMask) {
-		this._stateMask = stateMask;
-	}
-
-	/**
-	 * @param keyCode
-	 * @return the node or null
-	 */
-	public Node getSpecialNode(KeyboardData keyCode) {
-		Object name;
-		EditDomain domain = _viewer.getEditDomain();
-		Document document = null;
-		if (domain instanceof DefaultEditDomain) {
-			document = ((HTMLEditor) (((DefaultEditDomain) domain)
-					.getEditorPart())).getDOMDocument();
-		}
-		// if ((keyCode.getStateMask() & SWT.SHIFT) != 0)
-		{
-			if ((name = EditModelQuery.CHAR_NODE_MAP.get(keyCode
-					.getCharacterData())) != null) {
-				return document.createElement((String) name);
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @return Returns the _data.
-	 */
-	public Node[] getNodes() {
-		Node node = getSpecialNode(this);
-		if (node != null) {
-			return new Node[] { node };
-		}
-		return null;
-	}
-
-	public String getStringData() {
-		return _keyCode.toString();
-	}
-
-	// public Key
-	public Character getCharacterData() {
-		return _keyCode;
-	}
-
-	/**
-	 * @return the char value of the key code
-	 */
-	public char getChar() {
-		return _keyCode.charValue();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/Paragraph.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/Paragraph.java
deleted file mode 100644
index c3757d0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/Paragraph.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class Paragraph {
-	private DOMRange _range;
-
-	/**
-	 * @param start
-	 * @param end
-	 */
-	public Paragraph(IDOMPosition start, IDOMPosition end) {
-		_range = new DOMRange(start, end);
-	}
-
-	/**
-	 * @return the lowest container node
-	 */
-	public Node getLowestContainer() {
-		return EditModelQuery.getInstance().getCommonAncestor(
-				_range.getStartPosition(), _range.getEndPosition());
-	}
-
-	/**
-	 * @return Returns the _end.
-	 */
-	public final IDOMPosition getStart() {
-		return _range.isOrdered() ? _range.getStartPosition() : _range
-				.getEndPosition();
-	}
-
-	/**
-	 * @return Returns the _start.
-	 */
-	public final IDOMPosition getEnd() {
-		return _range.isOrdered() ? _range.getEndPosition() : _range
-				.getStartPosition();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ParagraphApplyStyleCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ParagraphApplyStyleCommand.java
deleted file mode 100644
index 16a0d05..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ParagraphApplyStyleCommand.java
+++ /dev/null
@@ -1,408 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import java.util.Arrays;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.eclipse.jst.pagedesigner.dom.EditHelper;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.dom.IDOMRefPosition;
-import org.eclipse.jst.pagedesigner.parts.TextEditPart;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public class ParagraphApplyStyleCommand extends ApplyStyleCommand {
-
-    /**
-     * the list of possible html heading tags
-     */
-    private static final String[] HH = { "h1", "h2", "h3", "h4", "h5", "h6" };
-
-    /**
-	 * @param viewer
-	 * @param tag
-	 * @param property
-	 * @param value
-	 */
-	public ParagraphApplyStyleCommand(IHTMLGraphicalViewer viewer, String tag,
-			String property, String value) {
-		super(viewer, tag, property, value);
-	}
-
-	/**
-	 * @param viewer
-	 * @param node
-	 * @param property
-	 * @param value
-	 */
-	public ParagraphApplyStyleCommand(IHTMLGraphicalViewer viewer,
-			Element node, String property, String value) {
-		super(viewer, node, property, value);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.RangeModeCommand#doRangeExecute(org.eclipse.jst.pagedesigner.dom.DOMRange)
-	 */
-	protected DOMRange doRangeExecute(DOMRange range) {
-		if (range != null) {
-			boolean ordered = range.isOrdered();
-			IDOMPosition start = ordered ? range.getStartPosition() : range
-					.getEndPosition();
-			IDOMPosition end = ordered ? range.getEndPosition() : range
-					.getStartPosition();
-			Node common = null;
-			Node container = null;
-			if (EditModelQuery.isSame(range)) {
-				container = start.getContainerNode();
-				ParagraphFinder finder = new ParagraphFinder(start);
-				Paragraph p = finder.getParagraph(start);
-				start = p.getStart();
-				end = p.getEnd();
-				common = p.getLowestContainer();
-			} else {
-				common = EditModelQuery.getInstance().getCommonAncestor(start,
-						end);
-			}
-			DOMRange rt;
-			// This code is for h1-h6 only, it may need to be replaced.
-			if ((rt = replaceExistingH(start, end)) != null) {
-				return rt;
-			}
-			// replace existing p
-			if (getTag().equalsIgnoreCase(IHTMLConstants.TAG_P)) {
-				rt = replaceExistingP(start, end);
-				if (rt != null) {
-					return rt;
-				}
-			}
-			if (start.getContainerNode() == end.getContainerNode()) {
-				int offset1 = start.getOffset();
-				int offset2 = end.getOffset();
-				IDOMPosition old = start;
-				start = split(start);
-				// parent is splited
-				if (start != old) {
-					container = start.getNextSiblingNode();
-					offset2 -= offset1;
-					end = new DOMPosition(container, offset2);
-				}
-				end = split(end);
-			} else {
-				start = split(common, start);
-				end = split(common, end);
-			}
-			range = InsertStyleTag(new DOMRange(start, end));
-		}
-		return range;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#canExecute()
-	 */
-	public boolean canExecute() {
-		return true;
-	}
-
-	/*
-	 * Try to split the node so that we can avoid wrap its children directly.
-	 * Begining from 'position' the split can reach as high as the level of
-	 * 'common'.
-	 */
-	private IDOMPosition split(Node common, IDOMPosition position) {
-		Assert.isTrue(EditModelQuery.isChild(common, position
-				.getContainerNode()));
-		Node container = position.getContainerNode();
-		String[] styleNodes = new String[EditModelQuery.HTML_STYLE_NODES.size()];
-		EditModelQuery.HTML_STYLE_NODES.toArray(styleNodes);
-		while (EditModelQuery.isText(container) || (container != common && //
-				EditModelQuery.containItem(styleNodes, container, true))) {
-			IDOMPosition old = position;
-			position = EditHelper.splitNode(position);
-			if (old == position) {
-				int pos = EditHelper.getLocation(position);
-				switch (pos) {
-				case -1:
-					position = new DOMRefPosition(position.getContainerNode(),
-							false);
-					break;
-				case 1:
-					position = new DOMRefPosition(position.getContainerNode(),
-							true);
-				}
-			}
-			Node containerBackup = container;
-			container = container.getParentNode();
-			if (containerBackup.getNodeName().equalsIgnoreCase(
-					IHTMLConstants.TAG_P)) {
-				container.removeChild(containerBackup);
-			}
-		}
-		return position;
-	}
-
-	/*
-	 * Split the position's container node only.
-	 */
-	private IDOMPosition split(IDOMPosition position) {
-		Node container = position.getContainerNode();
-		String[] styleNodes = new String[EditModelQuery.HTML_STYLE_NODES.size()];
-		EditModelQuery.HTML_STYLE_NODES.toArray(styleNodes);
-		if (EditModelQuery.isText(container)
-				|| EditModelQuery.containItem(styleNodes, container, true)) {
-			return EditHelper.splitNode(position);
-		}
-		return position;
-	}
-
-	private DOMRange replaceExistingH(IDOMPosition start, IDOMPosition end) {
-		Node common = EditModelQuery.getInstance()
-				.getCommonAncestor(start, end);
-		// Here we insert some code to avoid creating tags duplicated. but these
-		// are not the entire cases.
-		if (Arrays.asList(HH).contains(
-				getAName(getTag()).toLowerCase())
-				&& Arrays.asList(HH).contains(
-						getAName(common.getNodeName()).toLowerCase())) {
-			// uncheck action menu
-			if (getAName(getTag()).toLowerCase().equalsIgnoreCase(
-					getAName(common.getNodeName()).toLowerCase())) {
-				NodeList nodes = common.getChildNodes();
-
-				for (int i = 0, size = nodes.getLength(); i < size; i++) {
-					common.getParentNode().insertBefore(nodes.item(i), common);
-				}
-				common.getParentNode().removeChild(common);
-				return new DOMRange(start, end);
-			}
-			start = DOMPositionHelper.toDOMRefPosition(start);
-			end = DOMPositionHelper.toDOMRefPosition(end);
-			Node newHNode = EditModelQuery.getDocumentNode(common)
-					.createElement(getTag());
-			EditModelQuery.copyChildren(common, newHNode);
-			common.getParentNode().replaceChild(newHNode, common);
-			return new DOMRange(start, end);
-		}
-		return null;
-	}
-
-	private DOMRange replaceExistingP(IDOMPosition start, IDOMPosition end) {
-		// find the selected startNode,endNode and start node's parent node
-		Node startNode = start instanceof IDOMRefPosition ? start
-				.getNextSiblingNode() : start.getContainerNode();
-		Node endNode = end instanceof IDOMRefPosition ? end
-				.getPreviousSiblingNode() : end.getContainerNode();
-		Node parentNode = startNode.getParentNode();
-
-		if (!(start.isText()) && start instanceof DOMPosition) {
-			startNode = startNode.getChildNodes().item(start.getOffset());
-			parentNode = start.getContainerNode();
-		}
-		if (!(end.isText()) && end instanceof DOMPosition) {
-			// because the offset is based on the position between nodes,so we
-			// need to reduce one from the offset
-			// in order to get the correct end node.
-			endNode = endNode.getChildNodes().item(end.getOffset() - 1);
-		}
-
-		// compute selected character number in the text or selected element
-		// number under a node
-		int len = 0;
-//		if (start instanceof DOMPosition && end instanceof DOMPosition
-//				|| start instanceof IDOMPosition && end instanceof IDOMPosition) {
-        // TODO: as written, this will be the only statement run, since
-        // both start and end are instanceof IDOMPosition by defn.
-			len = end.getOffset() - start.getOffset();
-//		} else {
-//			IDOMRefPosition startRef = null;
-//			IDOMRefPosition endRef = null;
-//			if (!(start.isText()) && start instanceof DOMPosition) {
-//				startRef = new DOMRefPosition(startNode, false);
-//			} else if (!(end.isText()) && end instanceof DOMPosition) {
-//				endRef = new DOMRefPosition(endNode, true);
-//			}
-//			len = (endRef != null ? endRef.getOffset() : end.getOffset())
-//					- (startRef != null ? startRef.getOffset() : start
-//							.getOffset());
-//		}
-
-		// if a full Text node is selected,and the Text node is the only child
-		// of its parent
-		if ((startNode == endNode) && (startNode instanceof Text)) {
-			TextEditPart part = (TextEditPart) ((INodeNotifier) startNode)
-					.getAdapterFor(EditPart.class);
-			boolean condition = false;
-			if (start instanceof IDOMRefPosition
-					|| (start instanceof DOMPosition && !start.isText())) {
-				condition = parentNode.getNodeName().equalsIgnoreCase(
-						IHTMLConstants.TAG_P)
-						&& parentNode.getChildNodes().getLength() == 1;
-			} else {
-				condition = parentNode.getNodeName().equalsIgnoreCase(
-						IHTMLConstants.TAG_P)
-						&& parentNode.getChildNodes().getLength() == 1
-						&& part.getTextData().length() == len;
-			}
-			if (condition) {
-				// if uncheck the align action
-				if (this.getApplyingNode()
-						.getAttribute(IHTMLConstants.ATTR_ALIGN)
-						.equals(
-								((Element) parentNode)
-										.getAttribute(IHTMLConstants.ATTR_ALIGN))) {
-					((Element) parentNode)
-							.removeAttribute(IHTMLConstants.ATTR_ALIGN);
-					IDOMPosition startPos = new DOMPosition(parentNode, 0);
-					IDOMPosition endPos = new DOMRefPosition(endNode, true);
-					return new DOMRange(startPos, endPos);
-				}
-				// else replace the align attribute
-				/**
-				 * this._applyingNode.appendChild(startNode);
-				 * parentNode.getParentNode().replaceChild(this._applyingNode,
-				 * parentNode);
-				 */
-				String align = this.getApplyingNode()
-						.getAttribute(IHTMLConstants.ATTR_ALIGN);
-				((Element) parentNode).setAttribute(IHTMLConstants.ATTR_ALIGN,
-						align);
-
-				IDOMPosition startPos = new DOMPosition(parentNode, 0);
-				IDOMPosition endPos = new DOMRefPosition(endNode, true);
-				return new DOMRange(startPos, endPos);
-			}
-		} else {
-			if (parentNode != null
-					&& parentNode.getNodeName().equalsIgnoreCase(
-							IHTMLConstants.TAG_P)
-					&& parentNode.getChildNodes().getLength() == len) {
-				if (this.getApplyingNode()
-						.getAttribute(IHTMLConstants.ATTR_ALIGN)
-						.equals(
-								((Element) parentNode)
-										.getAttribute(IHTMLConstants.ATTR_ALIGN))) {
-					((Element) parentNode)
-							.removeAttribute(IHTMLConstants.ATTR_ALIGN);
-					IDOMPosition startPos = new DOMPosition(parentNode, 0);
-					IDOMPosition endPos = new DOMRefPosition(endNode, true);
-					return new DOMRange(startPos, endPos);
-				}
-
-				/**
-				 * Node sibling = startNode.getNextSibling();
-				 * this._applyingNode.appendChild(startNode); Node
-				 * endNodeSibling = endNode.getNextSibling(); while (sibling !=
-				 * null && startNode != endNode && sibling != endNodeSibling) {
-				 * Node tempNode = sibling.getNextSibling();
-				 * this._applyingNode.appendChild(sibling); sibling = tempNode; }
-				 * parentNode.getParentNode().replaceChild(this._applyingNode,
-				 * parentNode);
-				 */
-				String align = this.getApplyingNode()
-						.getAttribute(IHTMLConstants.ATTR_ALIGN);
-				((Element) parentNode).setAttribute(IHTMLConstants.ATTR_ALIGN,
-						align);
-
-				IDOMPosition startPos = new DOMPosition(parentNode, 0);
-				IDOMPosition endPos = new DOMRefPosition(endNode, true);
-				return new DOMRange(startPos, endPos);
-			}
-		}
-		return null;
-	}
-
-	private DOMRange InsertStyleTag(DOMRange range) {
-		if (range == null || range.isEmpty()) {
-			return null;
-		}
-
-		boolean ordered = range.isOrdered();
-		IDOMPosition start = ordered ? range.getStartPosition() : range
-				.getEndPosition();
-		IDOMPosition end = ordered ? range.getEndPosition() : range
-				.getStartPosition();
-
-		Node startContainer = start.getContainerNode();
-		Node endContainer = end.getContainerNode();
-
-		Node common = DOMUtil.findCommonAncester(start.getContainerNode(), end
-				.getContainerNode());
-		if (common == null) {
-			// should not happen.
-			return null;
-		}
-        if (startContainer instanceof Text) {
-        	// if the start offset is 0,then skip split the Text
-        	if (start.getOffset() > 0) {
-        		startContainer = ((Text) startContainer).splitText(start
-        				.getOffset());
-        		start = new DOMRefPosition(startContainer, false);
-        	}
-        } else {
-        	startContainer = start.getNextSiblingNode();
-        }
-        if (endContainer instanceof Text) {
-        	if (end.getOffset() > 0) {
-        		endContainer = ((Text) endContainer).splitText(end
-        				.getOffset());
-        		endContainer = endContainer.getPreviousSibling();
-        	} else {
-        		endContainer = endContainer.getPreviousSibling();
-        	}
-        } else {
-        	endContainer = end.getPreviousSiblingNode();
-        }
-
-        // now the startContainer and the endContainer should share the same
-        // parent
-        Element newNode = createStyleElement();
-        startContainer.getParentNode()
-        		.insertBefore(newNode, startContainer);
-
-        Node sibling = startContainer.getNextSibling();
-        newNode.appendChild(startContainer);
-        Node endNodeSibling = endContainer.getNextSibling();
-        while (sibling != null && startContainer != endContainer
-        		&& sibling != endNodeSibling) {
-        	Node tempNode = sibling.getNextSibling();
-        	newNode.appendChild(sibling);
-        	sibling = tempNode;
-        }
-
-        IDOMPosition startPos = new DOMPosition(newNode, 0);
-        IDOMPosition endPos = new DOMRefPosition(endContainer, true);
-        return new DOMRange(startPos, endPos);
-	}
-
-	private static String getAName(String name) {
-		return name == null ? "" : name;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ParagraphFinder.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ParagraphFinder.java
deleted file mode 100644
index 1dfda9d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ParagraphFinder.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class ParagraphFinder {
-	private final IDOMPosition _position;
-
-	/**
-	 * @param position
-	 */
-	public ParagraphFinder(IDOMPosition position) {
-		_position = position;
-	}
-
-	/**
-	 * @return the dom position
-	 */
-	public IDOMPosition getPosition() {
-		return _position;
-	}
-
-	private Node findInlineSiblings(IDOMPosition position, List result,
-			boolean forward) {
-		Node container = EditModelQuery.getInstance().getSibling(position,
-				forward);
-		if (!forward) {
-			while (container != null) {
-				if (EditModelQuery.isInline(container)) {
-					result.add(container);
-				} else {
-					return container;
-				}
-				container = container.getPreviousSibling();
-			}
-		} else {
-			while (container != null) {
-				if (EditModelQuery.isInline(container)) {
-					result.add(container);
-				} else {
-					return container;
-				}
-				container = container.getNextSibling();
-			}
-		}
-		// the result will be non-zero length.
-		return null;
-	}
-
-	private Node getParagraphNodes(IDOMPosition position, List result,
-			boolean forward) {
-		Node sResult = findInlineSiblings(position, result, forward);
-		Node container = position.getContainerNode();
-		container = position.isText() ? container.getParentNode() : container;
-		while (sResult == null) {
-			// stop at block, special container and H style nodes.
-			if (EditModelQuery.isBlockNode(container)
-					|| EditModelQuery.isDocument(container)
-					|| (container.getLocalName() != null && (container
-							.getLocalName().equals(IJSFConstants.TAG_VIEW) || container
-							.getLocalName().equalsIgnoreCase(
-									IHTMLConstants.TAG_HTML)))) {
-				return container;
-			}
-			position = new DOMRefPosition(container, forward);
-			sResult = findInlineSiblings(position, result, forward);
-			container = container.getParentNode();
-		}
-		return sResult;
-	}
-
-	/**
-	 * Search for an area between two block nodes or within a block node, search
-	 * will stop before or under a node which has block display-type, or
-	 * particular container like "html", jsf "view", .etc, two positions (left
-	 * and right) are returned in result.
-	 * 
-	 * The searcher will search parent's directly children, if no block node is
-	 * found, then go up the node tree to search again.
-	 * 
-	 * @param position
-	 * @return the paragraph
-	 */
-	public Paragraph getParagraph(IDOMPosition position) {
-		List tempResult = new ArrayList();
-		IDOMPosition p1, p2;
-		Node r1 = getParagraphNodes(position, tempResult, true);
-		if (EditModelQuery.isChild(r1, position.getContainerNode())) {
-			p1 = new DOMPosition(r1, r1.getChildNodes().getLength());
-		} else {
-			p1 = new DOMRefPosition(r1, false);
-		}
-
-		Node r2 = getParagraphNodes(position, tempResult, false);
-		if (EditModelQuery.isChild(r2, position.getContainerNode())) {
-			p2 = new DOMPosition(r2, 0);
-		} else {
-			p2 = new DOMRefPosition(r2, true);
-		}
-		return new Paragraph(p1, p2);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ParagraphUnapplyStyleCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ParagraphUnapplyStyleCommand.java
deleted file mode 100644
index c0611c6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/ParagraphUnapplyStyleCommand.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class ParagraphUnapplyStyleCommand extends ApplyStyleCommand {
-	private String _groupTags[];
-
-	/**
-	 * @param viewer
-	 * @param tags
-	 * @param property
-	 * @param value
-	 */
-	public ParagraphUnapplyStyleCommand(IHTMLGraphicalViewer viewer,
-			String[] tags, String property, String value) {
-		super(viewer, "", property, value);
-		_groupTags = tags;
-	}
-
-	/**
-	 * @param viewer
-	 * @param node
-	 * @param property
-	 * @param value
-	 */
-	public ParagraphUnapplyStyleCommand(IHTMLGraphicalViewer viewer,
-			Element node, String property, String value) {
-		super(viewer, node, property, value);
-	}
-
-	private DOMRange removeExistingStyles(IDOMPosition start, IDOMPosition end) {
-		Node common = null;
-		if (EditModelQuery.isSame(start, end)) {
-			ParagraphFinder finder = new ParagraphFinder(start);
-			Paragraph p = finder.getParagraph(start);
-			start = p.getStart();
-			end = p.getEnd();
-			common = p.getLowestContainer();
-		} else {
-			common = EditModelQuery.getInstance().getCommonAncestor(start, end);
-		}
-		// Here we insert some code to avoid creating tags duplicated. but these
-		// are not the entire cases.
-		// if (Arrays.asList(_groupTags).contains(common.getNodeName()))
-		if (EditModelQuery.containItem(_groupTags, common, true)) {
-			start = DOMPositionHelper.toDOMRefPosition(start);
-			end = DOMPositionHelper.toDOMRefPosition(end);
-			Node parent = common.getParentNode();
-			EditModelQuery.copyChildren(common, parent);
-			common.getParentNode().removeChild(common);
-			return new DOMRange(start, end);
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.RangeModeCommand#doRangeExecute(org.eclipse.jst.pagedesigner.dom.DOMRange)
-	 */
-	protected DOMRange doRangeExecute(DOMRange range) {
-		return removeExistingStyles(range.getStartPosition(), range
-				.getEndPosition());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/PasteCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/PasteCommand.java
deleted file mode 100644
index 5ec0958..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/PasteCommand.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- */
-public class PasteCommand extends RangeModeCommand {
-
-	/**
-	 * @param viewer
-	 */
-	public PasteCommand(IHTMLGraphicalViewer viewer) {
-		super(CommandResources.getString("PasteCommand.Label.Paste"), viewer); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.RangeModeCommand#doRangeExecute(org.eclipse.jst.pagedesigner.dom.DOMRange)
-	 */
-	protected DOMRange doRangeExecute(DOMRange selection) {
-		InsertEdit edit = new InsertEdit(selection, getViewer(),
-				new ClipboardData(getViewer().getControl()));
-		if (edit.operate()) {
-			return new DOMRange(edit.getOperationPosition(), edit
-					.getOperationPosition());
-		}
-        return selection;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/RangeModeCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/RangeModeCommand.java
deleted file mode 100644
index 07ce127..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/RangeModeCommand.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.EditValidateUtil;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public abstract class RangeModeCommand extends DesignerCommand {
-//	private static final Logger _log = PDPlugin
-//			.getLogger(RangeModeCommand.class);
-
-	DOMRange _resultRange = null;
-
-	/**
-	 * @param label
-	 * @param viewer
-	 */
-	public RangeModeCommand(String label, IHTMLGraphicalViewer viewer) {
-		super(label, viewer);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#prePreExecute()
-	 */
-	protected boolean prePreExecute() {
-		int position = -1;
-		int length = -1;
-		ISelection selection = getViewer().getSelection();
-		if (selection != null) {
-			if (getViewer().isInRangeMode()) {
-				DesignRange range = (DesignRange) selection;
-				if (range.isValid()) {
-					IDOMPosition domPos = DOMPositionHelper.toDOMPosition(range
-							.getStartPosition());
-					IDOMPosition domEnd = DOMPositionHelper.toDOMPosition(range
-							.getEndPosition());
-					if (!EditValidateUtil.validPosition(domPos)
-							|| !EditValidateUtil.validPosition(domEnd)) {
-						return false;
-					}
-					position = EditModelQuery.getIndexedRegionLocation(domPos);
-					int end = EditModelQuery.getIndexedRegionLocation(domEnd);
-					if (end < position) {
-						length = position - end;
-						position = end;
-					} else {
-						length = end - position;
-					}
-				}
-			} else {
-				Object object = ((IStructuredSelection) selection)
-						.getFirstElement();
-				if (object instanceof ElementEditPart) {
-					Node node = ((ElementEditPart) object).getIDOMNode();
-					position = EditModelQuery.getNodeStartIndex(node);
-					length = EditModelQuery.getNodeLenth(node);
-				} else {
-					return false;
-				}
-			}
-			if (position >= 0 && length >= 0) {
-				getModel().beginRecording(this, getLabel(), position, length);
-			} else {
-				getModel().beginRecording(this, getLabel());
-			}
-			getViewer().startSelectionChange();
-			getModel().aboutToChangeModel();
-			return true;
-		}
-        return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected final void doExecute() {
-		DesignRange range = getViewer().getRangeSelection();
-		if (range != null && range.isValid()) {
-			DOMRange domrange = (range == null || !range.isValid()) ? null
-					: toDOMRange(range);
-			_resultRange = doRangeExecute(domrange);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected final ISelection getAfterCommandDesignerSelection() {
-//		try {
-			if (_resultRange == null) {
-				return null;
-			}
-			IDOMPosition startPos = _resultRange.getStartPosition();
-			DesignPosition start = DOMPositionHelper.toDesignPosition(startPos);
-			if (_resultRange.isEmpty()) {
-				return new DesignRange(start, start);
-			}
-            IDOMPosition endPos = _resultRange.getEndPosition();
-            return new DesignRange(start, DOMPositionHelper
-            		.toDesignPosition(endPos));
-            // TODO: don't know what this exception catch is for
-//		} catch (Exception e) {
-//			// "Selection error"
-//			_log.error("Error.RangeModeCommand.SetSelection"); //$NON-NLS-1$
-//			return null;
-//		}
-	}
-
-	/**
-	 * @param range
-	 * @return
-	 */
-	private DOMRange toDOMRange(DesignRange range) {
-		return new DOMRange(DOMPositionHelper.toDOMPosition(range
-				.getStartPosition()), DOMPositionHelper.toDOMPosition(range
-				.getEndPosition()));
-	}
-
-	/**
-	 * In the implementation of this method, should not do anything relating to
-	 * EditPart. (maybe even not ICSSStyle, since not style information not
-	 * refreshed yet)
-	 * @param selection 
-	 * 
-	 * @return null means no change have been done to the model. In this case,
-	 *         system may choose to cancel undo recorrding, etc.
-	 */
-	protected abstract DOMRange doRangeExecute(DOMRange selection);
-
-	/**
-	 * @param parent
-	 * @param ref
-	 * @param child
-	 */
-	protected static void appendChild(Node parent, Node ref, Node child) {
-		Node next = ref.getNextSibling();
-		if (next == null)
-			parent.appendChild(child);
-		else
-			parent.insertBefore(child, next);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/SelectAllCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/SelectAllCommand.java
deleted file mode 100644
index 4118016..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/SelectAllCommand.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.EditHelper;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.EditValidateUtil;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.IMovementMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.InlineEditingNavigationMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.JSFRootContainerPositionRule;
-import org.eclipse.jst.pagedesigner.validation.caret.RootContainerPositionRule;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-/**
- * Called in response to a Ctrl-A-style select all action
- *
- */
-public class SelectAllCommand extends Command {
-	private IHTMLGraphicalViewer _viewer;
-
-	/**
-	 * @param label
-	 * @param viewer
-	 */
-	public SelectAllCommand(String label, IHTMLGraphicalViewer viewer) {
-		super(label);
-		_viewer = viewer;
-	}
-
-	public void execute() {
-		Node document = _viewer.getModel().getDocument();
-		IMovementMediator validator = new InlineEditingNavigationMediator(
-				new ActionData(ActionData.KEYBOARD_NAVAGATION, null));
-		Node htmlRoot = RootContainerPositionRule
-				.getBasicContainer((Document) document);
-		Node jsfRoot = JSFRootContainerPositionRule
-				.getBasicContainer((Document) document, 3);
-		Node root;
-		if (htmlRoot != null && jsfRoot != null) {
-			if (EditModelQuery.isChild(htmlRoot, jsfRoot)) {
-				root = htmlRoot;
-			} else if (EditModelQuery.isChild(jsfRoot, htmlRoot)) {
-				root = jsfRoot;
-			} else {
-				root = htmlRoot;
-			}
-		} else {
-			if (htmlRoot != null) {
-				root = htmlRoot;
-			} else if (jsfRoot != null) {
-				root = jsfRoot;
-			} else {
-				root = document;
-			}
-		}
-		IDOMPosition position1, position2;
-		// if (root.hasChildNodes())
-		// {
-		// Node first = root.getFirstChild();
-		// position1 = new DOMRefPosition(first, false);
-		// Node last = root.getLastChild();
-		// position2 = new DOMRefPosition(last, true);
-		// }
-		// else
-		// {
-		position1 = new DOMPosition(root, 0);
-		position2 = new DOMPosition(root, root.getChildNodes().getLength());
-		// }
-		if (!validator.isValidPosition(position1)) {
-			position1 = EditHelper.moveToNextEditPosition(position1, true,
-					validator);
-		}
-		if (!validator.isValidPosition(position2)) {
-			position2 = EditHelper.moveToNextEditPosition(position2, false,
-					validator);
-		}
-		if (EditValidateUtil.validPosition(position1)
-				&& EditValidateUtil.validPosition(position2)) {
-			_viewer.setRange(DOMPositionHelper.toDesignPosition(position1),
-					DOMPositionHelper.toDesignPosition(position2));
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/UnapplyStyleCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/UnapplyStyleCommand.java
deleted file mode 100644
index b2c05e4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/UnapplyStyleCommand.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public class UnapplyStyleCommand extends ApplyStyleCommand {
-	/**
-	 * @param viewer
-	 * @param tag
-	 * @param property
-	 * @param value
-	 */
-	public UnapplyStyleCommand(IHTMLGraphicalViewer viewer, String tag,
-			String property, String value) {
-		super(viewer, tag, property, value);
-	}
-
-	/**
-	 * @param viewer
-	 * @param node
-	 * @param property
-	 * @param value
-	 */
-	public UnapplyStyleCommand(IHTMLGraphicalViewer viewer, Element node,
-			String property, String value) {
-		super(viewer, node, property, value);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.RangeModeCommand#doRangeExecute(org.eclipse.jst.pagedesigner.dom.DOMRange)
-	 */
-	protected DOMRange doRangeExecute(DOMRange range) {
-		if (range == null || range.isEmpty()) {
-			return null;
-		}
-
-		boolean ordered = range.isOrdered();
-		IDOMPosition start = ordered ? range.getStartPosition() : range
-				.getEndPosition();
-		IDOMPosition end = ordered ? range.getEndPosition() : range
-				.getStartPosition();
-
-		Node common = DOMUtil.findCommonAncester(start.getContainerNode(), end
-				.getContainerNode());
-		if (common == null) {
-			// should not happen.
-			return null;
-		}
-
-		if (common instanceof Text) {
-			doTextNodeStyleApply((Text) common, start.getOffset(), end
-					.getOffset());
-		}
-
-		return null;
-	}
-
-	/**
-	 * @param start
-	 * @param end
-	 * @param common
-	 */
-	private DOMRange doTextNodeStyleApply(Text textNode, int startOffset,
-			int endOffset) {
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/WorkNode.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/WorkNode.java
deleted file mode 100644
index 3a04f24..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/range/WorkNode.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.range;
-
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public final class WorkNode {
-	private WorkNode parent;
-
-	private WorkNode previous;
-
-	private WorkNode next;
-
-	private Node node;
-
-	private final int pos[];
-
-	private boolean isRoot;
-
-	/**
-	 * @param node
-	 * @param pos1
-	 * @param pos2
-	 */
-	public WorkNode(Node node, final int pos1, final int pos2) {
-		this.pos = resoveOffsets(node, pos1, pos2);
-		this.node = node;
-	}
-
-	/**
-	 * @return Returns the node.
-	 */
-	public Node getNode() {
-		return node;
-	}
-
-	/**
-	 * @param node
-	 *            The node to set.
-	 */
-	public void setNode(Node node) {
-		this.node = node;
-	}
-
-	/**
-	 * @return the offsets
-	 */
-	int[] getQualifiedOffsets() {
-		int result[] = new int[] { getPosOffsets()[0], getPosOffsets()[1] };
-		result[0] = result[0] < 0 ? 0 : result[0];
-		int length = EditModelQuery.getNodeLenth(node);
-		result[0] = result[0] > length ? length : result[0];
-		result[1] = result[1] < 0 ? 0 : result[1];
-		result[1] = result[1] > length ? length : result[1];
-		return result;
-	}
-
-	/**
-	 * @return Returns the pos.
-	 */
-	public int[] getPosOffsets() {
-		return pos;
-	}
-
-	/**
-	 * @return Returns the isRoot.
-	 */
-	public boolean isRoot() {
-		return isRoot;
-	}
-
-	/**
-	 * @param isRoot
-	 *            The isRoot to set.
-	 */
-	public void setRoot(boolean isRoot) {
-		this.isRoot = isRoot;
-	}
-
-	/**
-	 * @return Returns the next.
-	 */
-	public WorkNode getNext() {
-		return next;
-	}
-
-	/**
-	 * @param next
-	 *            The next to set.
-	 */
-	public void setNext(WorkNode next) {
-		this.next = next;
-	}
-
-	/**
-	 * @return Returns the parent.
-	 */
-	public WorkNode getParent() {
-		return parent;
-	}
-
-	/**
-	 * @param parent
-	 *            The parent to set.
-	 */
-	public void setParent(WorkNode parent) {
-		this.parent = parent;
-	}
-
-	/**
-	 * @return Returns the previous.
-	 */
-	public WorkNode getPrevious() {
-		return previous;
-	}
-
-	/**
-	 * @param previous
-	 *            The previous to set.
-	 */
-	public void setPrevious(WorkNode previous) {
-		this.previous = previous;
-	}
-
-	private int[] resoveOffsets(Node node1, int pos1, int pos2) {
-		int left = EditModelQuery.getNodeStartIndex(node1);
-		return new int[] { pos1 - left, pos2 - left };
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer sb = new StringBuffer();
-		sb.append("Node:").append(node).append(" pos[]:").append(pos);
-		return sb.toString();
-	}
-
-	boolean isWholeSelected() {
-		int start = EditModelQuery.getNodeStartIndex(node);
-		int end = EditModelQuery.getNodeEndIndex(node);
-		return getQualifiedOffsets()[0] <= 0
-				&& getQualifiedOffsets()[1] >= end - start;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/AddSubNodeCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/AddSubNodeCommand.java
deleted file mode 100644
index 7df9a32..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/AddSubNodeCommand.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.commands.single;
-
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AddSubNodeCommand extends SingleNodeCommand {
-	private final IDOMElement _parent;
-	private IDOMElement _child;
-
-	private final String _tagName;
-
-	private final String _url;
-
-	private final Map _attributes;
-
-	/**
-	 * @param label
-	 * @param node
-	 * @param name 
-	 * @param url 
-	 * @param attributs 
-	 */
-	public AddSubNodeCommand(String label, IDOMElement node, String name,
-			String url, Map attributs) {
-		super(label, node);
-		this._parent = node;
-		this._tagName = name;
-		this._url = url;
-		this._attributes = attributs;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		String prefix = JSPUtil.getOrCreatePrefix(_parent.getModel(), _url,
-				null);
-		_child = (IDOMElement) _parent.getOwnerDocument().createElement(
-				prefix + ":" + _tagName);
-		for (Iterator iterator = _attributes.keySet().iterator(); iterator
-				.hasNext();) {
-			String key = (String) iterator.next();
-			String value = (String) _attributes.get(key);
-			_child.setAttribute(key, value);
-		}
-		_parent.appendChild(_child);
-	}
-
-	/**
-	 * @return the child node
-	 */
-	public IDOMElement getChildNode() {
-		return _child;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/ChangeAttributeCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/ChangeAttributeCommand.java
deleted file mode 100644
index bd31fc6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/ChangeAttributeCommand.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.single;
-
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * This command is for change an single attribute of an IDOMElement. Normally
- * used by the properties view.
- * 
- * @author mengbo
- */
-public class ChangeAttributeCommand extends SingleNodeCommand {
-	private IDOMElement _element;
-
-	private String _attrValue;
-
-	private String _attrName;
-
-	private Map _attributes;
-
-	private boolean _keepEmptyAttribute = false;
-
-	/**
-	 * 
-	 * @param label
-	 * @param node
-	 * @param attrName
-	 * @param attrValue
-	 *            if null means remove the specified attribute
-	 */
-	public ChangeAttributeCommand(String label, IDOMElement node,
-			String attrName, String attrValue) {
-		super(label, node);
-		_element = node;
-		_attrName = attrName;
-		_attrValue = attrValue;
-		_attributes = null;
-	}
-
-	/** TODO: can these two constructors be merged?
-	 * @param label
-	 * @param node
-	 * @param attributes
-	 */
-	public ChangeAttributeCommand(String label, IDOMElement node, Map attributes) {
-		super(label, node);
-		_element = node;
-		_attributes = attributes;
-		_attrName = null;
-		_attrValue = null;
-	}
-
-	protected void doExecute() {
-		if (_attrName != null) {
-			updateElement(_attrName, _attrValue);
-		} else if (_attributes != null) {
-			for (Iterator iterator = _attributes.keySet().iterator(); iterator
-					.hasNext();) {
-				String name = (String) iterator.next();
-				String value = (String) _attributes.get(name);
-				if (isSameValue(value, _element.getAttribute(name))) {
-					continue;
-				}
-				updateElement(name, value);
-			}
-		}
-	}
-
-	private void updateElement(String name, String value) {
-		if (_element.hasAttribute(name) && isEmptyString(value)
-				&& !_keepEmptyAttribute) {
-			_element.removeAttribute(name);
-		}
-		if (!isEmptyString(value) || _keepEmptyAttribute) {
-			_element.setAttribute(name, value);
-		}
-	}
-
-	private boolean isSameValue(String value1, String value2) {
-		value1 = value1 == null ? "" : value1;
-		value2 = value2 == null ? "" : value2;
-		return value1.equals(value2);
-	}
-
-	private boolean isEmptyString(String str) {
-		if (str == null || str.equals("")) {
-			return true;
-		}
-        return false;
-	}
-
-	/**
-	 * @return Returns the keepEmptyAttribute.
-	 */
-	public boolean isKeepEmptyAttribute() {
-		return _keepEmptyAttribute;
-	}
-
-	/**
-	 * @param keepEmptyAttribute
-	 *            The keepEmptyAttribute to set.
-	 */
-	public void setKeepEmptyAttribute(boolean keepEmptyAttribute) {
-		this._keepEmptyAttribute = keepEmptyAttribute;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/ChangeStyleCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/ChangeStyleCommand.java
deleted file mode 100644
index 4a88c34..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/ChangeStyleCommand.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.single;
-
-import java.util.Map;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.commands.CommandResources;
-import org.eclipse.jst.pagedesigner.dom.DOMStyleUtil;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSStyleDeclaration;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.css.ElementCSSInlineStyle;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ChangeStyleCommand extends SingleNodeCommand {
-	private Map _styleProperties = null;
-
-	private CSSPropertyContext _context = null;
-
-	/**
-	 * @param node
-	 * @param map
-	 */
-	public ChangeStyleCommand(IDOMElement node, Map map) {
-		super(CommandResources
-				.getString("ChangeStyleCommand.Label.ChangeStyle"), node); //$NON-NLS-1$
-		_styleProperties = map;
-	}
-
-	/**
-	 * @param node
-	 * @param context
-	 */
-	public ChangeStyleCommand(IDOMElement node, CSSPropertyContext context) {
-		super(CommandResources
-				.getString("ChangeStyleCommand.Label.ChangeStyle"), node); //$NON-NLS-1$
-		_context = context;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		getOriginalElement().getModel().beginRecording(this);
-		try {
-			if (_styleProperties != null) {
-				IDOMElement original = this.getOriginalElement();
-				DOMStyleUtil.insertStyle(original, _styleProperties);
-			} else if (_context != null) {
-				ICSSStyleDeclaration styleDeclaration = (ICSSStyleDeclaration) ((ElementCSSInlineStyle) getOriginalElement())
-						.getStyle();
-
-				if (styleDeclaration == null) {
-					getOriginalElement().setAttribute(IJSFConstants.ATTR_STYLE,
-							""); //$NON-NLS-1$
-					styleDeclaration = (ICSSStyleDeclaration) ((ElementCSSInlineStyle) getOriginalElement())
-							.getStyle();
-				}
-				_context.applyModified(styleDeclaration);
-			}
-		} finally {
-			getOriginalElement().getModel().endRecording(this);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/ChangeTagCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/ChangeTagCommand.java
deleted file mode 100644
index 2de5d4c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/ChangeTagCommand.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.single;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Attr;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * This is for command that changes an element's tagname and some attributes.
- * 
- * @author mengbo
- */
-public class ChangeTagCommand extends SingleNodeCommand {
-    private final IDOMElement _element;
-
-    private final Map _attributes;
-
-    private final boolean _moveContent;
-
-    private String _uri;
-
-    private String _localTag;
-
-    private  String _totalTag;
-
-	/**
-	 * @param label
-	 * @param node
-	 * @param totaltag
-	 * @param attributes
-	 * @param movecontent
-	 */
-	public ChangeTagCommand(String label, IDOMElement node, String totaltag,
-			Map attributes, boolean movecontent) {
-		super(label, node);
-		this._element = node;
-		this._totalTag = totaltag;
-		this._attributes = attributes;
-		this._moveContent = movecontent;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		String tag = null;
-
-		if (_totalTag != null) {
-			tag = _totalTag;
-		} else {
-			if (ITLDConstants.URI_HTML.equals(_uri)) {
-				tag = _localTag;
-			} else if (ITLDConstants.URI_JSP.equals(_uri)) {
-				tag = "jsp:" + _localTag;
-			} else {
-				tag = JSPUtil.getOrCreatePrefix(getModel(), _uri, null)
-						+ _localTag;
-			}
-		}
-		// we need to remove the old element and create a new one with the new
-		// tag.
-		IDOMElement replacement = (IDOMElement) _element.getOwnerDocument()
-				.createElement(tag);
-		NamedNodeMap attrs = _element.getAttributes();
-		for (int i = 0, n = attrs.getLength(); i < n; i++) {
-			Attr a = (Attr) attrs.item(i);
-			replacement.setAttribute(a.getName(), a.getValue());
-		}
-		if (_attributes != null) {
-			for (Iterator iter = _attributes.keySet().iterator(); iter
-					.hasNext();) {
-				String name = (String) iter.next();
-				String value = (String) _attributes.get(name);
-				replacement.setAttribute(name, value);
-			}
-		}
-		if (_moveContent) {
-			NodeList nl = _element.getChildNodes();
-			ArrayList list = new ArrayList();
-			for (int i = 0, n = nl.getLength(); i < n; i++) {
-				list.add(nl.item(i));
-
-			}
-			for (int i = 0, n = list.size(); i < n; i++) {
-				replacement.appendChild((Node) list.get(i));
-			}
-		}
-		_element.getParentNode().replaceChild(replacement, _element);
-		setReplacedElement(replacement);
-	}
-
-	/**
-	 * @return the replacemd element
-	 */
-	public IDOMElement getNewElement() {
-		return getReplacedElment();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/InsertSubNodeCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/InsertSubNodeCommand.java
deleted file mode 100644
index 7790c17..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/InsertSubNodeCommand.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.single;
-
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class InsertSubNodeCommand extends SingleNodeCommand {
-	private IDOMElement _parent, _child, _refchild;
-
-	/**
-	 * @param label
-	 * @param parent
-	 * @param child 
-	 * @param refchild 
-	 */
-	public InsertSubNodeCommand(String label, IDOMElement parent,
-			IDOMElement child, IDOMElement refchild) {
-		super(label, parent);
-		this._parent = parent;
-		this._child = child;
-		this._refchild = refchild;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		_parent.insertBefore(_child, _refchild);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/RemoveSubNodeCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/RemoveSubNodeCommand.java
deleted file mode 100644
index 8ec630c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/RemoveSubNodeCommand.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.single;
-
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class RemoveSubNodeCommand extends SingleNodeCommand {
-	private IDOMElement _parent, _child;
-
-	/**
-	 * @param label
-	 * @param parent
-	 * @param child 
-	 */
-	public RemoveSubNodeCommand(String label, IDOMElement parent,
-			IDOMElement child) {
-		super(label, parent);
-		_parent = parent;
-		_child = child;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#doExecute()
-	 */
-	protected void doExecute() {
-		_parent.removeChild(_child);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/SingleNodeCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/SingleNodeCommand.java
deleted file mode 100644
index 68f5db4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/single/SingleNodeCommand.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.commands.single;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.dom.DOMRangeHelper;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * This is the super class for those commands that change attribute or tag name
- * of a single element.
- * 
- * This base class helps handles selection. As after the command, the editpart
- * may totally change, so it tried to remember the selection before command and
- * then restore it after the command.
- * 
- * So the limitation to child class of this command is that: the command should
- * only change a single element node. It could remove the node and replace with
- * a new one, but should not touch other nodes.
- * 
- * @author mengbo
- */
-public abstract class SingleNodeCommand extends DesignerCommand {
-	List _structuredSelectedNodes = null;
-
-	DOMRange _rangeSelection = null;
-
-	IDOMElement _originalElement;
-
-	IDOMElement _replacement;
-
-	/**
-	 * @param label
-	 * @param node
-	 */
-	public SingleNodeCommand(String label, IDOMElement node) {
-		super(label, node);
-		_originalElement = node;
-	}
-
-	protected void preExecute() {
-		super.preExecute();
-		// remember current selection
-		ISelection selection = getViewer().getSelection();
-		if (selection instanceof IStructuredSelection) {
-			Object[] array = ((IStructuredSelection) selection).toArray();
-			_structuredSelectedNodes = new ArrayList();
-			if (array != null) {
-				for (int i = 0; i < array.length; i++) {
-					EditPart part = (EditPart) array[i];
-					_structuredSelectedNodes.add(part.getModel());
-				}
-			}
-		} else if (selection instanceof DesignRange) {
-			DesignRange range = (DesignRange) selection;
-			_rangeSelection = DOMRangeHelper.toDOMRange(range);
-		}
-	}
-
-	/**
-	 * this method is to be called by child class in the doExecute() method.
-	 * Telling the super class that the original element will be replaced by the
-	 * specified element.
-	 * 
-	 * @param ele
-	 */
-	protected void setReplacedElement(IDOMElement ele) {
-		_replacement = ele;
-	}
-
-	/**
-	 * @return the replacement element
-	 */
-	protected IDOMElement getReplacedElment() {
-		return _replacement;
-	}
-
-	/**
-	 * @return the original element
-	 */
-	protected IDOMElement getOriginalElement() {
-		return _originalElement;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.DesignerCommand#getAfterCommandDesignerSelection()
-	 */
-	protected final ISelection getAfterCommandDesignerSelection() {
-		if (_structuredSelectedNodes != null) {
-			// handle replacement fire.
-			if (_replacement != null && _replacement != _originalElement) {
-				int index = _structuredSelectedNodes.indexOf(_originalElement);
-				if (index >= 0) {
-					_structuredSelectedNodes.set(index, _replacement);
-				}
-			}
-
-			// as the editpart may have been refreshed, so recreated the
-			// selection
-			List parts = new ArrayList();
-			for (int i = 0, size = _structuredSelectedNodes.size(); i < size; i++) {
-				Object obj = _structuredSelectedNodes.get(i);
-				if (obj instanceof INodeNotifier) {
-					EditPart part = (EditPart) ((INodeNotifier) obj)
-							.getAdapterFor(EditPart.class);
-					if (part != null)
-						parts.add(part);
-				}
-			}
-			StructuredSelection sel = new StructuredSelection(parts);
-			return sel;
-		} else if (_rangeSelection != null) {
-			DOMRange newrange = handleReplacement(_rangeSelection,
-					_originalElement, _replacement);
-			return DOMRangeHelper.toDesignRange(newrange);
-		} else {
-			return null;
-		}
-	}
-
-	private DOMRange handleReplacement(DOMRange selection,
-			IDOMElement original, IDOMElement replacement) {
-		if (replacement == null || replacement == original)
-			return selection;
-		return DOMRangeHelper.handleReplacement(selection, original,
-				replacement);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/AbstractTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/AbstractTagConverter.java
deleted file mode 100644
index 8c9054c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/AbstractTagConverter.java
+++ /dev/null
@@ -1,497 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo;
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.eclipse.jst.pagedesigner.preview.PageExpressionContext;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * This is base class for all non-hidden tag converters.
- * 
- * @author mengbo
- * @version 1.5
- */
-public abstract class AbstractTagConverter implements ITagConverter,
-		ITagEditInfo, INodeAdapter, IDOMFactory {
-	private IDOMDocument _targetDocument;
-
-	private Element _hostElement;
-
-	private Element _resultElement;
-
-	private List _childNodes = Collections.EMPTY_LIST;
-
-	private Map _childNodePositions = Collections.EMPTY_MAP;
-
-	private int _mode;
-
-	private int _minWidth;
-
-	private int _minHeight;
-
-	private boolean _needBorderDecorator;
-
-	/**
-	 * @param host 
-	 * 
-	 */
-	public AbstractTagConverter(Element host) {
-		_hostElement = host;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#setTargetDocument(org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument)
-	 */
-	public void setDestDocument(IDOMDocument document) {
-		_targetDocument = document;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#convertRefresh(java.lang.Object)
-	 */
-	public final void convertRefresh(Object context) {
-		_resultElement = null;
-		_childNodes = new ArrayList();
-		_childNodePositions = new HashMap();
-
-		_resultElement = doConvertRefresh();
-		if (_resultElement instanceof INodeNotifier) {
-			((INodeNotifier) _resultElement).addAdapter(this);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#notifyChanged(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier,
-	 *      int, java.lang.Object, java.lang.Object, java.lang.Object, int)
-	 */
-	public void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-		// do nothing.
-	}
-
-	/**
-	 * Child class should override this method. The child class should NEVER
-	 * change the host DOM structure.
-	 * 
-	 * @return the convert result. Should be an HTML element.
-	 */
-	protected abstract Element doConvertRefresh();
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#getHostElement()
-	 */
-	public final Element getHostElement() {
-		return _hostElement;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#getResultElement()
-	 */
-	public final Element getResultElement() {
-		return _resultElement;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#getChildModeList()
-	 */
-	public final List getChildModeList() {
-		return _childNodes;
-	}
-
-
-	public List getNonVisualChildren() 
-    {
-	    // by default, no non-visual children
-        return Collections.EMPTY_LIST;
-    }
-
-    /**
-	 * child class should call this method.
-	 * 
-	 * @param childNode
-	 *            the childNode of the hostElement that should be futher
-	 *            converted.
-	 * @param position
-	 * 
-	 */
-	protected void addChild(Node childNode, ConvertPosition position) {
-		_childNodes.add(childNode);
-		_childNodePositions.put(childNode, position);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#getChildVisualPosition(org.w3c.dom.Node)
-	 */
-	public final ConvertPosition getChildVisualPosition(Node childModel) {
-		return (ConvertPosition) _childNodePositions.get(childModel);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#isVisualByHTML()
-	 */
-	public boolean isVisualByHTML() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#getVisualImage()
-	 */
-	public Image getVisualImage() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#dispose()
-	 */
-	public void dispose() {
-        // do nothing; children may wish to sub-class
-        // TODO: null shared references?
-        // this doesn't seem to be called by anybody..
-        // need to review this
-	}
-
-	/**
-	 * @param node
-	 * @return true if the node should be ignored for  conversion purposes
-	 */
-	protected boolean shouldIgnore(Node node) {
-		int nodeType = node.getNodeType();
-		switch (nodeType) {
-		case Node.TEXT_NODE:
-		case Node.CDATA_SECTION_NODE:
-		case Node.ELEMENT_NODE:
-			return false;
-		default:
-			return true;
-		}
-
-	}
-
-	/**
-	 * utility method for those converter that only converts the host tag's name
-	 * and directly copy children.
-	 * @param src 
-	 * @param dest 
-	 * 
-	 */
-	protected void copyChildren(Element src, Element dest) {
-		Node node = src.getFirstChild();
-		int index = 0;
-		for (; node != null; node = node.getNextSibling()) {
-			if (!shouldIgnore(node)) {
-				addChild(node, new ConvertPosition(dest, index++));
-			}
-		}
-	}
-
-	/**
-	 * utility method for those converter that directly copy children.
-	 * @param src 
-	 * @param dest 
-	 * 
-	 */
-	protected void dumCopyChildren(Element src, Element dest) {
-		Node node = src.getFirstChild();
-		Document destDoc = dest.getOwnerDocument();
-		for (; node != null; node = node.getNextSibling()) {
-			if (!shouldIgnore(node)) {
-				Node n = DOMUtil.cloneNodeDeepIgnoreError(destDoc, node);
-				dest.appendChild(n);
-			}
-		}
-	}
-
-	/**
-	 * In the future, the conversion result HTML DOM tree could be in another
-	 * document.
-	 * 
-	 * @return the destination document
-	 */
-	public IDOMDocument getDestDocument() {
-		if (this._targetDocument != null) {
-			return this._targetDocument;
-		}
-        return (IDOMDocument) _hostElement.getOwnerDocument();
-	}
-
-	/**
-	 * shortcut method. Child class should always use this method to create a
-	 * result element.
-	 * 
-	 * @param tagName
-	 * @return a new element named tagName
-	 */
-	public Element createElement(String tagName) {
-		return getDestDocument().createElement(tagName);
-	}
-
-	/**
-	 * shortcut method. Child class should always use this method to create a
-	 * text node.
-	 * 
-	 * @param text
-	 * @return a new text node using text as the value
-	 */
-	public Text createText(String text) {
-		return getDestDocument().createTextNode(text);
-	}
-
-	/**
-	 * @param original
-	 * @return the mapped String  TODO: currently does nothing
-	 */
-	protected String mapURL(String original) {
-		// TODO: how to map URL? such as original url look like:
-		// getContext().getPath()+...
-		return original;
-	}
-
-	// TODO: FIXME: XXX:
-	// if the value is expression, we may want to do something here!!!
-	/**
-	 * @param value
-	 * @return value mapped based on EL expression
-	 */
-	protected String mapValue(String value) {
-		if (value == null) {
-			return null;
-		}
-		if (isDesignerMode()) {
-			// if there has jsf binding expressions
-			int checkPos = value.indexOf("#{");
-			if (checkPos != -1) {
-				String mapValue = "";
-				int preferType = PreferenceReader.getMapValueType();
-				switch (preferType) {
-				case PreferenceReader.FULL_EXPRESSION_TYPE:
-					mapValue = value;
-					break;
-				case PreferenceReader.LAST_EXPRESSION_TYPE:
-					String strBackup = value;
-					StringBuffer sb = new StringBuffer();
-					while (strBackup.indexOf("#{") != -1) {
-						int pos = strBackup.indexOf("#{");
-						int endBracketPos = strBackup.indexOf("}", pos + 1);
-						if (endBracketPos != -1) {
-							sb.append(strBackup.substring(0, pos + 2));
-							String exp = strBackup.substring(pos + 2,
-									endBracketPos);
-							if (allowTrim(exp)) {
-								int lastDotPos = exp.lastIndexOf(".");
-								if (lastDotPos != -1) {
-									String convertedExp = exp
-											.substring(lastDotPos + 1);
-									sb.append(convertedExp);
-								} else {
-									sb.append(exp);
-								}
-
-							} else {
-								sb.append(exp);
-							}
-							sb.append("}");
-						} else {
-							break;
-						}
-						if (strBackup.length() > endBracketPos + 1) {
-							strBackup = strBackup.substring(endBracketPos + 1);
-						} else {
-							strBackup = "";
-							break;
-						}
-
-					}
-					sb.append(strBackup);
-					mapValue = sb.toString();
-					break;
-				case PreferenceReader.REAL_VALUE_TYPE:
-					// TODO calculate the expression value
-				default:
-					mapValue = value;
-					break;
-				}
-
-				return mapValue;
-			}
-		} else {
-			// preview mode. let's try to display the value.
-			try {
-				return (String) PageExpressionContext.getCurrent()
-						.evaluateExpression(value, String.class, null);
-			} catch (Exception ex) {
-				// can't calculate the result. ignore.
-				// ex.printStackTrace();
-			}
-		}
-		return value;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#needBorderDecorator()
-	 */
-	public boolean needBorderDecorator() {
-		return this._needBorderDecorator;
-	}
-
-	/**
-	 * @param b
-	 */
-	public void setNeedBorderDecorator(boolean b) {
-		this._needBorderDecorator = b;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#needTableDecorator()
-	 */
-	public boolean needTableDecorator() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#isAdapterForType(java.lang.Object)
-	 */
-	public boolean isAdapterForType(Object type) {
-		if (type == ITagEditInfo.class) {
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * @param mode
-	 */
-	public final void setMode(int mode) {
-		this._mode = mode;
-	}
-
-	/**
-	 * @return true if the converter mode is preview
-	 */
-	public final boolean isPreviewMode() {
-		return this._mode == IConverterFactory.MODE_PREVIEW;
-	}
-
-	/**
-	 * @return true if the converter mode is designer
-	 */
-	public final boolean isDesignerMode() {
-		return this._mode == IConverterFactory.MODE_DESIGNER;
-	}
-
-	/**
-	 * @return the converter mode
-	 */
-	public final int getMode() {
-		return this._mode;
-	}
-
-	/**
-	 * The method is used to judge whether the value binding and method binding
-	 * expression is allowed to be trimmed.Currently only expression contains
-	 * only letter,digit,and '.' is allowed to be trimmed.
-	 * 
-	 * @param expression
-	 *            value binding or method binding expression
-	 * @return
-	 */
-	private boolean allowTrim(String expression) {
-		for (int i = 0, size = expression.length(); i < size; i++) {
-			char ch = expression.charAt(i);
-			if (!Character.isLetterOrDigit(ch) && (ch != '.') && (ch != '_')) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#getMinWidth()
-	 */
-	public int getMinWidth() {
-		return this._minWidth;
-	}
-
-	/**
-	 * @param minWidth
-	 */
-	public void setMinWidth(int minWidth) {
-		this._minWidth = minWidth;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#getMinHeight()
-	 */
-	public int getMinHeight() {
-		return this._minHeight;
-	}
-
-	/**
-	 * @param minHeight
-	 */
-	public void setMinHeight(int minHeight) {
-		this._minHeight = minHeight;
-	}
-
-	/**
-	 * @param element
-	 * @param attrname
-	 * @return the attribute on element with the name attrname
-	 */
-	public static boolean hasAttribute(Element element, String attrname) {
-		return element.hasAttribute(attrname);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConvertPosition.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConvertPosition.java
deleted file mode 100644
index 130ec40..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConvertPosition.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import org.w3c.dom.Node;
-
-/**
- * This class is used to locate a position for child model nodes.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class ConvertPosition {
-	private final Node _parentNode;
-
-	private final int _index;
-
-	/**
-	 * @param parent \
-	 * @param index 
-	 * 
-	 */
-	public ConvertPosition(Node parent, int index) {
-		this._parentNode = parent;
-		this._index = index;
-	}
-
-	/**
-	 * @return the parent node
-	 */
-	public Node getParentNode() {
-		return _parentNode;
-	}
-
-	/**
-	 * @return the index
-	 */
-	public int getIndex() {
-		return _index;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConverterFacRegistryReader.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConverterFacRegistryReader.java
deleted file mode 100644
index 147850e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConverterFacRegistryReader.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.pagedesigner.IJMTConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ConverterFacRegistryReader {
-	private static List<IConverterFactory> _handlers = null;
-
-	/**
-	 * @return the list of handlers.  The list is not modifiable and will
-	 * throw exceptions if it is attempted.
-	 */
-	public static synchronized List<IConverterFactory> getAllHandlers() {
-		if (_handlers == null) {
-			_handlers = readAllHandlers();
-		}
-		return Collections.unmodifiableList(_handlers);
-
-	}
-
-	private static List<IConverterFactory> readAllHandlers() {
-		List result = new ArrayList<IConverterFactory>();
-		IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
-				.getExtensionPoint(PDPlugin.getPluginId(),
-						IJMTConstants.EXTENSION_POINT_PAGEDESIGNER);
-		IExtension[] extensions = extensionPoint.getExtensions();
-
-		for (int i = 0; i < extensions.length; i++) {
-			IExtension ext = extensions[i];
-			IConfigurationElement[] dropHandlers = ext
-					.getConfigurationElements();
-
-			for (int j = 0; j < dropHandlers.length; j++) {
-				if (dropHandlers[j].getName().equals(
-						IJMTConstants.TAG_CONVERTER_FACTORY)) {
-					dropHandlers[j].getAttribute("class");
-					Object obj;
-					try {
-						obj = dropHandlers[j]
-								.createExecutableExtension("class");
-
-						if (obj instanceof IConverterFactory) {
-							result.add(obj);
-						}
-					} catch (CoreException e) {
-						// ignore the exception
-						e.printStackTrace();
-					}
-				}
-			}
-		}
-		return result;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConverterFactoryRegistry.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConverterFactoryRegistry.java
deleted file mode 100644
index bcbaa37..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConverterFactoryRegistry.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.utils.JSFSharedImages;
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.converter.html.HTMLConverterFactory;
-import org.eclipse.jst.pagedesigner.converter.jsp.JSPConverterFactory;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ConverterFactoryRegistry {
-	List _factories = new ArrayList();
-
-	private static ConverterFactoryRegistry _instance;
-
-	/**
-	 * 
-	 */
-	private ConverterFactoryRegistry() {
-		_factories.add(new JSPConverterFactory());
-		_factories.add(new HTMLConverterFactory());
-
-		List<IConverterFactory> facs = ConverterFacRegistryReader.getAllHandlers();
-		if (facs != null) {
-			for (IConverterFactory fac : facs) {
-				addFactory(fac);
-			}
-		}
-	}
-
-	/**
-	 * @param fac
-	 */
-	public void addFactory(IConverterFactory fac) {
-		_factories.add(fac);
-	}
-
-	/**
-	 * @param ele
-	 * @param mode
-	 * @param targetDocument
-	 * @return the new btag converter
-	 */
-	public ITagConverter createTagConverter(Element ele, int mode,
-			IDOMDocument targetDocument) {
-		ITagConverter converter = internalCreateTagConverter(ele, mode);
-		if (converter != null) {
-			converter.setDestDocument(targetDocument);
-		}
-		return converter;
-	}
-
-	/**
-	 * @param ele
-	 * @param mode
-	 * @return the new tag converter
-	 */
-	protected final ITagConverter internalCreateTagConverter(Element ele, int mode) {
-		String uri = CMUtil.getElementNamespaceURI(ele);
-		// first round, match uri
-		for (int i = 0, size = _factories.size(); i < size; i++) {
-			IConverterFactory fac = (IConverterFactory) _factories.get(i);
-			String facuri = fac.getSupportedURI();
-			if (facuri != null && facuri.equals(uri)) {
-				ITagConverter converter = fac.createConverter(ele, mode);
-				if (converter != null) {
-					return converter;
-				}
-			}
-		}
-		// second round
-		for (int i = 0, size = _factories.size(); i < size; i++) {
-			IConverterFactory fac = (IConverterFactory) _factories.get(i);
-			String facuri = fac.getSupportedURI();
-			if (facuri == null) {
-				ITagConverter converter = fac.createConverter(ele, mode);
-				if (converter != null) {
-					return converter;
-				}
-			}
-		}
-
-		// can't find. We need some default tag converter for it.
-		// if the tag is empty, show it as icon.
-		if (uri == null || ITLDConstants.URI_HTML.equals(uri)) {
-			// basically, for HTML or non JSP tag, directly renders it.
-			return new DumTagConverter(ele);
-		}
-        CMElementDeclaration decl = CMUtil.getElementDeclaration(ele);
-        if (decl == null) {
-        	return new DumTagConverter(ele);
-        }
-        int contentType = decl.getContentType();
-        if (contentType == CMElementDeclaration.EMPTY) {
-        	// if the tag is empty, show it as icon.
-        	return new HiddenTagConverter(ele,
-                    new LabelProvider()
-                    {
-                        public Image getImage(Object element) {
-                            return getUnknownImage();
-                        }
-                    }
-             );
-        }
-        return new DefaultUnknownTagConverter(ele, mode);
-
-	}
-
-	Image getUnknownImage() {
-		return JSFUICommonPlugin.getDefault().getImage(
-				JSFSharedImages.DEFAULT_PALETTE_TAG_IMG);
-	}
-
-	/**
-	 * @return the singleton instance of the registry
-	 */ 
-	public static ConverterFactoryRegistry getInstance() {
-		if (_instance == null) {
-			_instance = new ConverterFactoryRegistry();
-		}
-		return _instance;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConverterUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConverterUtil.java
deleted file mode 100644
index ade2b79..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConverterUtil.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import java.util.Set;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMText;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ConverterUtil {
-	/**
-	 * 
-	 * @param source
-	 * @param dest
-	 * @param ignore
-	 */
-	public static void copyAllAttributes(Element source, Element dest,
-			Set ignore) {
-		NamedNodeMap attrs = source.getAttributes();
-		for (int i = 0, size = attrs.getLength(); i < size; i++) {
-			Attr attr = (Attr) attrs.item(i);
-			if (ignore == null || !ignore.contains(attr.getName())) {
-				dest.setAttribute(attr.getName(), attr.getValue());
-			}
-		}
-	}
-
-	/**
-	 * copy a single attribute (if exist)
-	 * 
-	 * @param source
-	 * @param srcattr
-	 * @param dest
-	 * @param destattr
-	 */
-	public static void copyAttribute(Element source, String srcattr,
-			Element dest, String destattr) {
-		Attr attr = source.getAttributeNode(srcattr);
-		if (attr != null) {
-			dest.setAttribute(destattr, attr.getValue());
-		}
-	}
-
-	/**
-	 * @param hostElement
-	 * @return true if hostElement represents an empty container
-	 */
-	public static boolean isEmptyContainer(Element hostElement) {
-		NodeList nl = hostElement.getChildNodes();
-		if (nl == null || nl.getLength() == 0) {
-			return true;
-		}
-
-		for (int i = 0, n = nl.getLength(); i < n; i++) {
-			Node node = nl.item(i);
-			if (!(node instanceof IDOMText)) {
-				return false;
-			}
-			if (!((IDOMText) node).isElementContentWhitespace()) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * @param document
-	 * @param text
-	 * @return the descripton element in the document containing text
-	 */
-	public static Element createDescriptionElement(IDOMDocument document,
-			String text) {
-		if (document == null) {
-			return null;
-		}
-		Element span = document.createElement(IHTMLConstants.TAG_SPAN); //$NON-NLS-1$
-		span.setAttribute(
-				"style", "color:gray;font-style:italic;font-size:normal;"); //$NON-NLS-1$ //$NON-NLS-2$
-		if (text == null) {
-			span.appendChild(document.createTextNode(PDPlugin
-					.getResourceString("ConverterUtil.Description"))); //$NON-NLS-1$
-		} else {
-			span.appendChild(document.createTextNode(text));
-		}
-		return span;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DefaultUnknownTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DefaultUnknownTagConverter.java
deleted file mode 100644
index 7050685..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DefaultUnknownTagConverter.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.converter;
-
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Text;
-
-/**
- * This tag converter is for those unsupported jsp tags.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class DefaultUnknownTagConverter extends AbstractTagConverter {
-
-	/**
-	 * @param host
-	 * @param mode 
-	 */
-	public DefaultUnknownTagConverter(Element host, int  mode) {
-		super(host);
-        setMode(mode);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-	 */
-	protected Element doConvertRefresh() {
-		Element hostEle = this.getHostElement();
-		Element divEle = createElement("div");
-		String style = DOMUtil.getAttributeIgnoreCase(hostEle, "style");
-		if (style == null) {
-			style = "";
-		}
-		if (style.length() > 0 && !style.endsWith(";")) {
-			style += ";";
-		}
-		style += "border: none; padding: 0; margin: 0";
-		divEle.setAttribute("style", style);
-		Element div2 = createElement("span");
-        String border = isPreviewMode() ? "border-style: solid;border-width: 1px" : "border:none";
-		div2.setAttribute("style", "background-color: white;"+border+";color:gray");
-		Text txt = createText(hostEle.getTagName());
-		div2.appendChild(txt);
-
-		divEle.appendChild(div2);
-
-		Element div3 = createElement("div");
-		div3.setAttribute("style", "margin: 0; padding: 0");
-		divEle.appendChild(div3);
-
-		copyChildren(getHostElement(), div3);
-		return divEle;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#isWidget()
-	 */
-	public boolean isWidget() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#needBorderDecorator()
-	 */
-	public boolean needBorderDecorator() {
-		return true;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DumDeepTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DumDeepTagConverter.java
deleted file mode 100644
index 0a56b52..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DumDeepTagConverter.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DumDeepTagConverter extends AbstractTagConverter {
-
-	/**
-	 * @param host
-	 */
-	public DumDeepTagConverter(Element host) {
-		super(host);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-	 */
-	protected Element doConvertRefresh() {
-		return (Element) DOMUtil.cloneNodeDeepIgnoreError(getDestDocument(),
-				getHostElement());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return true;
-	}
-
-    // TODO: dead?
-//	private boolean internalIsWidget(Element result) {
-//		String tagname = result.getTagName();
-//		if (IHTMLConstants.TAG_INPUT.equalsIgnoreCase(tagname)
-//				|| IHTMLConstants.TAG_SELECT.equalsIgnoreCase(tagname)
-//				|| IHTMLConstants.TAG_TEXTAREA.equalsIgnoreCase(tagname)
-//				|| IHTMLConstants.TAG_IMG.equalsIgnoreCase(tagname)
-//				|| IHTMLConstants.TAG_HEAD.equalsIgnoreCase(tagname)
-//				|| IHTMLConstants.TAG_SCRIPT.equalsIgnoreCase(tagname)
-//				|| IHTMLConstants.TAG_LINK.equalsIgnoreCase(tagname)) {
-//			return true;
-//		} else {
-//
-//			return false;
-//		}
-//	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#isWidget()
-	 */
-	public boolean isWidget() {
-		return true;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DumDescriptionTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DumDescriptionTagConverter.java
deleted file mode 100644
index 2221a52..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DumDescriptionTagConverter.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DumDescriptionTagConverter extends AbstractTagConverter {
-	/**
-	 * @param host
-	 */
-	public DumDescriptionTagConverter(Element host) {
-		super(host);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-	 */
-	protected Element doConvertRefresh() {
-		Element result = createElement(getHostElement().getTagName());
-		ConverterUtil.copyAllAttributes(getHostElement(), result, null);
-		copyChildren(getHostElement(), result);
-
-		if (!this.isPreviewMode()
-				&& ConverterUtil.isEmptyContainer(getHostElement())) {
-			result.appendChild(ConverterUtil.createDescriptionElement(
-					getDestDocument(), null));
-		}
-
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#isWidget()
-	 */
-	public boolean isWidget() {
-		return false;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DumTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DumTagConverter.java
deleted file mode 100644
index 455bc85..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DumTagConverter.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DumTagConverter extends AbstractTagConverter {
-	/**
-	 * @param host 
-	 * @param needBorder 
-	 */
-	public DumTagConverter(Element host, boolean needBorder) {
-		this(host);
-		this.setNeedBorderDecorator(needBorder);
-	}
-
-	/**
-	 * @param host
-	 */
-	public DumTagConverter(Element host) {
-		super(host);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-	 */
-	protected Element doConvertRefresh() {
-		Element result = createElement(getHostElement().getTagName());
-		ConverterUtil.copyAllAttributes(getHostElement(), result, null);
-		if (!internalIsWidget(result)) {
-			copyChildren(getHostElement(), result);
-		} else {
-			dumCopyChildren(getHostElement(), result);
-		}
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		if (isWidget()) {
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * @param result
-	 * @return
-	 */
-	private boolean internalIsWidget(Element result) {
-		String tagname = result.getTagName();
-		if (IHTMLConstants.TAG_INPUT.equalsIgnoreCase(tagname)
-				|| IHTMLConstants.TAG_SELECT.equalsIgnoreCase(tagname)
-				|| IHTMLConstants.TAG_TEXTAREA.equalsIgnoreCase(tagname)
-				|| IHTMLConstants.TAG_IMG.equalsIgnoreCase(tagname)
-				|| IHTMLConstants.TAG_OBJECT.equalsIgnoreCase(tagname)
-				|| IHTMLConstants.TAG_HEAD.equalsIgnoreCase(tagname)
-				|| IHTMLConstants.TAG_SCRIPT.equalsIgnoreCase(tagname)
-				|| IHTMLConstants.TAG_LINK.equalsIgnoreCase(tagname)
-				|| IHTMLConstants.TAG_BR.equalsIgnoreCase(tagname)
-				|| IHTMLConstants.TAG_STYLE.equalsIgnoreCase(tagname)
-				|| IHTMLConstants.TAG_HR.equalsIgnoreCase(tagname)) {
-			return true;
-		}
-        return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#isWidget()
-	 */
-	public boolean isWidget() {
-		return internalIsWidget(getResultElement());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/HTMLStringTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/HTMLStringTagConverter.java
deleted file mode 100644
index 1b03c05..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/HTMLStringTagConverter.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.ResourceUtils;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Element;
-
-/**
- * For some tag, could generate some XML code.
- * 
- * @author mengbo
- * @version 1.5
- */
-public abstract class HTMLStringTagConverter extends AbstractTagConverter {
-
-	static Logger _log = PDPlugin.getLogger(HTMLStringTagConverter.class);
-
-	/**
-	 * @param host
-	 */
-	public HTMLStringTagConverter(Element host) {
-		super(host);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-	 */
-	protected Element doConvertRefresh() {
-		// following are XML implementation. Assume the string is welformed HTML
-		// try
-		// {
-		// String html = getGeneratedHTML();
-		// DocumentBuilder builder =
-		// DocumentBuilderFactory.newInstance().newDocumentBuilder();
-		// Element result = builder.parse(new InputSource(new
-		// StringReader(html))).getDocumentElement();
-		// return (Element)DOMUtil.cloneNodeDeep(this.getDestDocument(),
-		// result);
-		// }
-		// catch(Exception ex)
-		// {
-		// Element temp = createElement("div");
-		// temp.appendChild(createText("ERROR: "+ex.getMessage()));
-		// return temp;
-		// }
-		InputStream stream = null;
-		try {
-			String id = "" + System.currentTimeMillis() + ".html";
-			IModelManager manager = StructuredModelManager.getModelManager();
-			stream = new ByteArrayInputStream(getGeneratedHTML().getBytes());
-			IDOMModel model = (IDOMModel) manager.getModelForRead(id, stream,
-					null);
-			Element root = model.getDocument().getDocumentElement();
-			Element resultEle = (Element) DOMUtil.cloneNodeDeepIgnoreError(
-					getDestDocument(), root);
-			model.releaseFromRead();
-			return resultEle;
-		} catch (Exception ex) {
-			_log.error("Log.Error.HTMLStringTagConverter.Error", ex);
-			Element temp = createElement("div");
-			temp.appendChild(createText("Error loading: " + ex.getMessage()));
-			return temp;
-		} finally {
-			ResourceUtils.ensureClosed(stream);
-		}
-	}
-
-	/**
-	 * @return the generated HTML string
-	 * @throws Exception
-	 */
-	public abstract String getGeneratedHTML() throws Exception;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#isWidget()
-	 */
-	public boolean isWidget() {
-		return true;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/HiddenTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/HiddenTagConverter.java
deleted file mode 100644
index 51a6c1d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/HiddenTagConverter.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * This is for those tags that don't convert to HTML. So they will not display
- * anything in preview, and will display a small icon in designer.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class HiddenTagConverter implements ITagConverter {
-	private Element _hostElement;
-
-    private ILabelProvider         _labelProvider;
-
-	private int _mode;
-
-	/**
-	 * @param host 
-	 * @param labelProvider 
-	 * 
-	 */
-	public HiddenTagConverter(Element host, ILabelProvider labelProvider) {
-		_hostElement = host;
-		//_image = image;
-        _labelProvider = labelProvider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#setDestDocument(org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument)
-	 */
-	public void setDestDocument(IDOMDocument document) {
-        // do nothing?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#convertRefresh(java.lang.Object)
-	 */
-	public void convertRefresh(Object context) {
-		// do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#getHostElement()
-	 */
-	public Element getHostElement() {
-		return _hostElement;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#isVisualByHTML()
-	 */
-	public boolean isVisualByHTML() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#getVisualImage()
-	 */
-	public Image getVisualImage() {
-        // defer the creation of the image until it is needed
-		return _labelProvider.getImage(this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#getResultElement()
-	 */
-	public Element getResultElement() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#getChildModeList()
-	 */
-	public List getChildModeList() {
-		return Collections.EMPTY_LIST;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#getChildVisualPosition(org.w3c.dom.Node)
-	 */
-	public ConvertPosition getChildVisualPosition(Node childModel) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#isWidget()
-	 */
-	public boolean isWidget() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.visualtag.ITagConverter#dispose()
-	 */
-	public void dispose() {
-        // do nothing
-        // TODO: dispose of image or Element here?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#setMode(int)
-	 */
-	public void setMode(int mode) {
-		this._mode = mode;
-	}
-
-	/**
-	 * @return the mode
-	 */
-	public int getMode() {
-		return _mode;
-	}
-
-    public List getNonVisualChildren() {
-        return Collections.EMPTY_LIST;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/HiddenTagConverter2.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/HiddenTagConverter2.java
deleted file mode 100644
index f51af22..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/HiddenTagConverter2.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.eclipse.swt.graphics.Image;
-import org.w3c.dom.Element;
-
-/**
- * HiddenTagConverter2 is similiar to HiddenTagConverter, with the following
- * difference:
- * 
- * <ol>
- * <li>HiddenTagConverter2 will copy the DOM sub tree to the destination
- * document.</li>
- * </ol>
- * 
- * TODO: this the wrong way to do this.  This should sub-class HiddenTagConverter
- * 
- * @author mengbo
- * @version 1.5
- */
-public class HiddenTagConverter2 extends AbstractTagConverter {
-
-	private Image _image;
-
-	/**
-	 * @param host
-	 * @param image
-	 */
-	public HiddenTagConverter2(Element host, Image image) {
-		super(host);
-		this._image = image;
-	}
-
-	protected Element doConvertRefresh() {
-		return (Element) DOMUtil.cloneNodeDeepIgnoreError(getDestDocument(),
-				getHostElement());
-	}
-
-	public boolean isVisualByHTML() {
-		return false;
-	}
-
-	public Image getVisualImage() {
-		return _image;
-	}
-
-	public boolean isMultiLevel() {
-		return true;
-	}
-
-	public boolean isWidget() {
-		return true;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/IConverterFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/IConverterFactory.java
deleted file mode 100644
index f8aebf2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/IConverterFactory.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public interface IConverterFactory {
-	/**
-	 * indicates designer mode 
-	 */
-	public static final int MODE_DESIGNER = 0;
-
-	/**
-	 * indicates preview mode
-	 */
-	public static final int MODE_PREVIEW = 1;
-
-	/**
-	 * 
-	 * @param element
-	 * @param mode 
-	 * @return null if this factory don't support this element
-	 */
-	public ITagConverter createConverter(Element element, int mode);
-
-	/**
-	 * get the URI namespace that this factory support. "null" means this
-	 * factory can be used as default factory.
-	 * 
-	 * @return null if this factory don't have a specific URI to support.
-	 */
-	public String getSupportedURI();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/IDOMFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/IDOMFactory.java
deleted file mode 100644
index 3e3d374..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/IDOMFactory.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import org.w3c.dom.Element;
-import org.w3c.dom.Text;
-
-/**
- * Factory interface. AbstractTagConverter will implement it.
- * 
- * @author mengbo
- * @version 1.5
- */
-public interface IDOMFactory {
-	/**
-	 * create element
-	 * 
-	 * @param tag
-	 * @return a new element using tag as its name
-	 */
-	public Element createElement(String tag);
-
-	/**
-	 * create text node
-	 * 
-	 * @param content
-	 * @return a new text node using content as its body
-	 */
-	public Text createText(String content);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ITagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ITagConverter.java
deleted file mode 100644
index b5aea53..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ITagConverter.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import java.util.List;
-
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * ITagConverter is used to convert a custom tag to a HTML tag. Each
- * ITagConverter instance will be dedicated to a single custom tag element.
- * 
- * @author mengbo
- * @version 1.5
- */
-public interface ITagConverter {
-	/**
-	 * Set the target document where the converted node should belong to.
-	 * 
-	 * @param document
-	 */
-	public void setDestDocument(IDOMDocument document);
-
-	/**
-	 * refresh the internal state of this ITagConverter. This method normally is
-	 * called when the host element change.
-	 * 
-	 * @param context
-	 */
-	public void convertRefresh(Object context);
-
-	/**
-	 * @return The host element being converted.
-	 */
-	public Element getHostElement();
-
-	/**
-	 * for some tags, they don't convert to HTML. In that case, this method
-	 * should return false for them. And if this method return false, then
-	 * should return an image in <code>getVisualImage()</code> for displaying
-	 * in the designer.
-	 * 
-	 * @return true if the tag represents something that will be rendered visually at runtime
-	 */
-	public boolean isVisualByHTML();
-
-	/**
-	 * if isVisualByHTML() return false, then this method should return an image
-	 * to be displayed in designer.
-	 * 
-	 * Normally this image will be a shared image for those hidden elements. It
-	 * is this class's responsibility to dispose the image if the image is not a
-	 * shared one.
-	 * 
-	 * @return the placeholder image for non-visual tags
-	 */
-	public Image getVisualImage();
-
-	/**
-	 * @return the result element after conversion
-	 */
-	public Element getResultElement();
-
-	/**
-	 * @return the list of children that should be continuely converted.
-	 */
-	public List getChildModeList();
-    
-    /**
-     * @return a list of Element tags that map to non-visual children
-     * Type should be always be Element.
-     */
-    public List getNonVisualChildren();
-
-	/**
-	 * For child nodes that need further convert, return their position in the
-	 * converted DOM tree.
-	 * 
-	 * @param childModel
-	 * @return the position of child nodes
-	 */
-	public ConvertPosition getChildVisualPosition(Node childModel);
-
-	/**
-	 * When the convert result in multi-level element. If this method return
-	 * false, then the caller should not use child nodes of
-	 * <code>getHostElement()</code>
-	 * 
-	 * @return true if the host element has convertable children
-	 */
-	public boolean isMultiLevel();
-
-	/**
-	 * 
-	 * @return true if the host element is a widget
-	 */
-	public boolean isWidget();
-
-	/**
-	 * API contract needed here
-	 * 
-	 */
-	public void dispose();
-
-	/**
-	 * @param mode
-	 */
-	public void setMode(int mode);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/JSFConverterUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/JSFConverterUtil.java
deleted file mode 100644
index 5ac56f8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/JSFConverterUtil.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Set;
-
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSFConverterUtil {
-	private static List NamedBooleanList = Arrays.asList(new String[] {
-			"disabled", "readonly", "ismap" });
-
-	/**
-	 * 
-	 * @param source
-	 * @param dest
-	 * @param ignore
-	 */
-	public static void copyAllAttributes(Element source, Element dest,
-			Set ignore) {
-		NamedNodeMap attrs = source.getAttributes();
-		for (int i = 0, size = attrs.getLength(); i < size; i++) {
-			Attr attr = (Attr) attrs.item(i);
-			if (ignore == null || !ignore.contains(attr.getName())) {
-				if (NamedBooleanList.contains(attr.getName())
-						&& "false".equalsIgnoreCase(attr.getValue())) {
-					continue;
-				}
-				dest.setAttribute(attr.getName(), attr.getValue());
-			}
-		}
-	}
-
-	/**
-	 * copy a single attribute (if exist)
-	 * 
-	 * @param source
-	 * @param srcattr
-	 * @param dest
-	 * @param destattr
-	 */
-	public static void copyAttribute(Element source, String srcattr,
-			Element dest, String destattr) {
-		Attr attr = source.getAttributeNode(srcattr);
-		if (attr != null) {
-			dest.setAttribute(destattr, attr.getValue());
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/PreferenceReader.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/PreferenceReader.java
deleted file mode 100644
index ea9dc4e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/PreferenceReader.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PreferenceReader {
-	/**
-	 * expression type
-	 */
-	public final static int FULL_EXPRESSION_TYPE = 0;
-
-    /**
-     * expression type
-     */
-	public final static int LAST_EXPRESSION_TYPE = 1;
-
-    /**
-     * expression type
-     */
-	public final static int REAL_VALUE_TYPE = 2;
-
-	/**
-	 * @return the map value type
-	 */
-	public static int getMapValueType() {
-		return LAST_EXPRESSION_TYPE;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/TagConverterToDumBlock.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/TagConverterToDumBlock.java
deleted file mode 100644
index 619875d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/TagConverterToDumBlock.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TagConverterToDumBlock extends AbstractTagConverter {
-
-	/**
-	 * @param host
-	 */
-	public TagConverterToDumBlock(Element host) {
-		super(host);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-	 */
-	protected Element doConvertRefresh() {
-		Element result = createElement(IHTMLConstants.TAG_DIV);
-		copyChildren(getHostElement(), result);
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#isWidget()
-	 */
-	public boolean isWidget() {
-		return false;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/TagConverterToInlineBlock.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/TagConverterToInlineBlock.java
deleted file mode 100644
index a111932..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/TagConverterToInlineBlock.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import org.w3c.dom.Element;
-
-/**
- * This converter can be used simply convert the tag to inline div, and copy all
- * the children
- * 
- * NOTE: It behave almost same as "span". In fact, we may remove this later, if
- * our css engine support "minWidth"/"minHeight" for inline element.
- * 
- * NOTE: it will not copy attributes!
- * 
- * @author mengbo
- * @version 1.5
- * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#getMinHeight()
- * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#getMinWidth()
- */
-public class TagConverterToInlineBlock extends AbstractTagConverter {
-	private int displayMode;
-
-	/**
-	 * @param host
-	 * @param mode
-	 */
-	public TagConverterToInlineBlock(Element host, int mode) {
-		super(host);
-		this.displayMode = mode;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-	 */
-	protected Element doConvertRefresh() {
-		Element result = null;
-		if (displayMode == IConverterFactory.MODE_PREVIEW) {
-			result = createElement("span");
-			copyChildren(getHostElement(), result);
-		} else {
-			result = createElement("div");
-			result
-					.setAttribute(
-							"style",
-							"display:inline-block; border-width:0; margin:0; min-width:1.2em;min-height:1.2em;");
-			copyChildren(getHostElement(), result);
-		}
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-	 */
-	public boolean isWidget() {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/TagConverterToSpan.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/TagConverterToSpan.java
deleted file mode 100644
index 5dfa800..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/TagConverterToSpan.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter;
-
-import org.w3c.dom.Element;
-
-/**
- * This converter can be used simply convert the tag to span, and copy all the
- * children
- * 
- * NOTE: it will not copy attributes!
- * 
- * @author mengbo
- * @version 1.5
- */
-public class TagConverterToSpan extends AbstractTagConverter {
-
-	/**
-	 * @param host
-	 */
-	public TagConverterToSpan(Element host) {
-		super(host);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-	 */
-	protected Element doConvertRefresh() {
-		// Register a named facet on the UIComponent associated with the
-		// closest parent UIComponent custom action.
-		// we'll render facet as a inline flow figure. so treat it as simple
-		// <span> here.
-		Element result = createElement("span");
-		copyChildren(getHostElement(), result);
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-	 */
-	public boolean isWidget() {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/html/ATagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/html/ATagConverter.java
deleted file mode 100644
index a86dd89..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/html/ATagConverter.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter.html;
-
-import org.eclipse.jst.pagedesigner.converter.ConverterUtil;
-import org.eclipse.jst.pagedesigner.converter.DumTagConverter;
-import org.w3c.dom.Element;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ATagConverter extends DumTagConverter {
-	private boolean _emptyContainer = false;
-
-	/**
-	 * @param host
-	 */
-	public ATagConverter(Element host) {
-		super(host);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-	 */
-	protected Element doConvertRefresh() {
-		_emptyContainer = ConverterUtil.isEmptyContainer(getHostElement());
-		if (_emptyContainer) {
-			Element resultEle = createElement("a");
-			ConverterUtil.copyAllAttributes(getHostElement(), resultEle, null);
-			Text fakedNode = createText("link");
-			resultEle.appendChild(fakedNode);
-			return resultEle;
-		}
-        return super.doConvertRefresh();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#needBorderDecorator()
-	 */
-	public boolean needBorderDecorator() {
-		return _emptyContainer;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return _emptyContainer;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#isWidget()
-	 */
-	public boolean isWidget() {
-		return _emptyContainer;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/html/HTMLConverterFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/html/HTMLConverterFactory.java
deleted file mode 100644
index de2a907..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/html/HTMLConverterFactory.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter.html;
-
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.utils.JSFSharedImages;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.DumDescriptionTagConverter;
-import org.eclipse.jst.pagedesigner.converter.DumTagConverter;
-import org.eclipse.jst.pagedesigner.converter.HiddenTagConverter2;
-import org.eclipse.jst.pagedesigner.converter.IConverterFactory;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.eclipse.jst.pagedesigner.utils.HTMLUtil;
-import org.eclipse.swt.graphics.Image;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class HTMLConverterFactory implements IConverterFactory {
-
-	/**
-	 * the constructor
-	 */
-	public HTMLConverterFactory() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.IConverterFactory#createConverter(org.w3c.dom.Element)
-	 */
-	public ITagConverter createConverter(Element element, int mode) {
-		String tagName = element.getLocalName();
-
-		if (mode == MODE_PREVIEW) {
-			return new DumTagConverter(element);
-		}
-		if (!HTMLUtil.isVisualHtmlElement(tagName)) {
-			return new HiddenTagConverter2(element, getUnknownImage());
-		}
-
-		AbstractTagConverter c;
-		if (IHTMLConstants.TAG_TABLE.equalsIgnoreCase(tagName)) {
-			c = new TableTagConverter(element);
-		} else if (IHTMLConstants.TAG_A.equalsIgnoreCase(tagName)) {
-			c = new ATagConverter(element);
-		} else if (IHTMLConstants.TAG_FORM.equalsIgnoreCase(tagName)) {
-			// for those HTML tag that we want to build a border decorator,
-			// should
-			// go there.
-			c = new DumTagConverter(element, true);
-		} else if (IHTMLConstants.TAG_HTML.equalsIgnoreCase(tagName)
-				|| IHTMLConstants.TAG_BODY.equalsIgnoreCase(tagName)) {
-			c = new DumDescriptionTagConverter(element);
-			c.setNeedBorderDecorator(true);
-		} else {
-			c = new DumTagConverter(element);
-		}
-		c.setMode(mode);
-		return c;
-	}
-
-	private static Image getUnknownImage() {
-		return JSFUICommonPlugin.getDefault().getImage(
-				JSFSharedImages.DEFAULT_PALETTE_TAG_IMG);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.IConverterFactory#getSupportedURI()
-	 */
-	public String getSupportedURI() {
-		return ITLDConstants.URI_HTML;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/html/TableTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/html/TableTagConverter.java
deleted file mode 100644
index eaf1928..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/html/TableTagConverter.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter.html;
-
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.converter.ConverterUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class TableTagConverter extends AbstractTagConverter {
-	/**
-	 * @param host
-	 */
-	public TableTagConverter(Element host) {
-		super(host);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-	 */
-	protected Element doConvertRefresh() {
-		Element result = createElement(getHostElement().getTagName());
-		ConverterUtil.copyAllAttributes(getHostElement(), result, null);
-		copyChildren(getHostElement(), result);
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#isWidget()
-	 */
-	public boolean isWidget() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#needTableDecorator()
-	 */
-	public boolean needTableDecorator() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#needBorderDecorator()
-	 */
-	public boolean needBorderDecorator() {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/jsp/IncludeTagConverterPreview.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/jsp/IncludeTagConverterPreview.java
deleted file mode 100644
index 73aa825..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/jsp/IncludeTagConverterPreview.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter.jsp;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.converter.AbstractTagConverter;
-import org.eclipse.jst.pagedesigner.jsp.core.internal.pagevar.DocumentPageVariableAdapter;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter.PageVariableAdapterFactory;
-import org.eclipse.jst.pagedesigner.preview.PageExpressionContext;
-import org.eclipse.jst.pagedesigner.preview.PreviewConvertContext;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.util.URIResolver;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * This is the tag converter for preview.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class IncludeTagConverterPreview extends AbstractTagConverter {
-	private static Logger _log = PDPlugin
-			.getLogger(IncludeTagConverterPreview.class);
-
-	private String _fileAttrName;
-
-	/**
-	 * @param host
-	 * @param fileAttrname 
-	 */
-	public IncludeTagConverterPreview(Element host, String fileAttrname) {
-		super(host);
-		this._fileAttrName = fileAttrname;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.AbstractTagConverter#doConvertRefresh()
-	 */
-	protected Element doConvertRefresh() {
-		String fileName = getResolvedURL(getHostElement(), this._fileAttrName);
-		if (fileName == null || fileName.length() == 0) {
-			return null;
-		}
-        IPath includedPath = new Path(fileName);
-        includedPath.makeAbsolute();
-
-        IFile file = getFile(includedPath);
-        if (file == null) {
-        	return null;
-        }
-        return previewFile(file);
-	}
-
-	/**
-	 * @param includedPath
-	 * @return the IFile corresponding to the IPath
-	 */
-	public IFile getFile(IPath includedPath) {
-		IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
-		IProject[] projects = workspaceRoot.getProjects();
-
-		for (int i = 0, length = projects.length; i < length; i++) {
-			IPath path = projects[i].getLocation();
-			path = path.makeAbsolute();
-			if (path != null && path.isPrefixOf(includedPath)) {
-				// -1 so we still have the project path
-				includedPath = includedPath.removeFirstSegments(path
-						.segmentCount() - 1);
-				return ResourcesPlugin.getWorkspace().getRoot().getFile(
-						includedPath);
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param file
-	 * @return the Element
-	 */
-	public Element previewFile(IFile file) {
-		IDOMModel xmlModel = null;
-		DocumentPageVariableAdapter provider = null;
-		boolean pushedPageVarProvider = false;
-		try {
-
-			xmlModel = (IDOMModel) StructuredModelManager.getModelManager().getModelForRead(
-					file);
-			if (xmlModel != null) {
-				IDOMDocument doc = xmlModel.getDocument();
-
-				// XXX: need to also register page variable adapters. In the
-				// future, this should go to some
-				// SSE system registry mechanism.
-				xmlModel.getFactoryRegistry().addFactory(
-						new PageVariableAdapterFactory());
-				provider = new DocumentPageVariableAdapter(doc);
-				doc.addAdapter(provider);
-
-				provider.refresh();
-				PageExpressionContext.getCurrent()
-						.pushPageVarProvider(provider);
-
-				Node child = xmlModel.getDocument().getFirstChild();
-				PreviewConvertContext context = new PreviewConvertContext(this
-						.getDestDocument());
-				List results = new ArrayList();
-				while (child != null) {
-					Node node = context.previewConvert(child);
-					if (node != null) {
-						results.add(node);
-					}
-					child = child.getNextSibling();
-				}
-
-				if (results.size() == 0) {
-					return null;
-				} else if (results.size() == 1
-						&& results.get(0) instanceof Element) {
-					return (Element) results.get(0);
-				} else {
-					Element ret = createElement(IHTMLConstants.TAG_SPAN);
-					for (int i = 0, n = results.size(); i < n; i++) {
-						ret.appendChild((Node) results.get(i));
-					}
-					return ret;
-				}
-			}
-		} catch (CoreException e) {
-			_log.error("PreviewUtil.previewFile.CoreException", e);
-		} catch (IOException e) {
-			_log.error("PreviewUtil.previewFile.IOException", e);
-		} catch (Exception ex) {
-			_log.error("PreviewUtil.previewFile.CoreException", ex);
-		} finally {
-			if (pushedPageVarProvider) {
-				PageExpressionContext.getCurrent().popPageVarProvider(provider);
-			}
-			if (xmlModel != null) {
-				xmlModel.releaseFromRead();
-			}
-		}
-		return null;
-	}
-
-	static String getResolvedURL(Element element, String attrName) {
-		URIResolver resolver = null;
-		if (element instanceof IDOMNode) {
-            // TODO: the new URI resolver is not available on the IStructuredModel
-			resolver = ((IDOMNode) element).getModel().getResolver();
-		}
-		if (null == resolver) {
-			return null;
-		}
-		String src = element.getAttribute(attrName);
-		if (src != null && src.length() > 0) {
-			return resolver.getLocationByURI(src);
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#isWidget()
-	 */
-	public boolean isWidget() {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/jsp/JSPConverterFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/jsp/JSPConverterFactory.java
deleted file mode 100644
index 2175d91..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/jsp/JSPConverterFactory.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.converter.jsp;
-
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory2;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.converter.HiddenTagConverter;
-import org.eclipse.jst.pagedesigner.converter.IConverterFactory;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.eclipse.jst.pagedesigner.converter.TagConverterToDumBlock;
-import org.eclipse.jst.pagedesigner.editors.palette.TagImageManager;
-import org.eclipse.jst.pagedesigner.jsp.core.IJSPCoreConstants;
-import org.eclipse.swt.graphics.Image;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSPConverterFactory implements IConverterFactory {
-    private final ILabelProvider  _labelProvider;
-    
-	/**
-	 * 
-	 */
-	public JSPConverterFactory() {
-        _labelProvider = new MyLabelProvider();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.IConverterFactory#createConverter(org.w3c.dom.Element)
-	 */
-	public ITagConverter createConverter(Element element, int mode) {
-		String tagName = element.getLocalName();
-
-		if (mode == IConverterFactory.MODE_PREVIEW) {
-			// we want to generate the included page in preview, so
-			// handle differently
-			if (IJSPCoreConstants.TAG_INCLUDE.equalsIgnoreCase(tagName)) {
-				IncludeTagConverterPreview c = new IncludeTagConverterPreview(
-						element, "page");
-				c.setMode(mode);
-				return c;
-			} else if (IJSPCoreConstants.TAG_DIRECTIVE_INCLUDE
-					.equalsIgnoreCase(tagName)) {
-				IncludeTagConverterPreview c = new IncludeTagConverterPreview(
-						element, "file");
-				c.setMode(mode);
-				return c;
-			} else if (IJSPCoreConstants.TAG_ROOT.equalsIgnoreCase(tagName)) {
-				TagConverterToDumBlock c = new TagConverterToDumBlock(element);
-				c.setNeedBorderDecorator(true);
-				c.setMode(mode);
-				return c;
-			} else {
-				return new HiddenTagConverter(element, _labelProvider);
-			}
-		}
-        if (IJSPCoreConstants.TAG_ROOT.equalsIgnoreCase(tagName)) {
-        	TagConverterToDumBlock c = new TagConverterToDumBlock(element);
-        	c.setNeedBorderDecorator(true);
-        	c.setMode(mode);
-        	return c;
-        }
-        return new HiddenTagConverter(element, _labelProvider);
-	}
-    
-    private static class MyLabelProvider extends org.eclipse.jface.viewers.LabelProvider
-    {
-
-        public Image getImage(Object element) 
-        {
-            if (element instanceof ITagConverter)
-            {
-                final Element hostElement = ((ITagConverter)element).getHostElement();
-                IStructuredDocumentContext context = IStructuredDocumentContextFactory2.INSTANCE.getContext(hostElement);
-                if (context != null){                	
-                	IWorkspaceContextResolver wsResolver  = IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(context);
-                	if (wsResolver != null){
-                		return TagImageManager.getInstance().getSmallIconImage(wsResolver.getProject(),"JSP11", ITLDConstants.URI_JSP + ":"+hostElement.getLocalName());
-                	}
-                }
-            }
-            
-            return null;
-        }
-    }
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.converter.IConverterFactory#getSupportedURI()
-	 */
-	public String getSupportedURI() {
-		return ITLDConstants.URI_JSP;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/package-info.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/package-info.java
deleted file mode 100644
index d74c9f9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/package-info.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * Tag conversion framework. 
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.pagedesigner.converter;
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/CSSTempUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/CSSTempUtil.java
deleted file mode 100644
index 9303b67..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/CSSTempUtil.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.css2;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.wst.css.core.internal.provisional.adapters.IStyleSheetAdapter;
-import org.eclipse.wst.css.core.internal.provisional.adapters.IStyleSheetListAdapter;
-import org.eclipse.wst.html.core.internal.provisional.HTML40Namespace;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.stylesheets.StyleSheet;
-import org.w3c.dom.stylesheets.StyleSheetList;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public final class CSSTempUtil {
-	/**
-	 * the default implementation of (IStyleSheetListAdapter)
-	 * docnotifier.getAdapterFor(IStyleSheetListAdapter.class) will only get
-	 * those style tags under certain tags like "html", "head", etc.
-	 * 
-	 * But datawindow is generating style tag and is not putting them into
-	 * "head". So we can't handle them using the default SSE mechanism.
-	 * 
-	 * We have another problem: currently the converted element is also using
-	 * the original document, not generating another document, and these
-	 * elements is not really adding into the document, so they can't be reached
-	 * from the document.
-	 * 
-	 * @param element
-	 * @return the list
-	 * see org.eclipse.wst.html.core.htmlcss.HTMLDocumentAdapter#addStyleSheet(org.w3c.dom.Element)
-	 */
-	public static List getStyleSheets(Element element) {
-		List styleSheets = new ArrayList();
-		INodeNotifier docnotifier = (INodeNotifier) element.getOwnerDocument();
-		IStyleSheetListAdapter adapter = (IStyleSheetListAdapter) docnotifier
-				.getAdapterFor(IStyleSheetListAdapter.class);
-
-		StyleSheetList ssl = (adapter == null ? null : adapter.getStyleSheets());
-
-		if (ssl != null) {
-			for (int i = 0, numStyles = ssl.getLength(); i < numStyles; i++) {
-				// loop for styles (<style> and <link>)
-				org.w3c.dom.stylesheets.StyleSheet ss = ssl.item(i);
-				styleSheets.add(ss);
-			}
-		}
-
-		// now is our work-around part for support datawindow.
-		Node parent = element.getParentNode();
-		Element rootEle = element;
-		while (parent != null && parent instanceof Element) {
-			rootEle = (Element) parent;
-			parent = parent.getParentNode();
-		}
-		addStyleSheet(rootEle, styleSheets);
-		return styleSheets;
-	}
-
-	/**
-	 */
-	private static void addStyleSheet(Element node, List result) {
-		IDOMElement element = (IDOMElement) node;
-		String tagName = element.getTagName();
-		if (tagName == null) {
-			return;
-		}
-		boolean isContainer = false;
-
-		if (element.isCommentTag()) {
-			Node parent = element.getParentNode();
-			if (parent == element.getOwnerDocument()) {
-				// This condition is too severe, actually do not work for JSF
-				// template.
-				// But above (! globalTag() && isContainer()) cover JSF template
-				// + tpl template
-				isContainer = true;
-			} else if (parent.getNodeType() == Node.ELEMENT_NODE) {
-				tagName = ((Element) parent).getTagName();
-				if (tagName != null
-						&& tagName
-								.equalsIgnoreCase(HTML40Namespace.ElementName.HEAD)) {
-					isContainer = true;
-				}
-			}
-		} else {
-			INodeNotifier notifier = element;
-
-			// (lium) Increase performance: since this method is called tooooo
-			// many times,
-			// and getAdapterFor() is slow, so add a check on the tagName to
-			// filter
-			// those stylesheet stuff first.
-			if (IHTMLConstants.TAG_LINK.equalsIgnoreCase(tagName)
-					|| IHTMLConstants.TAG_STYLE.equalsIgnoreCase(tagName)) {
-				INodeAdapter adapter = notifier
-						.getAdapterFor(IStyleSheetAdapter.class);
-				if (adapter instanceof IStyleSheetAdapter) {
-                    // XXX: see bug 171740.  This is a (hopefully) temporary
-                    // workaround that avoids having the call to getSheet throw an NPE
-                    IStyleSheetAdapter sheetAdapter = (IStyleSheetAdapter) adapter;
-                    if (sheetAdapter.getElement() != null
-                            && "text/css".equals(sheetAdapter.getElement().getAttribute(HTML40Namespace.ATTR_NAME_TYPE)))
-
-                    {
-    					StyleSheet sheet = ((IStyleSheetAdapter) adapter)
-    							.getSheet();
-                        
-                        if (sheet != null)
-                        {
-                            result.add(sheet);
-                        }
-                    }
-				}
-			}
-
-			isContainer = true;
-		}
-		if (isContainer) {
-			for (Node child = element.getFirstChild(); child != null; child = child
-					.getNextSibling()) {
-				if (child.getNodeType() != Node.ELEMENT_NODE)
-					continue;
-				addStyleSheet((Element) child, result);
-			}
-		}
-	}
-	
-	private CSSTempUtil()
-	{
-	    //  util class, no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/CSSUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/CSSUtil.java
deleted file mode 100644
index fdda3ce..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/CSSUtil.java
+++ /dev/null
@@ -1,252 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.ResourceUtils;
-import org.eclipse.jst.pagedesigner.IJMTConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.css2.font.CSSFont;
-import org.eclipse.jst.pagedesigner.css2.style.DefaultStyle;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.wst.css.core.internal.provisional.adapters.IStyleSheetListAdapter;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSModel;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSNode;
-import org.eclipse.wst.css.core.internal.util.CSSClassTraverser;
-import org.eclipse.wst.html.core.internal.htmlcss.CSSQueryTraverser;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.css.CSSStyleDeclaration;
-import org.w3c.dom.stylesheets.StyleSheet;
-import org.w3c.dom.stylesheets.StyleSheetList;
-
-/**
- * @author mengbo
- */
-public class CSSUtil {
-	private static StyleSheet _userAgentDefault;
-
-	/**
-	 * @param doc
-	 * @return the css classes
-	 */
-	public static String[] getCSSClasses(Document doc) {
-		Collection c = Collections.EMPTY_SET;
-		if (doc instanceof INodeNotifier) {
-			IStyleSheetListAdapter adapter = (IStyleSheetListAdapter) ((INodeNotifier) doc)
-					.getAdapterFor(IStyleSheetListAdapter.class);
-			StyleSheetList ssl = (adapter == null ? null : adapter
-					.getStyleSheets());
-
-			CSSClassTraverser traverser = new CSSClassTraverser();
-			if (ssl != null) {
-				for (int i = 0, numStyles = ssl.getLength(); i < numStyles; i++) {
-					// loop for styles (<style> and <link>)
-					org.w3c.dom.stylesheets.StyleSheet ss = ssl.item(i);
-
-					try {
-						traverser.apply((ICSSNode) ss);
-					} catch (ClassCastException ex) {
-						Logger log = PDPlugin
-								.getLogger(CSSStyleDeclaration.class);
-						log.error("Error.CSSUtil.0", ex); //$NON-NLS-1$
-						// FIXME: should this continue to be processed?
-					}
-				}
-				c = traverser.getClassNames();
-			}
-		}
-		String[] result = new String[c.size()];
-		c.toArray(result);
-		return result;
-	}
-
-	/**
-	 * Get the css style of a node.
-	 * 
-	 * @param node
-	 * @return the style
-	 */
-	public static ICSSStyle getCSSStyle(Element node) {
-		ICSSStyle style = null;
-		if (node instanceof IDOMElement) {
-			style = (ICSSStyle) ((IDOMElement) node)
-					.getAdapterFor(ICSSStyle.class);
-		}
-		if (style == null) {
-			return DefaultStyle.getInstance();
-		}
-        return style;
-	}
-
-	/**
-	 * Resolve the css style string from css style elements.
-	 * 
-	 * @param style
-	 * @return the style string
-	 */
-	public static String resolveCSSStyle(ICSSStyle style) {
-		StringBuffer sb = new StringBuffer();
-		Object object1 = style.getColor();
-		if (object1 instanceof Color) {
-			sb.append("color:");
-
-			sb.append("#").append(
-					Integer.toHexString(((Color) object1).getRed()));
-			sb.append("#").append(
-					Integer.toHexString(((Color) object1).getGreen()));
-			sb.append("#").append(
-					Integer.toHexString(((Color) object1).getBlue()));
-			sb.append(";");
-		}
-		Object object2 = style.getCSSFont();
-		if (object2 instanceof CSSFont) {
-			sb.append(((CSSFont) object2).getCSSString());
-		}
-		return sb.toString();
-	}
-
-	/**
-	 * Many of this method implementation copied from HTMLDocumentAdapter,
-	 * mainly add support for user agent default style sheet.
-	 * 
-	 * @param element
-	 *            the element.
-	 * @param pseudoName
-	 *            the pseudoname of the element
-	 * @return the style declaration
-	 */
-	public static CSSStyleDeclaration getCSSDeclaration(Element element,
-			String pseudoName) {
-		// please reference comments in CSSTempUtil.
-		List styleSheets = CSSTempUtil.getStyleSheets(element);
-		// INodeNotifier docnotifier = (INodeNotifier)
-		// element.getOwnerDocument();
-		// IStyleSheetListAdapter adapter = (IStyleSheetListAdapter)
-		// docnotifier.getAdapterFor(IStyleSheetListAdapter.class);
-		//
-		// StyleSheetList ssl = (adapter == null ? null :
-		// adapter.getStyleSheets());
-
-		CSSQueryTraverser query = new CSSQueryTraverser();
-		query.setTraverseImported(true);
-		query.setTraverseImportFirst(true);
-		query.setElement(element, pseudoName);
-
-		// if (ssl != null)
-		// {
-		// for (int i = 0, numStyles = ssl.getLength(); i < numStyles; i++)
-		// {
-		// // loop for styles (<style> and <link>)
-		// org.w3c.dom.stylesheets.StyleSheet ss = ssl.item(i);
-		if (styleSheets != null) {
-			for (int i = 0, numStyles = styleSheets.size(); i < numStyles; i++) {
-				StyleSheet ss = (StyleSheet) styleSheets.get(i);
-				try {
-					query.apply((ICSSNode) ss);
-				} catch (ClassCastException ex) {
-					Logger log = PDPlugin.getLogger(CSSStyleDeclaration.class);
-					log.error("Error.CSSUtil.0", ex); //$NON-NLS-1$
-					// FIXME: should this continue to be processed?
-				}
-			}
-		}
-		CSSStyleDeclaration declare = query.getDeclaration();
-		// FIXME: when do we need to apply the user agent style sheet?
-		return declare;
-	}
-
-	/**
-	 * Many of this method implementation copied from HTMLDocumentAdapter,
-	 * mainly add support for user agent default style sheet.
-	 * 
-	 * @param element
-	 *            the element.
-	 * @param pseudoName
-	 *            the pseudoname of the element
-	 * @return the style declaration
-	 */
-	public static CSSStyleDeclaration getDefaultCSSDeclaration(Element element,
-			String pseudoName) {
-		CSSQueryTraverser query = new CSSQueryTraverser();
-		query.setTraverseImported(true);
-		query.setTraverseImportFirst(true);
-
-		query.setElement(element, pseudoName);
-
-		// FIXME: when do we need to apply the user agent style sheet?
-		try {
-			getUserAgentDefaultStyleSheet(element);
-		} catch (UnsupportedEncodingException e) {
-			Logger log = PDPlugin.getLogger(CSSStyleDeclaration.class);
-			log.error("Error.CSSUtil.1", e); //$NON-NLS-1$
-		} catch (IOException e) {
-			Logger log = PDPlugin.getLogger(CSSStyleDeclaration.class);
-			log.error("Error.CSSUtil.2", e); //$NON-NLS-1$
-		}
-		if (_userAgentDefault != null) {
-			try {
-				query.apply((ICSSNode) _userAgentDefault);
-			} catch (ClassCastException ex) {
-				Logger log = PDPlugin.getLogger(CSSStyleDeclaration.class);
-				log.error("Error.CSSUtil.3", ex); //$NON-NLS-1$
-			}
-		}
-		CSSStyleDeclaration declare = query.getDeclaration();
-		return declare;
-	}
-
-	/**
-	 * Get the user agent default style sheet.
-	 * 
-	 * @param element
-	 * @return
-	 * @throws IOException
-	 * @throws UnsupportedEncodingException
-	 */
-	// XXX: in the future, we may get user agent default style sheet based on
-	// device type.
-	private static StyleSheet getUserAgentDefaultStyleSheet(Element element)
-			throws UnsupportedEncodingException, IOException {
-		if (_userAgentDefault == null) {
-			InputStream input = null;
-			
-			try
-			{
-				input = CSSUtil.class
-					.getResourceAsStream(IJMTConstants.USERAGENT);
-				IStructuredModel model = StructuredModelManager.getModelManager()
-						.getModelForEdit(IJMTConstants.USERAGENT, input, null);
-				ICSSModel cssmodel = (ICSSModel) model;
-				_userAgentDefault = (StyleSheet) cssmodel.getDocument();
-			}
-			finally
-			{
-				ResourceUtils.ensureClosed(input);
-			}
-		}
-
-		return _userAgentDefault;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/ICSSStyle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/ICSSStyle.java
deleted file mode 100644
index 9d1524b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/ICSSStyle.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2;
-
-import java.util.Map;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.jst.pagedesigner.css2.font.ICSSFont;
-import org.eclipse.jst.pagedesigner.css2.list.ICounterValueGenerator;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-
-/**
- * The style declaration for an element can be cached.
- * 
- * @author mengbo
- */
-public interface ICSSStyle extends INodeAdapter, IAdaptable {
-
-    // the number of extra pixels to add to top, bottom, left and right padding insets
-    // in the rendering so that separation between contained components is more
-    // apparent at design time.  These extra pixels are design mode only
-    // Note: margin padding would be preferred but it doesn't seem to affect
-    // bottom padding the way border insets do.
-    // TODO:  this should be set to a preference and probably also use an
-    // algorithm to determine if the the current box style already has a large
-    // enough separation offset (perhaps a threshold instead of an additive value)
-    /**
-     * the border offset
-     */
-    public static final int ARTIFICIAL_BORDER_OFFSET = 4;
-    
-    /**
-     * 
-     */
-    public static final int INHERIT = Integer.MIN_VALUE;
-    
-	/**
-	 * the top attribute vale
-	 */
-	public static final String TOP = "top";
-
-	/**
-	 * the right attribute value
-	 */
-	public static final String RIGHT = "right";
-
-	/**
-	 * the left attribute value
-	 */
-	public static final String LEFT = "left";
-
-	/**
-	 * the bottom attribute value
-	 */
-	public static final String BOTTOM = "bottom";
-
-	/**
-	 * 
-	 */
-	public void reset();
-
-	/**
-	 * @return the font
-	 */
-	public ICSSFont getCSSFont();
-
-	/**
-	 * @param property
-	 * @return the style property
-	 */
-	public Object getStyleProperty(String property);
-
-	/**
-	 * @return the margin insets
-	 */
-	public Insets getMarginInsets();
-
-	/**
-	 * @return the border insets
-	 */
-	public Insets getBorderInsets();
-
-	/**
-	 * @return the padding insets
-	 */
-	public Insets getPaddingInsets();
-
-	/**
-	 * shortcut method to get the CSS display.
-	 * 
-	 * see http://www.w3.org/TR/REC-CSS2/visuren.html#propdef-display
-	 * @return the display string
-	 */
-	public String getDisplay();
-
-	/**
-	 * null means transparent.
-	 * 
-	 * @return the background color
-	 */
-	public Object getBackgroundColor();
-
-	/**
-	 * @return the foreground color
-	 */
-	public Object getColor();
-
-	/**
-	 * @return true if size includes border padding
-	 */
-	public boolean isSizeIncludeBorderPadding();
-
-	/**
-	 * 
-	 */
-	public void dispose();
-
-	/**
-	 * @return the parent style
-	 */
-	public ICSSStyle getParentStyle();
-
-	/**
-	 * Get counters declared on this style. the counters are either created by
-	 * counter-reset or refered by counter-increment
-	 * 
-	 * @return the counters
-	 */
-	public Map getCounters();
-
-	/**
-	 * Search a named counter declared on this style or its ancestors' styles
-	 * 
-	 * @param name
-	 * @param must
-	 * @return the generator
-	 */
-	public ICounterValueGenerator findCounter(String name, boolean must);
-
-	/**
-	 * Currently, rowspan and colspan are not CSS property. But based on the CSS
-	 * specification, it is expected in the future this two will be added as CSS
-	 * property, so we also include them into ICSSStyle
-	 * 
-	 * @return the row span
-	 */
-	public int getRowSpan();
-
-	/**
-	 * @return the column span
-	 */
-	public int getColSpan();
-
-	/**
-	 * Normally, when layout a figure and its children. We'll reset the counters
-	 * declared on this style. And if there are "counter-increment" on this
-	 * style, they'll also be processed.
-	 * 
-	 */
-	public void processCounters();
-
-	/**
-	 * Whether the corresponding figure should be draw in selected mode. This is
-	 * not a real CSS property. This is a shortcut method. implemented through
-	 * getAdapter() on IRangeSelectionProxy
-	 * 
-	 * @return true if in selection
-	 */
-	public boolean isInSelection();
-
-	/**
-	 * @param propertyName
-	 * @return the element init value
-	 */
-	public Object getHTMLelementInitValue(String propertyName);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/border/CSSBorder.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/border/CSSBorder.java
deleted file mode 100644
index b98f14f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/border/CSSBorder.java
+++ /dev/null
@@ -1,542 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.border;
-
-import java.util.Arrays;
-
-import org.eclipse.draw2d.AbstractBorder;
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.editors.pagedesigner.MessageFormater;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @author mengbo
- */
-public class CSSBorder extends AbstractBorder {
-
-	private static final String BODER_QUERY_TEMPLETE = "border-{0}-style";
-
-	private static final String COLOR_QUERY_TEMPLETE = "border-{0}-color";
-
-	private final ICSSStyle _style;
-
-	private final Rectangle _innerRect = new Rectangle();
-
-	/**
-	 * @param style
-	 */
-	public CSSBorder(ICSSStyle style) {
-		this._style = style;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Border#getInsets(org.eclipse.draw2d.IFigure)
-	 */
-	public Insets getInsets(IFigure figure) {
-		return _style.getBorderInsets();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Border#paint(org.eclipse.draw2d.IFigure,
-	 *      org.eclipse.draw2d.Graphics, org.eclipse.draw2d.geometry.Insets)
-	 */
-	public void paint(IFigure figure, Graphics graphics, Insets insets) {
-		tempRect.setBounds(getPaintRectangle(figure, insets));
-		_innerRect.setBounds(tempRect);
-		_innerRect.crop(_style.getBorderInsets());
-		paintEdge(graphics, tempRect, _innerRect, ICSSStyle.LEFT);
-		paintEdge(graphics, tempRect, _innerRect, ICSSStyle.RIGHT);
-		paintEdge(graphics, tempRect, _innerRect, ICSSStyle.TOP);
-		paintEdge(graphics, tempRect, _innerRect, ICSSStyle.BOTTOM);
-	}
-
-	/**
-	 * @param style
-	 * @return
-	 */
-	private boolean shouldDraw(String style) {
-		return style != null && !ICSSPropertyID.VAL_NONE.equals(style)
-				&& !ICSSPropertyID.VAL_HIDDEN.equals(style);
-	}
-
-	/**
-	 * Fetchs the color array used to draw the given edge under the given style
-	 * 
-	 * @param graphics
-	 * @param style
-	 * @param edge
-	 * @return
-	 */
-	private RGB[] getEdgeColors(Graphics graphics, String style, String edge) {
-		String property = MessageFormater.format(COLOR_QUERY_TEMPLETE, edge);
-		Object obj = _style.getStyleProperty(property);
-		if (obj instanceof RGB) {
-			return getCustomColors(graphics, style, edge, (RGB) obj);
-		} else if (obj instanceof Color) {
-			return getCustomColors(graphics, style, edge, ((Color) obj)
-					.getRGB());
-		} else {
-			return getDefaultColors(graphics, style, edge);
-		}
-	}
-	// TODO: needs refactoring
-	private RGB[] getDefaultColors(Graphics graphics, String style, String edge) {
-		if (ICSSPropertyID.VAL_OUTSET.equals(style)) {
-			if (ICSSStyle.TOP.equals(edge) || ICSSStyle.LEFT.equals(edge)) {
-				return new RGB[] { ColorConstants.button.getRGB(),
-						ColorConstants.buttonLightest.getRGB() };
-			}
-            return new RGB[] { ColorConstants.buttonDarkest.getRGB(),
-            		ColorConstants.buttonDarker.getRGB() };
-		} else if (ICSSPropertyID.VAL_INSET.equals(style)) {
-			if (ICSSStyle.TOP.equals(edge) || ICSSStyle.LEFT.equals(edge)) {
-				return new RGB[] { ColorConstants.buttonDarker.getRGB(),
-						ColorConstants.buttonDarkest.getRGB() };
-			}
-            return new RGB[] { ColorConstants.buttonLightest.getRGB(),
-            		ColorConstants.button.getRGB() };
-		} else if (ICSSPropertyID.VAL_TDBORDERSTYLE.equals(style)) {
-			if (ICSSStyle.TOP.equals(edge) || ICSSStyle.LEFT.equals(edge)) {
-				return new RGB[] { ColorConstants.buttonDarker.getRGB() };
-			}
-            return new RGB[] { ColorConstants.button.getRGB() };
-		} else if (ICSSPropertyID.VAL_RIDGE.equals(style)) {
-			if (ICSSStyle.TOP.equals(edge) || ICSSStyle.LEFT.equals(edge)) {
-				return new RGB[] { ColorConstants.button.getRGB(),
-						ColorConstants.buttonDarkest.getRGB() };
-			}
-            return new RGB[] { ColorConstants.buttonDarkest.getRGB(),
-            		ColorConstants.button.getRGB() };
-		} else if (ICSSPropertyID.VAL_GROOVE.equals(style)) {
-			if (ICSSStyle.TOP.equals(edge) || ICSSStyle.LEFT.equals(edge)) {
-				return new RGB[] { ColorConstants.buttonDarker.getRGB(),
-						ColorConstants.buttonLightest.getRGB() };
-			}
-            return new RGB[] { ColorConstants.buttonLightest.getRGB(),
-            		ColorConstants.buttonDarker.getRGB(), };
-		} else if (ICSSPropertyID.VAL_DOUBLE.equals(style)) {
-			return new RGB[] { ColorConstants.buttonDarkest.getRGB(),
-					graphics.getBackgroundColor().getRGB(),
-					ColorConstants.buttonDarkest.getRGB() };
-		} else if (ICSSPropertyID.VAL_SOLID.equals(style)) {
-			return new RGB[] { ColorConstants.black.getRGB() };
-		}
-
-		return new RGB[] { ColorConstants.black.getRGB() };
-	}
-
-    // TODO: needs refactoring
-	private RGB[] getCustomColors(Graphics graphics, String style, String edge,
-			RGB baseColor) {
-		if (ICSSPropertyID.VAL_OUTSET.equals(style)) {
-			if (ICSSStyle.TOP.equals(edge) || ICSSStyle.LEFT.equals(edge)) {
-				return new RGB[] {
-						new RGB(baseColor.red * 3 / 4,
-								baseColor.green * 3 / 4,
-								baseColor.blue * 3 / 4),
-						new RGB(baseColor.red, baseColor.green, baseColor.blue) };
-			}
-            return new RGB[] {
-            		new RGB(baseColor.red / 2,
-            				baseColor.green / 2,
-            				baseColor.blue / 2),
-            		new RGB(baseColor.red / 4,
-            				baseColor.green / 4,
-            				baseColor.blue / 4) };
-		} else if (ICSSPropertyID.VAL_INSET.equals(style)) {
-			if (ICSSStyle.TOP.equals(edge) || ICSSStyle.LEFT.equals(edge)) {
-				return new RGB[] {
-						new RGB(baseColor.red / 4,
-								baseColor.green / 4,
-								baseColor.blue / 4),
-						new RGB(baseColor.red / 2,
-								baseColor.green / 2,
-								baseColor.blue / 2) };
-			}
-            return new RGB[] {
-            		new RGB(baseColor.red, baseColor.green, baseColor.blue),
-            		new RGB(baseColor.red * 3 / 4,
-            				baseColor.green * 3 / 4,
-            				baseColor.blue * 3 / 4), };
-		} else if (ICSSPropertyID.VAL_TDBORDERSTYLE.equals(style)) {
-			if (ICSSStyle.TOP.equals(edge) || ICSSStyle.LEFT.equals(edge)) {
-				return new RGB[] { new RGB(baseColor.red / 4,
-						baseColor.green / 4, baseColor.blue / 4) };
-			}
-            return new RGB[] { new RGB(baseColor.red, baseColor.green,
-            		baseColor.blue) };
-		} else if (ICSSPropertyID.VAL_RIDGE.equals(style)) {
-			if (ICSSStyle.TOP.equals(edge) || ICSSStyle.LEFT.equals(edge)) {
-				return new RGB[] {
-						new RGB(baseColor.red * 3 / 4,
-								baseColor.green * 3 / 4,
-								baseColor.blue * 3 / 4),
-						new RGB(baseColor.red / 2,
-								baseColor.green / 2,
-								baseColor.blue / 2) };
-			}
-            return new RGB[] {
-            		new RGB(baseColor.red / 2,
-            				baseColor.green / 2,
-            				baseColor.blue / 2),
-            		new RGB(baseColor.red * 3 / 4,
-            				baseColor.green * 3 / 4,
-            				baseColor.blue * 3 / 4) };
-		} else if (ICSSPropertyID.VAL_GROOVE.equals(style)) {
-			if (ICSSStyle.TOP.equals(edge) || ICSSStyle.LEFT.equals(edge)) {
-				return new RGB[] {
-						new RGB(baseColor.red / 4,
-								baseColor.green / 4,
-								baseColor.blue / 4),
-						new RGB(baseColor.red, baseColor.green, baseColor.blue) };
-
-			}
-            return new RGB[] {
-            		new RGB(baseColor.red, baseColor.green, baseColor.blue),
-            		new RGB(baseColor.red / 4,
-            				baseColor.green / 4,
-            				baseColor.blue / 4) };
-		} else if (ICSSPropertyID.VAL_DOUBLE.equals(style)) {
-			return new RGB[] {
-					new RGB(baseColor.red, baseColor.green, baseColor.blue),
-					graphics.getBackgroundColor().getRGB(),
-					new RGB(baseColor.red, baseColor.green, baseColor.blue) };
-		} else if (ICSSPropertyID.VAL_SOLID.equals(style)) {
-			return new RGB[] { new RGB(baseColor.red, baseColor.green,
-					baseColor.blue) };
-		}
-		return new RGB[] { new RGB(baseColor.red, baseColor.green,
-				baseColor.blue) };
-	}
-
-	/**
-	 * @param graphics
-	 * @param rect
-	 * @param innerRect
-	 * @param edge
-	 * @param style
-	 */
-	public void paintEdge(Graphics graphics, Rectangle rect,
-			Rectangle innerRect, String edge, String style) {
-		if (!shouldDraw(style)) {
-			return;
-		}
-		RGB[] rgbs = getEdgeColors(graphics, style, edge);
-
-		if (ICSSStyle.TOP.equals(edge)) {
-			paintTopEdge(graphics, rgbs, style, rect, innerRect);
-		} else if (ICSSStyle.BOTTOM.equals(edge)) {
-			paintBottomEdge(graphics, rgbs, style, rect, innerRect);
-		} else if (ICSSStyle.LEFT.equals(edge)) {
-			paintLeftEdge(graphics, rgbs, style, rect, innerRect);
-		} else if (ICSSStyle.RIGHT.equals(edge)) {
-			paintRightEdge(graphics, rgbs, style, rect, innerRect);
-		}
-	}
-
-	/**
-	 * @param graphics
-	 * @param rect
-	 * @param innerRect
-	 * @param edge
-	 */
-	protected void paintEdge(Graphics graphics, Rectangle rect,
-			Rectangle innerRect, String edge) {
-		String property = MessageFormater.format(BODER_QUERY_TEMPLETE, edge);
-		Object obj = _style.getStyleProperty(property);
-		String style = obj.toString();
-		paintEdge(graphics, rect, innerRect, edge, style);
-	}
-
-	private void paintTopEdge(Graphics graphics, RGB[] rgbs, String style,
-			Rectangle rect, Rectangle innerRect) {
-		int leftX = rect.x;
-		int rightX = rect.right() - 1;
-		int y = rect.y;
-		int width = innerRect.y - rect.y;
-
-		if (ICSSPropertyID.VAL_DOTTED.equals(style)) {
-			drawDottedBorder(graphics, rgbs, ICSSStyle.TOP, rect, width);
-		} else if (ICSSPropertyID.VAL_DASHED.equals(style)) {
-			drawDashedBorder(graphics, rgbs, ICSSStyle.TOP, rect, width);
-		} else {
-			double xLeftRate = ((double) (innerRect.x - rect.x)) / width;
-			double xRightRate = ((double) (rect.right() - innerRect.right()))
-					/ width;
-			graphics.pushState();
-			for (int i = 0; i < width; i++) {
-				Color color = new Color(Display.getCurrent(), rgbs[rgbs.length
-						* i / width]);
-				graphics.setForegroundColor(color);
-				graphics.drawLine((int) (leftX + i * xLeftRate), y + i,
-						(int) (rightX - i * xRightRate), y + i);
-				color.dispose();
-			}
-			graphics.popState();
-		}
-	}
-
-	private void paintBottomEdge(Graphics graphics, RGB[] rgbs, String style,
-			Rectangle rect, Rectangle innerRect) {
-		int leftX = rect.x;
-		int rightX = rect.right() - 1;
-		int y = rect.bottom() - 1;
-		int width = rect.bottom() - innerRect.bottom();
-
-		if (ICSSPropertyID.VAL_DOTTED.equals(style)) {
-			drawDottedBorder(graphics, rgbs, ICSSStyle.BOTTOM, rect, width);
-		} else if (ICSSPropertyID.VAL_DASHED.equals(style)) {
-			drawDashedBorder(graphics, rgbs, ICSSStyle.BOTTOM, rect, width);
-		} else {
-			double xLeftRate = ((double) (innerRect.x - rect.x)) / width;
-			double xRightRate = ((double) (rect.right() - innerRect.right()))
-					/ width;
-			graphics.pushState();
-			for (int i = 0; i < width; i++) {
-				Color color = new Color(Display.getCurrent(), rgbs[rgbs.length
-						* i / width]);
-				graphics.setForegroundColor(color);
-				graphics.drawLine(leftX + (int) (i * xLeftRate), y - i, rightX
-						- (int) (i * xRightRate), y - i);
-				color.dispose();
-			}
-			graphics.popState();
-		}
-	}
-
-	private void paintLeftEdge(Graphics graphics, RGB[] rgbs, String style,
-			Rectangle rect, Rectangle innerRect) {
-		int x = rect.x;
-		int topY = rect.y;
-		int bottomY = rect.bottom() - 1;
-		int width = innerRect.x - rect.x;
-
-		if (ICSSPropertyID.VAL_DOTTED.equals(style)) {
-			drawDottedBorder(graphics, rgbs, ICSSStyle.LEFT, rect, width);
-		} else if (ICSSPropertyID.VAL_DASHED.equals(style)) {
-			drawDashedBorder(graphics, rgbs, ICSSStyle.LEFT, rect, width);
-		} else {
-			double yTopRate = ((double) (innerRect.y - rect.y)) / width;
-			double yBottomRate = ((double) (rect.bottom() - innerRect.bottom()))
-					/ width;
-			graphics.pushState();
-			for (int i = 0; i < width; i++) {
-				Color color = new Color(Display.getCurrent(), rgbs[rgbs.length
-						* i / width]);
-				graphics.setForegroundColor(color);
-				graphics.drawLine(x + i, topY + (int) (i * yTopRate), x + i,
-						bottomY - (int) (i * yBottomRate));
-				color.dispose();
-			}
-			graphics.popState();
-		}
-
-	}
-
-	private void paintRightEdge(Graphics graphics, RGB[] rgbs, String style,
-			Rectangle rect, Rectangle innerRect) {
-		int x = rect.right() - 1;
-		int topY = rect.y;
-		int bottomY = rect.bottom() - 1;
-		int width = rect.right() - innerRect.right();
-
-		if (ICSSPropertyID.VAL_DOTTED.equals(style)) {
-			drawDottedBorder(graphics, rgbs, ICSSStyle.RIGHT, rect, width);
-		} else if (ICSSPropertyID.VAL_DASHED.equals(style)) {
-			drawDashedBorder(graphics, rgbs, ICSSStyle.RIGHT, rect, width);
-		} else {
-			graphics.pushState();
-			for (int i = 0; i < width; i++) {
-				double yTopRate = ((double) (innerRect.y - rect.y)) / width;
-				double yBottomRate = ((double) (rect.bottom() - innerRect
-						.bottom()))
-						/ width;
-				Color color = new Color(Display.getCurrent(), rgbs[rgbs.length
-						* i / width]);
-				graphics.setForegroundColor(color);
-				graphics.drawLine(x - i, topY + (int) (i * yTopRate), x - i,
-						bottomY - (int) (i * yBottomRate));
-				color.dispose();
-			}
-			graphics.popState();
-		}
-	}
-
-	private void drawDottedBorder(Graphics graphics, RGB[] rgbs, String style,
-			Rectangle rect, int width) {
-		if (width == 0 || 3 * width > rect.width) {
-			return;
-		}
-
-		int beginX = 0;
-		int beginY = 0;
-		int xRate = 0;
-		int yRate = 0;
-		int span = 0;
-
-		if (ICSSStyle.TOP.equals(style)) {
-			beginX = rect.x;
-			beginY = rect.y;
-			xRate = 1;
-			yRate = 0;
-			span = rect.width;
-		} else if (ICSSStyle.LEFT.equals(style)) {
-			beginX = rect.x;
-			beginY = rect.y;
-			xRate = 0;
-			yRate = 1;
-			span = rect.height;
-		} else if (ICSSStyle.BOTTOM.equals(style)) {
-			beginX = rect.x;
-			beginY = rect.y + rect.height - width;
-			xRate = 1;
-			yRate = 0;
-			span = rect.width;
-		} else if (ICSSStyle.RIGHT.equals(style)) {
-			beginX = rect.x + rect.width - width;
-			beginY = rect.y;
-			xRate = 0;
-			yRate = 1;
-			span = rect.height;
-		}
-
-		int dottedCount = (span + width) / (2 * width);
-		if (dottedCount < 2) {
-			dottedCount = 2;
-		}
-		int averagePad = (span - dottedCount * width) / (dottedCount - 1);
-		int leftPad = (span - dottedCount * width) % (dottedCount - 1);
-		int[] paddings = new int[dottedCount - 1];
-		Arrays.fill(paddings, averagePad);
-		for (int i = 0; i < leftPad; i++) {
-			paddings[i] = paddings[i] + 1;
-		}
-
-		int pad = 0;
-		Color color = new Color(Display.getCurrent(), rgbs[0]);
-		graphics.pushState();
-		graphics.setBackgroundColor(color);
-		for (int i = 0; i < dottedCount; i++) {
-			graphics.fillOval(beginX + (pad + width * i) * xRate, beginY
-					+ (pad + width * i) * yRate, width, width);
-			if (i != dottedCount - 1) {
-				pad += paddings[i];
-			}
-		}
-		graphics.popState();
-		color.dispose();
-
-	}
-
-	private void drawDashedBorder(Graphics graphics, RGB[] rgbs, String style,
-			Rectangle rect, int borderThick) {
-		if (borderThick == 0 || 5 * borderThick > rect.width) {
-			return;
-		}
-
-		if ((5 * borderThick > rect.height)
-				&& (ICSSStyle.LEFT.equals(style) || ICSSStyle.RIGHT
-						.equals(style))) {
-			return;
-		}
-
-		int width = 0;
-		int height = 0;
-		int edgeLength = 0;
-		int beginX = 0;
-		int beginY = 0;
-		int xRate = 0;
-		int yRate = 0;
-		int span = 0;
-
-		if (ICSSStyle.TOP.equals(style)) {
-			width = borderThick * 2;
-			height = borderThick;
-			beginX = rect.x;
-			beginY = rect.y;
-			xRate = 1;
-			yRate = 0;
-
-			span = rect.width;
-			edgeLength = width;
-		} else if (ICSSStyle.LEFT.equals(style)) {
-			width = borderThick;
-			height = borderThick * 2;
-			beginX = rect.x;
-			beginY = rect.y;
-			xRate = 0;
-			yRate = 1;
-
-			span = rect.height;
-			edgeLength = height;
-		} else if (ICSSStyle.BOTTOM.equals(style)) {
-			width = borderThick * 2;
-			height = borderThick;
-			beginX = rect.x;
-			beginY = rect.y + rect.height - height;
-			xRate = 1;
-			yRate = 0;
-
-			span = rect.width;
-			edgeLength = width;
-		} else if (ICSSStyle.RIGHT.equals(style)) {
-			width = borderThick;
-			height = borderThick * 2;
-			beginX = rect.x + rect.width - width;
-			beginY = rect.y;
-			xRate = 0;
-			yRate = 1;
-
-			span = rect.height;
-			edgeLength = height;
-		}
-
-		int dottedCount = (span + borderThick) / (edgeLength + borderThick);
-		if (dottedCount < 2) {
-			dottedCount = 2;
-		}
-		int averagePad = (span - dottedCount * edgeLength) / (dottedCount - 1);
-		int leftPad = (span - dottedCount * edgeLength) % (dottedCount - 1);
-		int[] paddings = new int[dottedCount - 1];
-		Arrays.fill(paddings, averagePad);
-		for (int i = 0; i < leftPad; i++) {
-			paddings[i] = paddings[i] + 1;
-		}
-
-		int pad = 0;
-		graphics.pushState();
-		Color color = new Color(Display.getCurrent(), rgbs[0]);
-		graphics.setBackgroundColor(color);
-		for (int i = 0; i < dottedCount; i++) {
-			graphics.fillRectangle(beginX + (pad + width * i) * xRate, beginY
-					+ (pad + height * i) * yRate, width, height);
-			if (i != dottedCount - 1) {
-				pad += paddings[i];
-			}
-		}
-		graphics.popState();
-		color.dispose();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/color/CSSColorConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/color/CSSColorConverter.java
deleted file mode 100644
index ea520a1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/color/CSSColorConverter.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.color;
-
-import java.util.StringTokenizer;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.swt.graphics.RGB;
-
-/**
- * @author mengbo
- */
-public class CSSColorConverter {
-	private static final String PREFIX_RGB = "rgb"; //$NON-NLS-1$
-
-	private static Logger _log = PDPlugin.getLogger(CSSColorConverter.class);
-
-	private static CSSColorConverter _instance = new CSSColorConverter();
-
-	/**
-	 * @return singleton instance
-	 */
-	public static CSSColorConverter getInstantce() {
-		if (_instance == null) {
-			_instance = new CSSColorConverter();
-		}
-		return _instance;
-	}
-
-	Object getCSSColor(String CSSText) {
-		if (CSSText == null) {
-			return null;
-		}
-
-		CSSText = CSSText.trim().toLowerCase();
-		if (CSSText.length() == 0) {
-			return null;
-		}
-		if (CSSColorDefaults.SYSTEM_DEFAULT_COLORS.containsKey(CSSText)) {
-			Object result = null;
-			result = CSSColorDefaults.SYSTEM_DEFAULT_COLORS.get(CSSText);
-			return result;
-		} else if (CSSColorDefaults.EXTENDED_COLORS.containsKey(CSSText)) {
-			Object result = null;
-			result = CSSColorDefaults.EXTENDED_COLORS.get(CSSText);
-			return result;
-		} else {
-			return convertStringToRGB(CSSText);
-		}
-	}
-
-	private RGB convertStringToRGB(String CSSText) {
-		StringBuffer sb = new StringBuffer(CSSText);
-		int value;
-		try {
-			if (sb.indexOf("#") == 0) //$NON-NLS-1$
-			{
-				if (sb.length() == 4) {
-					sb.insert(1, sb.charAt(1));
-					sb.insert(3, sb.charAt(3));
-					sb.insert(5, sb.charAt(5));
-					value = Integer.parseInt(sb.substring(1, sb.length())
-							.toString(), 16);
-					return new RGB(value >>> 16 & 0xff, value >>> 8 & 0xff,
-							value & 0xff);
-				} else if (sb.length() == 7) {
-					value = Integer.parseInt(sb.substring(1, sb.length()), 16);
-					return new RGB(value >>> 16 & 0xff, value >>> 8 & 0xff,
-							value & 0xff);
-				}
-			} else if (CSSText.startsWith(PREFIX_RGB)) {
-				return convertRgbToRGB(sb.substring(
-						sb.indexOf("(") + 1, sb.indexOf(")"))); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		} catch (Exception e) {
-			_log.info("CSSColorConverter.0", CSSText, null); //$NON-NLS-1$
-			return null;
-		}
-		return null;
-	}
-
-	private RGB convertRgbToRGB(String text) {
-		text = text.trim();
-		try {
-			StringTokenizer tokenizer = new StringTokenizer(text, ",");//$NON-NLS-1$
-
-			if (tokenizer.countTokens() != 3) {
-				return null;
-			}
-			String[] rgbText = new String[3];
-			for (int i = 0; i < 3; i++) {
-				rgbText[i] = tokenizer.nextToken();
-			}
-
-			int[] intRGB = new int[] { 0, 0, 0 };
-			for (int i = 0; i < 3; i++) {
-				int intValue = -1;
-				String textValue = rgbText[i].trim();
-
-				if (textValue.endsWith("%"))//$NON-NLS-1$
-				{
-					textValue = textValue.substring(0, textValue.length() - 1);
-
-					intValue = Integer.parseInt(textValue) * 255 / 100;
-				} else {
-					intValue = Integer.parseInt(textValue);
-				}
-				if (intValue < 0) {
-					intValue = 0;
-				} else if (intValue > 255) {
-					intValue = 255;
-				}
-				intRGB[i] = intValue;
-			}
-			return new RGB(intRGB[0], intRGB[1], intRGB[2]);
-		} catch (Exception e) {
-			// notify
-			_log.info("CSSColorConverter.1", text, null); //$NON-NLS-1$
-			return null;
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/color/CSSColorDefaults.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/color/CSSColorDefaults.java
deleted file mode 100644
index 556f5db..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/color/CSSColorDefaults.java
+++ /dev/null
@@ -1,284 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.color;
-
-import java.util.HashMap;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @author mengbo
- */
-public class CSSColorDefaults {
-	static final HashMap SYSTEM_DEFAULT_COLORS = new HashMap(20);
-
-	static final HashMap EXTENDED_COLORS = new HashMap(20);
-
-    // TODO C.B.: there is overlap here between the default and extended
-    // colors.  Also, for the custom colors, should use a ColorRegistry
-    // that allows other components to share values here
-	static {
-		SYSTEM_DEFAULT_COLORS.put("black", ColorConstants.black);
-		SYSTEM_DEFAULT_COLORS.put("blue", ColorConstants.blue);
-		SYSTEM_DEFAULT_COLORS.put("gray", ColorConstants.gray);
-		SYSTEM_DEFAULT_COLORS.put("green", new Color(null, 0, 128, 0));
-		SYSTEM_DEFAULT_COLORS.put("orange", ColorConstants.orange);
-		SYSTEM_DEFAULT_COLORS.put("red", ColorConstants.red);
-		SYSTEM_DEFAULT_COLORS.put("white", ColorConstants.white);
-		SYSTEM_DEFAULT_COLORS.put("yellow", ColorConstants.yellow);
-		SYSTEM_DEFAULT_COLORS.put("aqua", ColorConstants.cyan);
-		SYSTEM_DEFAULT_COLORS.put("fuchsia", new Color(null, 255, 0, 255));
-		SYSTEM_DEFAULT_COLORS.put("lime", ColorConstants.green);
-		SYSTEM_DEFAULT_COLORS.put("maroon", new Color(null, 128, 0, 0));
-		SYSTEM_DEFAULT_COLORS.put("navy", new Color(null, 0, 0, 128));
-		SYSTEM_DEFAULT_COLORS.put("olive", new Color(null, 128, 128, 0));
-		SYSTEM_DEFAULT_COLORS.put("purple", new Color(null, 128, 0, 128));
-		SYSTEM_DEFAULT_COLORS.put("silver", ColorConstants.lightGray);
-		SYSTEM_DEFAULT_COLORS.put("teal", new Color(null, 0, 128, 128));
-
-		SYSTEM_DEFAULT_COLORS.put("activeborder", Display.getCurrent()
-				.getSystemColor(SWT.COLOR_WIDGET_BORDER));
-		// Active window border.
-		SYSTEM_DEFAULT_COLORS.put("activecaption",
-				ColorConstants.titleBackground);
-		// Active window caption.
-		SYSTEM_DEFAULT_COLORS
-				.put("appworkspace", ColorConstants.listBackground);
-		// Background color of multiple document interface.
-		SYSTEM_DEFAULT_COLORS.put("background", ColorConstants.listBackground);
-		// Desktop background.
-		SYSTEM_DEFAULT_COLORS.put("buttonface", ColorConstants.button);
-		// Face color for three-dimensional display elements.
-		SYSTEM_DEFAULT_COLORS.put("buttonhighlight",
-				ColorConstants.buttonLightest);
-		// Dark shadow for three-dimensional display elements (for edges facing
-		// away from the light source).
-		SYSTEM_DEFAULT_COLORS.put("buttonshadow", ColorConstants.buttonDarker);
-		// Shadow color for three-dimensional display elements.
-		SYSTEM_DEFAULT_COLORS.put("buttontext", Display.getCurrent()
-				.getSystemColor(SWT.COLOR_WIDGET_FOREGROUND));
-		// Text on push buttons.
-		SYSTEM_DEFAULT_COLORS
-				.put("captiontext", ColorConstants.titleForeground);
-		// Text in caption, size box, and scrollbar arrow box.
-		SYSTEM_DEFAULT_COLORS.put("graytext",
-				ColorConstants.titleInactiveForeground);
-		// Grayed (disabled) text. This color is set to #000 if the current
-		// display driver does not support a solid gray color.
-		SYSTEM_DEFAULT_COLORS.put("highlight",
-				ColorConstants.menuBackgroundSelected);
-		// Item(s) selected in a control.
-		SYSTEM_DEFAULT_COLORS.put("highlighttext",
-				ColorConstants.menuForegroundSelected);
-		// Text of item(s) selected in a control.
-		SYSTEM_DEFAULT_COLORS.put("inactiveborder", Display.getCurrent()
-				.getSystemColor(SWT.COLOR_TITLE_INACTIVE_BACKGROUND_GRADIENT));
-		// Inactive window border.
-		SYSTEM_DEFAULT_COLORS.put("inactivecaption",
-				ColorConstants.titleInactiveBackground);
-		// Inactive window caption.
-		SYSTEM_DEFAULT_COLORS.put("inactivecaptiontext",
-				ColorConstants.titleInactiveForeground);
-		// Color of text in an inactive caption.
-		SYSTEM_DEFAULT_COLORS.put("infobackground",
-				ColorConstants.tooltipBackground);
-		// Background color for tooltip controls.
-		SYSTEM_DEFAULT_COLORS.put("infotext", ColorConstants.tooltipForeground);
-		// Text color for tooltip controls.
-		SYSTEM_DEFAULT_COLORS.put("menu", ColorConstants.menuBackground);
-		// Menu background.
-		SYSTEM_DEFAULT_COLORS.put("menutext", ColorConstants.menuForeground);
-		// Text in menus.
-		SYSTEM_DEFAULT_COLORS.put("scrollbar", Display.getCurrent()
-				.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
-		// Scroll bar gray area.
-		SYSTEM_DEFAULT_COLORS.put("threeddarkshadow", Display.getCurrent()
-				.getSystemColor(SWT.COLOR_WIDGET_DARK_SHADOW));
-		// Dark shadow for three-dimensional display elements.
-		SYSTEM_DEFAULT_COLORS.put("threedface", Display.getCurrent()
-				.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));
-		// Face color for three-dimensional display elements.
-		SYSTEM_DEFAULT_COLORS.put("threedhighlight", Display.getCurrent()
-				.getSystemColor(SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW));
-		// Highlight color for three-dimensional display elements.
-		SYSTEM_DEFAULT_COLORS.put("threedlightshadow", Display.getCurrent()
-				.getSystemColor(SWT.COLOR_WIDGET_LIGHT_SHADOW));
-		// Light color for three-dimensional display elements (for edges facing
-		// the light source).
-		SYSTEM_DEFAULT_COLORS.put("threedshadow", Display.getCurrent()
-				.getSystemColor(SWT.COLOR_WIDGET_DARK_SHADOW));
-		// Dark shadow for three-dimensional display elements.
-		SYSTEM_DEFAULT_COLORS.put("window", Display.getCurrent()
-				.getSystemColor(SWT.COLOR_LIST_BACKGROUND));
-		// Window background.
-		SYSTEM_DEFAULT_COLORS.put("windowframe", Display.getCurrent()
-				.getSystemColor(SWT.COLOR_WIDGET_BORDER));
-		// Window frame.
-		SYSTEM_DEFAULT_COLORS.put("windowtext", Display.getCurrent()
-				.getSystemColor(SWT.COLOR_LIST_FOREGROUND));
-		// Window text
-		SYSTEM_DEFAULT_COLORS.put("hyperlink", ColorConstants.blue);
-	}
-
-    // populate the extended color palette.  Where the extended 
-    // color is the same as a constant color, use that to save
-    // on SWT resource handles
-	static {
-		EXTENDED_COLORS.put("aliceblue", new Color(null, 240, 248, 255));
-		EXTENDED_COLORS.put("antiquewhite", new Color(null, 250, 235, 215));
-		EXTENDED_COLORS.put("aqua", ColorConstants.cyan);
-		EXTENDED_COLORS.put("aquamarine", new Color(null, 127, 255, 212));
-		EXTENDED_COLORS.put("azure", new Color(null, 240, 255, 255));
-		EXTENDED_COLORS.put("beige", new Color(null, 245, 245, 220));
-		EXTENDED_COLORS.put("bisque", new Color(null, 255, 228, 196));
-		EXTENDED_COLORS.put("black", ColorConstants.black);
-		EXTENDED_COLORS.put("blanchedalmond", new Color(null, 255, 235, 205));
-		EXTENDED_COLORS.put("blue", ColorConstants.blue);
-		EXTENDED_COLORS.put("blueviolet", new Color(null, 138, 43, 226));
-		EXTENDED_COLORS.put("brown", new Color(null, 165, 42, 42));
-		EXTENDED_COLORS.put("burlywood", new Color(null, 222, 184, 135));
-		EXTENDED_COLORS.put("cadetblue", new Color(null, 95, 158, 160));
-		EXTENDED_COLORS.put("chartreuse", new Color(null, 127, 255, 0));
-		EXTENDED_COLORS.put("chocolate", new Color(null, 210, 105, 30));
-		EXTENDED_COLORS.put("coral", new Color(null, 255, 127, 80));
-		EXTENDED_COLORS.put("cornflowerblue", new Color(null, 100, 149, 237));
-		EXTENDED_COLORS.put("cornsilk", new Color(null, 255, 248, 220));
-		EXTENDED_COLORS.put("crimson", new Color(null, 220, 20, 60));
-		EXTENDED_COLORS.put("cyan", new Color(null, 0, 255, 255));
-		EXTENDED_COLORS.put("darkblue", new Color(null, 0, 0, 139));
-		EXTENDED_COLORS.put("darkcyan", new Color(null, 0, 139, 139));
-		EXTENDED_COLORS.put("darkgoldenrod", new Color(null, 184, 134, 11));
-		EXTENDED_COLORS.put("darkgray", new Color(null, 169, 169, 169));
-		EXTENDED_COLORS.put("darkgreen", new Color(null, 0, 100, 0));
-		EXTENDED_COLORS.put("darkkhaki", new Color(null, 189, 183, 107));
-		EXTENDED_COLORS.put("darkmagenta", new Color(null, 139, 0, 139));
-		EXTENDED_COLORS.put("darkolivegreen", new Color(null, 85, 107, 47));
-		EXTENDED_COLORS.put("darkorange", new Color(null, 255, 140, 0));
-		EXTENDED_COLORS.put("darkorchid", new Color(null, 153, 50, 204));
-		EXTENDED_COLORS.put("darkred", new Color(null, 139, 0, 0));
-		EXTENDED_COLORS.put("darksalmon", new Color(null, 233, 150, 122));
-		EXTENDED_COLORS.put("darkseagreen", new Color(null, 143, 188, 143));
-		EXTENDED_COLORS.put("darkslateblue", new Color(null, 72, 61, 139));
-		EXTENDED_COLORS.put("darkslategray", new Color(null, 47, 79, 79));
-		EXTENDED_COLORS.put("darkturquoise", new Color(null, 0, 206, 209));
-		EXTENDED_COLORS.put("darkviolet", new Color(null, 148, 0, 211));
-		EXTENDED_COLORS.put("deeppink", new Color(null, 255, 20, 147));
-		EXTENDED_COLORS.put("deepskyblue", new Color(null, 0, 191, 255));
-		EXTENDED_COLORS.put("dimgray", new Color(null, 105, 105, 105));
-		EXTENDED_COLORS.put("dodgerblue", new Color(null, 30, 144, 255));
-		EXTENDED_COLORS.put("feldspar", new Color(null, 209, 146, 117));
-		EXTENDED_COLORS.put("firebrick", new Color(null, 178, 34, 34));
-		EXTENDED_COLORS.put("floralwhite", new Color(null, 255, 250, 240));
-		EXTENDED_COLORS.put("forestgreen", new Color(null, 34, 139, 34));
-		EXTENDED_COLORS.put("fuchsia", new Color(null, 255, 0, 255));
-		EXTENDED_COLORS.put("gainsboro", new Color(null, 220, 220, 220));
-		EXTENDED_COLORS.put("ghostwhite", new Color(null, 248, 248, 255));
-		EXTENDED_COLORS.put("gold", new Color(null, 255, 215, 0));
-		EXTENDED_COLORS.put("goldenrod", new Color(null, 218, 165, 32));
-		EXTENDED_COLORS.put("gray", ColorConstants.gray);
-		EXTENDED_COLORS.put("green", new Color(null, 0, 128, 0));
-		EXTENDED_COLORS.put("greenyellow", new Color(null, 173, 255, 47));
-		EXTENDED_COLORS.put("honeydew", new Color(null, 240, 255, 240));
-		EXTENDED_COLORS.put("hotpink", new Color(null, 255, 105, 180));
-		EXTENDED_COLORS.put("indianred", new Color(null, 205, 92, 92));
-		EXTENDED_COLORS.put("indigo", new Color(null, 75, 0, 130));
-		EXTENDED_COLORS.put("ivory", new Color(null, 255, 255, 240));
-		EXTENDED_COLORS.put("khaki", new Color(null, 240, 230, 140));
-		EXTENDED_COLORS.put("lavender", new Color(null, 230, 230, 250));
-		EXTENDED_COLORS.put("lavenderblush", new Color(null, 255, 240, 245));
-		EXTENDED_COLORS.put("lawngreen", new Color(null, 124, 252, 0));
-		EXTENDED_COLORS.put("lemonchiffon", new Color(null, 255, 250, 205));
-		EXTENDED_COLORS.put("lightblue", new Color(null, 173, 216, 230));
-		EXTENDED_COLORS.put("lightcoral", new Color(null, 240, 128, 128));
-		EXTENDED_COLORS.put("lightcyan", new Color(null, 224, 255, 255));
-		EXTENDED_COLORS.put("lightgoldenrodyellow", new Color(null, 250, 250,
-				210));
-		EXTENDED_COLORS.put("lightgrey", new Color(null, 211, 211, 211));
-		EXTENDED_COLORS.put("lightgreen", new Color(null, 144, 238, 144));
-		EXTENDED_COLORS.put("lightpink", new Color(null, 255, 182, 193));
-		EXTENDED_COLORS.put("lightsalmon", new Color(null, 255, 160, 122));
-		EXTENDED_COLORS.put("lightseagreen", new Color(null, 32, 178, 170));
-		EXTENDED_COLORS.put("lightskyblue", new Color(null, 135, 206, 250));
-		EXTENDED_COLORS.put("lightslateblue", new Color(null, 132, 112, 255));
-		EXTENDED_COLORS.put("lightslategray", new Color(null, 119, 136, 153));
-		EXTENDED_COLORS.put("lightsteelblue", new Color(null, 176, 196, 222));
-		EXTENDED_COLORS.put("lightyellow", new Color(null, 255, 255, 224));
-		EXTENDED_COLORS.put("lime", ColorConstants.green);
-		EXTENDED_COLORS.put("limegreen", new Color(null, 50, 205, 50));
-		EXTENDED_COLORS.put("linen", new Color(null, 250, 240, 230));
-		EXTENDED_COLORS.put("magenta", new Color(null, 255, 0, 255));
-		EXTENDED_COLORS.put("maroon", new Color(null, 128, 0, 0));
-		EXTENDED_COLORS.put("mediumaquamarine", new Color(null, 102, 205, 170));
-		EXTENDED_COLORS.put("mediumblue", new Color(null, 0, 0, 205));
-		EXTENDED_COLORS.put("mediumorchid", new Color(null, 186, 85, 211));
-		EXTENDED_COLORS.put("mediumpurple", new Color(null, 147, 112, 216));
-		EXTENDED_COLORS.put("mediumseagreen", new Color(null, 60, 179, 113));
-		EXTENDED_COLORS.put("mediumslateblue", new Color(null, 123, 104, 238));
-		EXTENDED_COLORS.put("mediumspringgreen", new Color(null, 0, 250, 154));
-		EXTENDED_COLORS.put("mediumturquoise", new Color(null, 72, 209, 204));
-		EXTENDED_COLORS.put("mediumvioletred", new Color(null, 199, 21, 133));
-		EXTENDED_COLORS.put("midnightblue", new Color(null, 25, 25, 112));
-		EXTENDED_COLORS.put("mintcream", new Color(null, 245, 255, 250));
-		EXTENDED_COLORS.put("mistyrose", new Color(null, 255, 228, 225));
-		EXTENDED_COLORS.put("moccasin", new Color(null, 255, 228, 181));
-		EXTENDED_COLORS.put("navajowhite", new Color(null, 255, 222, 173));
-		EXTENDED_COLORS.put("navy", new Color(null, 0, 0, 128));
-		EXTENDED_COLORS.put("oldlace", new Color(null, 253, 245, 230));
-		EXTENDED_COLORS.put("olive", new Color(null, 128, 128, 0));
-		EXTENDED_COLORS.put("olivedrab", new Color(null, 107, 142, 35));
-		EXTENDED_COLORS.put("orange", new Color(null, 255, 165, 0));
-		EXTENDED_COLORS.put("orangeted", new Color(null, 255, 69, 0));
-		EXTENDED_COLORS.put("orchid", new Color(null, 218, 112, 214));
-		EXTENDED_COLORS.put("ralegoldenrod", new Color(null, 238, 232, 170));
-		EXTENDED_COLORS.put("palegreen", new Color(null, 152, 251, 152));
-		EXTENDED_COLORS.put("paleturquoise", new Color(null, 175, 238, 238));
-		EXTENDED_COLORS.put("palevioletred", new Color(null, 216, 112, 147));
-		EXTENDED_COLORS.put("papayawhip", new Color(null, 255, 239, 213));
-		EXTENDED_COLORS.put("peachpuff", new Color(null, 255, 218, 185));
-		EXTENDED_COLORS.put("peru", new Color(null, 205, 133, 63));
-		EXTENDED_COLORS.put("pink", new Color(null, 255, 192, 203));
-		EXTENDED_COLORS.put("plum", new Color(null, 221, 160, 221));
-		EXTENDED_COLORS.put("powderblue", new Color(null, 176, 224, 230));
-		EXTENDED_COLORS.put("purple", new Color(null, 128, 0, 128));
-		EXTENDED_COLORS.put("red", ColorConstants.red);
-		EXTENDED_COLORS.put("rosybrown", new Color(null, 188, 143, 143));
-		EXTENDED_COLORS.put("royalblue", new Color(null, 65, 105, 225));
-		EXTENDED_COLORS.put("saddlebrown", new Color(null, 139, 69, 19));
-		EXTENDED_COLORS.put("salmon", new Color(null, 250, 128, 114));
-		EXTENDED_COLORS.put("sandybrown", new Color(null, 244, 164, 96));
-		EXTENDED_COLORS.put("seagreen", new Color(null, 46, 139, 87));
-		EXTENDED_COLORS.put("seashell", new Color(null, 255, 245, 238));
-		EXTENDED_COLORS.put("sienna", new Color(null, 160, 82, 45));
-		EXTENDED_COLORS.put("silver", new Color(null, 192, 192, 192));
-		EXTENDED_COLORS.put("skyblue", new Color(null, 135, 206, 235));
-		EXTENDED_COLORS.put("slateblue", new Color(null, 106, 90, 205));
-		EXTENDED_COLORS.put("slategray", new Color(null, 112, 128, 144));
-		EXTENDED_COLORS.put("snow", new Color(null, 255, 250, 250));
-		EXTENDED_COLORS.put("springgreen", new Color(null, 0, 255, 127));
-		EXTENDED_COLORS.put("steelblue", new Color(null, 70, 130, 180));
-		EXTENDED_COLORS.put("tan", new Color(null, 210, 180, 140));
-		EXTENDED_COLORS.put("teal", new Color(null, 0, 128, 128));
-		EXTENDED_COLORS.put("thistle", new Color(null, 216, 191, 216));
-		EXTENDED_COLORS.put("tomato", new Color(null, 255, 99, 71));
-		EXTENDED_COLORS.put("turquoise", new Color(null, 64, 224, 208));
-		EXTENDED_COLORS.put("violet", new Color(null, 238, 130, 238));
-		EXTENDED_COLORS.put("violetred", new Color(null, 208, 32, 144));
-		EXTENDED_COLORS.put("wheat", new Color(null, 245, 222, 179));
-		EXTENDED_COLORS.put("white", ColorConstants.white);
-		EXTENDED_COLORS.put("whitesmoke", new Color(null, 245, 245, 245));
-		EXTENDED_COLORS.put("yellow", ColorConstants.yellow);
-		EXTENDED_COLORS.put("yellowgreen", new Color(null, 154, 205, 50));
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/color/CSSColorManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/color/CSSColorManager.java
deleted file mode 100644
index 66dce7b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/color/CSSColorManager.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.color;
-
-/**
- * @author mengbo
- */
-public class CSSColorManager {
-	private static CSSColorManager _instance;
-
-	private CSSColorManager() {
-        // no external instantiation
-	}
-
-	/**
-	 * @return the single instance
-	 */
-	public static CSSColorManager getInstance() {
-		if (_instance == null) {
-			_instance = new CSSColorManager();
-		}
-		return _instance;
-	}
-
-	/**
-	 * return Color or RGB. If return color, then the returned color is system
-	 * color, caller should NOT dispose the returned color
-	 * 
-	 * @param cssText
-	 * @return the color object for cssText
-	 */
-	public Object getColor(String cssText) {
-		return CSSColorConverter.getInstantce().getCSSColor(cssText);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/CSSFont.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/CSSFont.java
deleted file mode 100644
index 646da86..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/CSSFont.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.font;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Font;
-
-/**
- * @author mengbo
- */
-public class CSSFont implements ICSSFont {
-	private String _family;
-
-	private int _size;
-
-	private int _style;
-
-	private int _weight;
-
-	private String _cssString;
-
-	/**
-	 * @param family 
-	 * @param size 
-	 * @param style 
-	 * @param weight 
-	 * @param cssString 
-	 * 
-	 */
-	public CSSFont(String family, int size, int style, int weight,
-			String cssString) {
-		this._family = family;
-		this._size = size;
-		this._style = style;
-		this._weight = weight;
-		_cssString = cssString;
-	}
-
-	public String getFontFamily() {
-		return _family;
-	}
-
-	public int getFontSize() {
-		return _size;
-	}
-
-	public int getFontStyle() {
-		return _style;
-	}
-
-	public String getCSSString() {
-		return _cssString;
-	}
-
-	public int getWeight() {
-		return _weight;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object obj) {
-		if (obj instanceof CSSFont) {
-			CSSFont fd = (CSSFont) obj;
-			return this._family.equals(fd._family) && this._size == fd._size
-					&& this._style == fd._style && this._weight == fd._weight;
-		}
-        return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return _family.hashCode() + _size + _style + _weight;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.font.ICSSFont#getSwtFont()
-	 */
-	public Font getSwtFont() {
-		// return FontPoolManager.getInstance().getFont(this);
-		return CSSFontManager.getInstance().getSwtFont(this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.font.ICSSFont#getXHeight()
-	 */
-	public int getXHeight() {
-		return getFontSize();
-	}
-
-	/**
-	 * @return the style mask for the font style
-	 */
-	public int getSwtFontStyle() {
-		int style = SWT.NONE;
-		// see:http://www.htmlhelp.com/reference/css/font/font-weight.html
-		if (getWeight() >= 600)
-			style |= SWT.BOLD;
-		style |= getFontStyle();
-		return style;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/CSSFontManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/CSSFontManager.java
deleted file mode 100644
index a47a81f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/CSSFontManager.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.font;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.property.FontFamilyMeta;
-import org.eclipse.jst.pagedesigner.css2.property.FontSizeMeta;
-import org.eclipse.jst.pagedesigner.css2.property.FontWeightMeta;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-import org.eclipse.jst.pagedesigner.utils.CacheManager;
-import org.eclipse.jst.pagedesigner.utils.ICacheEntryCreator;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @author mengbo
- */
-public class CSSFontManager implements ICSSFontManager {
-	private static CSSFontManager _instance;
-
-	private static final boolean DEBUG = false;
-
-	private int _totalFont = 0;
-
-	// private static FontPoolManager _fontPoolManager;
-	// Map _cache = new HashMap();
-
-	private static final int CACHESIZE = 100; // we cache 100 font.
-
-	// the scale to convert the px to pt.
-	private final static double FONT_SCALE = ((double) Display.getCurrent()
-			.getDPI().x) / 72;
-
-	static String cssFontToLocalFont(String original) {
-		if ("serif".equalsIgnoreCase(original)) {
-			return "Georgia";
-		} else if ("sans-serif".equalsIgnoreCase(original)) {
-			return "Arial";
-		} else if ("cursive".equalsIgnoreCase(original)) {
-			// FIXME: MS windows does not support the alternative fonts that
-			// match cursive defined at
-			// http://www.w3.org/TR/REC-CSS2/fonts.html#generic-font-families,
-			// We use Comic Sans MS font family
-			// because it is MS alternative.
-			return "Comic Sans MS";
-		} else if ("fantasy".equalsIgnoreCase(original)) {
-			return cssFontToLocalFont("serif");
-		} else if ("monospace".equalsIgnoreCase(original)) {
-			return "Courier New";
-		} else {
-			return original;
-		}
-	}
-
-	private CacheManager _cacheManager = new CacheManager(
-			new ICacheEntryCreator<CSSFont, Font>() {
-				public Font createEntry(CSSFont key) {
-					if (DEBUG) {
-						_totalFont++;
-						System.out.println("TotalFont++: " + _totalFont);
-					}
-					Font font = new Font(null, cssFontToLocalFont(key
-							.getFontFamily()), (int) Math.round(key
-							.getFontSize()
-							/ FONT_SCALE), key.getSwtFontStyle());
-					return font;
-				}
-
-				public void dispose(CSSFont key, Font entry) {
-					if (DEBUG) {
-						_totalFont--;
-						System.out.println("TotalFont--: " + _totalFont);
-					}
-					entry.dispose();
-
-				}
-			}, CACHESIZE);
-
-	/**
-	 * constructor
-	 */
-	private CSSFontManager() {
-		super();
-	}
-
-	private String resolveFontStyleString(ICSSStyle style) {
-		StringBuffer sb = new StringBuffer();
-		sb.append(ICSSPropertyID.ATTR_FONT_FAMILY).append(":");
-		sb.append("'").append(
-				(String) style
-						.getStyleProperty(ICSSPropertyID.ATTR_FONT_FAMILY))
-				.append("'");
-		sb.append(";");
-		sb.append(ICSSPropertyID.ATTR_FONT_STYLE).append(":");
-		sb
-				.append(
-						(String) style
-								.getStyleProperty(ICSSPropertyID.ATTR_FONT_STYLE))
-				.append(";");
-		sb.append(ICSSPropertyID.ATTR_FONT_WEIGHT).append(":");
-		sb.append(
-				((Integer) style
-						.getStyleProperty(ICSSPropertyID.ATTR_FONT_WEIGHT))
-						.toString()).append(";");
-		sb.append(ICSSPropertyID.ATTR_FONT_SIZE).append(":");
-		int fontSize = getFontSize(style, style
-				.getStyleProperty(ICSSPropertyID.ATTR_FONT_SIZE));
-		sb.append(Integer.toString(fontSize));
-		return sb.toString();
-	}
-
-	public ICSSFont createFont(ICSSStyle style) {
-		String fontfamily = (String) style
-				.getStyleProperty(ICSSPropertyID.ATTR_FONT_FAMILY);
-		Object fontsizeobj = style
-				.getStyleProperty(ICSSPropertyID.ATTR_FONT_SIZE);
-		int fontsize;
-		fontsize = getFontSize(style, fontsizeobj);
-		int fontstyle = getFontStyle(style);
-		int fontweight = ((Integer) style
-				.getStyleProperty(ICSSPropertyID.ATTR_FONT_WEIGHT)).intValue();
-
-		return new CSSFont(fontfamily, fontsize, fontstyle, fontweight,
-				resolveFontStyleString(style));
-	}
-
-	private int getFontSize(ICSSStyle style, Object fontsizeobj) {
-		int fontsize;
-		if (fontsizeobj instanceof Length) {
-			fontsize = ((Length) fontsizeobj).getValue();
-		} else {
-			fontsize = style.getParentStyle().getCSSFont().getFontSize();
-		}
-		return fontsize;
-	}
-
-	/**
-	 * @param style
-	 */
-	private int getFontStyle(ICSSStyle style) {
-		int fontstyle;
-		String fontstylestr = (String) style
-				.getStyleProperty(ICSSPropertyID.ATTR_FONT_STYLE);
-		if (ICSSPropertyID.VAL_ITALIC.equals(fontstylestr)
-				|| ICSSPropertyID.VAL_OBLIQUE.equals(fontstylestr)) {
-			fontstyle = SWT.ITALIC;
-		} else {
-			fontstyle = SWT.NORMAL;
-		}
-		return fontstyle;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.font.ICSSFontManager#dispose()
-	 */
-	public void dispose() {
-		_cacheManager.disposeAll();
-	}
-
-	/**
-	 * @return the default css font
-	 */
-	public ICSSFont createDefaultFont() {
-		CSSFont result = new CSSFont(FontFamilyMeta.DEFAULT_FONT,
-				(int) FontSizeMeta.MEDIUM_VAL_INT, SWT.NORMAL,
-				FontWeightMeta.NORMAL_WEIGHT.intValue(), "");
-		return result;
-	}
-
-	/**
-	 * @param f
-	 * @return the swt font for f
-	 */
-	public Font getSwtFont(CSSFont f) {
-		return (Font) _cacheManager.getEntry(f);
-	}
-
-	/**
-	 * @return the singleton font manager
-	 */
-	public static CSSFontManager getInstance() {
-		if (_instance == null) {
-			_instance = new CSSFontManager();
-		}
-		return _instance;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/ICSSFont.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/ICSSFont.java
deleted file mode 100644
index 74adcfb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/ICSSFont.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.font;
-
-import org.eclipse.swt.graphics.Font;
-
-/**
- * XXX: this class should be renamed to CSSFontDescriptor. Since now it is only
- * used to describe a CSSFont.
- * 
- * @author mengbo
- */
-public interface ICSSFont {
-	/**
-	 * Will get a Font system resource from a pool.
-	 * 
-	 * The caller should NOT dispose the returned Font object.
-	 * 
-	 * The caller should not hold reference on the returned Font object, since
-	 * system may dispose it at any time.
-	 * 
-	 * @return the swt font
-	 */
-	public Font getSwtFont();
-
-	/**
-	 * @return the css font family
-	 */
-	public String getFontFamily();
-
-	/**
-	 * @return font size in pixel 
-	 */
-	public int getFontSize();
-
-	/**
-	 * @return font x height in pixel
-	 */
-	public int getXHeight();
-
-	/**
-	 * @return the font weight
-	 */
-	public int getWeight();
-
-	/**
-	 * 
-	 * @return could be SWT.NONE or SWT.ITALIC
-	 */
-	public int getFontStyle();
-
-	/**
-	 * @return the css string
-	 */
-	public String getCSSString();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/ICSSFontManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/ICSSFontManager.java
deleted file mode 100644
index a5a8d3d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/ICSSFontManager.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.font;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-
-/**
- * @author mengbo
- */
-public interface ICSSFontManager {
-	/**
-	 * @param style
-	 * @return ??
-	 */
-	public ICSSFont createFont(ICSSStyle style);
-
-	/**
-	 * FIXME: purpose?
-	 */
-	public void dispose();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/html4.css b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/html4.css
deleted file mode 100644
index e91e5de..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/html4.css
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Basic HTML style information.
- */
-html,
-address,
-blockquote,listing,
-body, dd, div,
-dl, dt, fieldset, legend,form,
-frame, frameset,
-h1, h2, h3, h4,
-h5, h6, noframes,noscript,
-ol, p, ul, center,
-dir, hr, menu, pre, plaintext, xmp  { display: block }
-
-ol				{counter-reset: _anonymous; list-style-type: decimal}
-ul,dir,menu  	{counter-reset: _anonymous; list-style-type: disc}
-li           	{display: list-item}
-li				{counter-increment: _anonymous}
-
-head            { display: none }
-table           { display: table }
-tr              { display: table-row }
-thead           { display: table-header-group }
-tbody           { display: table-row-group }
-tfoot           { display: table-footer-group }
-col             { display: table-column }
-colgroup        { display: table-column-group }
-td, th          { display: table-cell; }
-caption         { display: table-caption }
-th              { font-weight: bolder;}
-caption         { text-align: center;horizontal-align:top }
-button, textarea,
-input, object, 
-select, img { display:inline-block; }
-pre,plaintext, xmp   { white-space: pre }
-h1, h2, h3, h4,
-h5, h6, b,
-strong          { font-weight: bold }
-i, cite, em,dfn,
-var, address    { font-style: italic }
-pre, tt, code,plaintext, xmp,
-kbd, samp       { font-family: monospace }
-ol              { list-style-type: decimal }
-br:before       { content: "\A" }
-center          { text-align: center }
-sub             { vertical-align: sub }
-sup             { vertical-align: super }
-u, ins          { text-decoration: underline }
-input			{ text-decoration: none }
-button			{ white-space: nowrap }
-a[href]			{ text-decoration: underline }
-
-/*
- * styles that may be different for different user agent.
- * This part may need to move out and put into different css files.
- */
-body            { line-height: 1.12em }
-h1              { font-size: 2em; margin: .67em 0 }
-h2              { font-size: 1.5em; margin: .75em 0 }
-h3              { font-size: 1.17em; margin: .83em 0 }
-h4, p,ul,
-fieldset, form,
-ol, dl, dir,
-menu            { margin: 1.12em 0 }
-blockquote      { margin: 1em 40px }
-h5              { font-size: .83em; margin: 1.5em 0 }
-h6              { font-size: .75em; margin: 1.67em 0 }
-blockquote      { margin-left: 40px; margin-right: 40px }
-big             { font-size: larger }
-small, sub, sup { font-size: smaller }
-s, strike, del  { text-decoration: line-through }
-hr              { border: 1px inset }
-ol, ul, dir,
-menu, dd        { margin-left: 40px;border:0px }
-ol ul, ul ol,
-ul ul, ol ol    { margin-top: 0; margin-bottom: 0 }
-abbr, acronym   { font-variant: small-caps; letter-spacing: 0.1em }
-a[href]         { color:blue;}
-select			{background-color: window;font-family:sans-serif;font-size:13px;font-weight: normal;}
-textarea		{border: 2px inset;font-size:13px;font-family:monospace}
-textarea,
-input 			{background-color: window}
-input,
-input[type=text],
-input[type=password] {border: 2px inset;font-size:13px;font-family:sans-serif;font-weight: normal;}
-/* following upcased TYPE is for workaround the WTP M2 bug of not setting default content type */
-input[TYPE=submit],input[TYPE=reset],input[TYPE=button],input[TYPE=cancel],
-button,
-input[type=button],
-input[type=reset],
-input[type=cancel],
-input[type=submit] {background-color: ButtonFace; border: 2px outset; font-size:13px;
-					font-family:sans-serif;text-align: center;font-weight: normal;}
-input[type=image],
-input[type=checkbox],
-input[type=radio]  {border: none }
-input[type=hidden]  {border: none }
-img				{border: 0px none}
-listing         {font-family:monospace;font-size: medium;white-space: pre; margin: 1em 0;}
-tbody,thead,tfoot     {vertical-align: middle;}
-blink 			{text-decoration: blink;}
-
-hr 		{margin: 0.5em auto 0.5em auto;}
-caption  {border: 0px none;margin: 0px; padding:0px 0px 4px 0px;}
-td, th,
-table    {border: 4px none;}
-button   {padding: 3px 5px;text-align: center;vertical-align: middle;}
-button,textarea,input   {vertical-align: text-bottom;color:black;font-style:none;}
-select {vertical-align: text-bottom;}
-input[type=image]  {vertical-align: baseline;}
-li   {min-height:1.2em}
-button {min-height:1.8em}
-div,tr,form {min-height:1.2em}
-table,td {min-width:1.2em;min-height:1.2em}
-
-/* nested lists have no top/bottom margins */
-ul ul,   ul ol,   ul dir,   ul menu,   ul dl,
-ol ul,   ol ol,   ol dir,   ol menu,   ol dl,
-dir ul,  dir ol,  dir dir,  dir menu,  dir dl,
-menu ul, menu ol, menu dir, menu menu, menu dl,
-dl ul,   dl ol,   dl dir,   dl menu,   dl dl 	{margin-top: 0; margin-bottom: 0;}
-
-/* 2 deep unordered lists use a circle */
-ol ul,   ul ul,   menu ul,   dir ul,
-ol menu, ul menu, menu menu, dir menu,
-ol dir,  ul dir,  menu dir,  dir dir 	{list-style-type: circle;}
-
-/* 3 deep (or more) unordered lists use a square */
-ol ol ul,     ol ul ul,     ol menu ul,     ol dir ul,
-ol ol menu,   ol ul menu,   ol menu menu,   ol dir menu,
-ol ol dir,    ol ul dir,    ol menu dir,    ol dir dir,
-ul ol ul,     ul ul ul,     ul menu ul,     ul dir ul,
-ul ol menu,   ul ul menu,   ul menu menu,   ul dir menu,
-ul ol dir,    ul ul dir,    ul menu dir,    ul dir dir,
-menu ol ul,   menu ul ul,   menu menu ul,   menu dir ul,
-menu ol menu, menu ul menu, menu menu menu, menu dir menu,
-menu ol dir,  menu ul dir,  menu menu dir,  menu dir dir,
-dir ol ul,    dir ul ul,    dir menu ul,    dir dir ul,
-dir ol menu,  dir ul menu,  dir menu menu,  dir dir menu,
-dir ol dir,   dir ul dir,   dir menu dir,   dir dir dir { list-style-type: square;}
-
-/**
- * We do not write codes to support some elements. This part defines properties for them 
- * to improve the look of these elements.
- */
-applet {border: 1px solid;}
-fieldset {border: 2px groove;}
-applet,iframe {display:inline-block; border:3px inset; }
-object {display:inline-block;border:0px none;}
-
-
-/* 
- * Sets right margin to have gap between widgets.
- */
-input,textarea,button	 { margin-right: 2px;}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BlockBox.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BlockBox.java
deleted file mode 100644
index d20bc7a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BlockBox.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.draw2d.geometry.Rectangle;
-
-/**
- * A CompositeBox suitable for containing multiple LineBox fragments. Based on
- * BlockBox of draw2d.
- * 
- * @author mengbo
- */
-public class BlockBox extends CompositeBox {
-	// internalContent dimension is for the closure of the FlowBox(es) added
-	// into the BlockBox.
-	private int _internalContentWidth = -1;
-
-	private int _internalContentHeight = -1;
-
-	Rectangle toRectangle() {
-		return new Rectangle(_x, _y, Math.max(_width, _recommendedWidth),
-				_height);
-	}
-
-	/**
-	 * Sets the height.
-	 * 
-	 * @param h
-	 *            The height
-	 */
-	public void setHeight(int h) {
-		_height = h;
-	}
-
-	/**
-	 * Unions the dimensions of this with the dimensions of the passed FlowBox.
-	 * For BlockBox, each time unionInfo is called, the passed in object
-	 * represents a line.
-	 * 
-	 * @param box
-	 *            The FlowBox to union this with
-	 */
-	protected void unionInfo(FlowBox box) {
-		_width = Math.max(_width, box._width + this.getBorderPaddingWidth());
-		_height = Math.max(_height, box._y + box._height
-				+ this.getBorderPaddingHeight());
-
-		_internalContentWidth = Math.max(_internalContentWidth, box._width);
-		_internalContentHeight = Math.max(_internalContentHeight, box._y
-				+ box._height);
-	}
-
-	int getInternalContentWidth() {
-		return _internalContentWidth;
-	}
-
-	int getInternalContentHeight() {
-		return _internalContentHeight;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowBox#getAscent()
-	 */
-	public int getAscent() {
-		// XXX: some hard coded things here. If the blockbox is only for a
-		// single widget, and if that widget support ascent, then we'll
-		// delegate to that widget for ascent support.
-		// if (_fragments.size()==1)
-		// {
-		// FlowBox box = (FlowBox) _fragments.get(0);
-		// if (box instanceof LineBox)
-		// {
-		// List linecomponents = ((LineBox) box).getFragments();
-		// if (linecomponents != null && linecomponents.size() == 1)
-		// {
-		// FlowBox box2 = (FlowBox) linecomponents.get(0);
-		// if (box2 instanceof WidgetBox)
-		// {
-		// WidgetBox widgetBox = (WidgetBox) box2;
-		// if (widgetBox.supportAscent())
-		// {
-		// return widgetBox.getAscent() + this.getBorderPaddingInsets().top;
-		// }
-		// }
-		// }
-		// }
-		// }
-		return super.getAscent();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BlockFlow.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BlockFlow.java
deleted file mode 100644
index d7b8b0b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BlockFlow.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.List;
-
-import org.eclipse.draw2d.PositionConstants;
-
-/**
- * A <code>FlowFigure</code> represented by a single {@link BlockBox}fragment
- * containing one or more lines. A BlockFlow is a creator of LineBoxes, which
- * its children require during layout. A BlockFlow can be thought of as a
- * paragraph.
- * <P>
- * BlockFlows should be nested inside other BlockFlows, but it is also valid to
- * place them in InlineFlows. {@link FlowPage}can be used as a "root" block and
- * can be added to normal draw2d Figures.
- * <P>
- * Only {@link FlowFigure}s can be added to a BlockFlow.
- */
-/*package*/ class BlockFlow extends FlowFigure {
-
-	final BlockBox _blockBox;
-
-	private int _aligment;
-
-	/**
-	 * Constructs a new BlockFlow.
-	 */
-	public BlockFlow() {
-		setLayoutManager(createDefaultFlowLayout());
-		_blockBox = createBlockBox();
-	}
-
-	BlockBox createBlockBox() {
-		return new BlockBox();
-	}
-
-	/**
-	 * @return the default flow layout
-	 * 
-	 */
-	protected FlowFigureLayout createDefaultFlowLayout() {
-		return new BlockFlowLayout(this);
-	}
-
-	/**
-	 * Returns the BlockBox associated with this.
-	 * 
-	 * @return This BlockFlow's BlockBox
-	 */
-	protected BlockBox getBlockBox() {
-		return _blockBox;
-	}
-
-	/**
-	 * Returns the horizontal aligment.
-	 * 
-	 * @return the hotizontal aligment
-	 */
-	public int getHorizontalAligment() {
-		return _aligment & PositionConstants.LEFT_CENTER_RIGHT;
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigure#postValidate()
-	 */
-	public void postValidate() {
-		setBounds(getBlockBox().toRectangle().expand(getInsets()));
-		List v = getChildren();
-		for (int i = 0, n = v.size(); i < n; i++) {
-			((FlowFigure) v.get(i)).postValidate();
-		}
-	}
-
-	/**
-	 * Sets the horitontal aligment of the block. Valid values are:
-	 * <UL>
-	 * <LI>{@link org.eclipse.draw2d.PositionConstants#LEFT}
-	 * <LI>{@link org.eclipse.draw2d.PositionConstants#RIGHT}
-	 * <LI>{@link org.eclipse.draw2d.PositionConstants#CENTER}
-	 * 
-	 * @param value
-	 *            the aligment
-	 */
-	public void setHorizontalAligment(int value) {
-		if (!(value == PositionConstants.LEFT
-				|| value == PositionConstants.RIGHT || value == PositionConstants.CENTER)) {
-			throw new IllegalArgumentException(
-					"Horizontal Aligment must be one of: LEFT, CENTER, RIGHT");
-		}
-		this._aligment &= ~PositionConstants.LEFT_CENTER_RIGHT;
-		this._aligment |= value;
-		revalidate();
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.Figure#useLocalCoordinates()
-	 */
-	protected boolean useLocalCoordinates() {
-		return true;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BlockFlowContext.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BlockFlowContext.java
deleted file mode 100644
index 44c43c8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BlockFlowContext.java
+++ /dev/null
@@ -1,288 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-
-/**
- * When doing absolute positioning, we need to create a block. But that block
- * don't have a corresponding figure. So we need a block without corresponding
- * figure.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class BlockFlowContext implements FlowContext {
-	private LineBox _currentLine;
-
-	private LineBox _previousLine = null;
-
-	BlockBox _blockBox;
-
-	private final FlowContext _originalContext;
-
-	private final ICSSStyle _style;
-
-	/**
-	 * @param originalContext 
-	 * @param style 
-	 */
-	public BlockFlowContext(FlowContext originalContext, ICSSStyle style) {
-		this._originalContext = originalContext;
-		this._style = style;
-		setup();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getContainerWidth()
-	 */
-	public int getContainerWidth() {
-
-		return _originalContext.getContainerWidth();
-	}
-
-	/**
-	 * Initialize the object
-	 */
-	private void setup() {
-		_blockBox = new BlockBox();
-		_blockBox.setRecommendedWidth(getRecommendedWidth());
-		_currentLine = this.getCurrentLine();
-		_previousLine = null;
-	}
-
-	private int getRecommendedWidth() {
-		int containerWidth = getContainerWidth();
-		Object leftObj = _style.getStyleProperty(ICSSPropertyID.ATTR_LEFT);
-		if (leftObj != null && leftObj instanceof Length) {
-			Length left = (Length) leftObj;
-			int intLeft = left.getValue();
-			if (left.isPercentage()) {
-				intLeft = containerWidth * intLeft / 100;
-			}
-			if (intLeft < containerWidth) {
-				return containerWidth - intLeft;
-			}
-		}
-		return containerWidth;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#addToCurrentLine(org.eclipse.jst.pagedesigner.css2.layout.FlowBox)
-	 */
-	public void addToCurrentLine(FlowBox block) {
-		getCurrentLine().add(block);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#endLine()
-	 */
-	public void endLine() {
-		// this is called from child layouts.
-		// If there is no current line, state is equivalent to new line
-		if (_currentLine == null)
-			return;
-		if (_currentLine.isOccupied())
-			layoutLine(); // finalize the current line layout
-		else
-			return;
-
-		LineBox box = _currentLine;
-		// _currentLine = _previousLine; //XXX: ???? why (yang)
-		_previousLine = box;
-
-		_currentLine = null;
-		// setupLine(getCurrentLine());
-
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getCurrentLine()
-	 */
-	public LineBox getCurrentLine() {
-		if (_currentLine == null)
-			createNewLine();
-		return _currentLine;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getCurrentLine(int)
-	 */
-	public LineBox getCurrentLine(int topMargin) {
-		if (_currentLine == null)
-			createNewLine(topMargin);
-		return _currentLine;
-	}
-
-	/**
-	 * @param topMargin
-	 */
-	private void createNewLine(int topMargin) {
-		createNewLine();
-	}
-
-	private void createNewLine() {
-		_currentLine = new LineBox();
-		setupLine(_currentLine, Integer.MIN_VALUE);
-	}
-
-	/**
-	 * Override to setup the line's x, remaining, and available width.
-	 * 
-	 * @param line
-	 *            the LineBox to set up
-	 * @param topMargin 
-	 */
-	protected void setupLine(LineBox line, int topMargin) {
-		line.clear();
-
-		// the caller of getCurrentLine() may add leftMargin and leftPadding and
-		// leftBorder to line.x
-		line._x = _blockBox.getBorderInsets().left + _blockBox.getPaddingInsets().left;
-
-		// FIXME: here should check the floating boxes, and minus the width of
-		// them from
-		// current line.
-		// XXX: the RecommendedContentWidth is related with the RecommendedWidth
-		// of container that
-		// usually larger than it needed.here we do not set the RecommendedWidth
-		// for the sake of
-		// layouting right absolute position.
-		// /shortcoming:the box will break into multi-line after every white
-		// space.
-		// line.setRecommendedWidth(_blockBox.getRecommendedContentWidth());
-		if (_previousLine == null) {
-			line._y = _blockBox.getBorderInsets().top
-					+ _blockBox.getPaddingInsets().top;
-			if (topMargin != Integer.MIN_VALUE)
-				line._y += topMargin;
-		} else {
-			if (topMargin == Integer.MIN_VALUE)
-				line._y = _previousLine._y + _previousLine.getHeight()
-						+ getLinePadding() + _previousLine.getMarginInsets().bottom; // XXX:
-			// should
-			// add
-			// previous
-			// margin
-			// bottom?
-			else
-				line._y = _previousLine._y
-						+ _previousLine.getHeight()
-						+ Math.max(topMargin,
-								_previousLine.getMarginInsets().bottom);
-		}
-		// line.validate();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getCurrentY()
-	 */
-	public int getCurrentY() {
-		return getCurrentLine()._y; // FIXME: margin of previous block?
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#isCurrentLineOccupied()
-	 */
-	public boolean isCurrentLineOccupied() {
-		return _currentLine != null && _currentLine.isOccupied();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getLastMarginRight()
-	 */
-	public int getLastMarginRight() {
-		if (_currentLine == null || !_currentLine.isOccupied()) {
-			return 0;
-		}
-		FlowBox box = (FlowBox) _currentLine.getFragments().get(
-				_currentLine.getFragments().size() - 1);
-		if (box != null) {
-			return box.getMarginInsets().right;
-		}
-        return 0;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#isCalculatingMaxWidth()
-	 */
-	public boolean isCalculatingMaxWidth() {
-		return false;
-	}
-
-	/**
-	 * Adjust all fragments in the current line to have the same baseline. Do
-	 * any additional adjustments, such as horizontal alignment.
-	 */
-	protected void layoutLine() {
-		// currentLine.x = 0; //XXX: comment out, don't understand why set to 0,
-		// because it has already
-		// been set when setupLine(). And if do need, should
-		// set to getBorderPaddingInsets().left
-		// if (!isInlineBlock() && shouldExpand())
-		// {
-		// // FIXME: currently we are using getRecommendedContentWidth,
-		// // what happen if after adding the new line, the new width is bigger
-		// than
-		// // recommendedContentWidth? should we use getWidth() instead of
-		// // recommendedcontentWidth?
-		//
-		// Object textalign =
-		// (getCSSStyle().getStyleProperty(ICSSPropertyID.ATTR_TEXTALIGN));
-		// if (textalign == ICSSPropertyID.VAL_RIGHT)
-		// {
-		// _currentLine._x = _blockBox.getRecommendedContentWidth() +
-		// _blockBox.getBorderPaddingInsets().left - _currentLine.getWidth();
-		// }
-		// else if (textalign == ICSSPropertyID.VAL_CENTER)
-		// {
-		//
-		// _currentLine._x = _blockBox.getBorderPaddingInsets().left +
-		// (_blockBox.getRecommendedContentWidth() - _currentLine.getWidth()) /
-		// 2;
-		// }
-		// if (_currentLine._x < 0)
-		// _currentLine._x = 0;
-		// }
-
-		// FIXME: should check vertical alignment here?
-		_currentLine.commit();
-		_blockBox.add(_currentLine);
-	}
-
-	void endBlock() {
-		endLine();
-	}
-
-	int getLinePadding() {
-		return 0;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BlockFlowLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BlockFlowLayout.java
deleted file mode 100644
index 05bf6c4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BlockFlowLayout.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.geometry.Insets;
-
-/**
- * The layout for {@link BlockFlow}figures.
- * <P>
- * WARNING: This class is not intended to be subclassed by clients.
- * 
- * @author mengbo
- * @since 2.1
- */
-public class BlockFlowLayout extends FlowContainerLayout {
-	private LineBox _previousLine = null;
-
-	BlockBox _blockBox;
-
-	/**
-	 * Creates a new BlockFlowLayout with the given BlockFlow.
-	 * 
-	 * @param blockFlow
-	 *            the BlockFlow
-	 */
-	public BlockFlowLayout(BlockFlow blockFlow) {
-		super(blockFlow);
-	}
-
-	/**
-	 * @see FlowContainerLayout#cleanup()
-	 */
-	protected void cleanup() {
-		_currentLine = _previousLine = null;
-	}
-
-	/**
-	 * @see FlowContainerLayout#createNewLine()
-	 */
-	protected void createNewLine() {
-		_currentLine = new LineBox();
-		setupLine(_currentLine, Integer.MIN_VALUE);
-	}
-
-	protected void createNewLine(int topmargin) {
-		_currentLine = new LineBox();
-		setupLine(_currentLine, topmargin);
-	}
-
-	/**
-	 * Override to setup the line's x, remaining, and available width.
-	 * 
-	 * @param line
-	 *            the LineBox to set up
-	 * @param topMargin 
-	 */
-	protected void setupLine(LineBox line, int topMargin) {
-		line.clear();
-
-		// the caller of getCurrentLine() may add leftMargin and leftPadding and
-		// leftBorder to line.x
-		line._x = 0;
-
-		// FIXME: here should check the floating boxes, and minus the width of
-		// them from
-		// current line.
-		line.setRecommendedWidth(_blockBox.getRecommendedContentWidth());
-		if (_previousLine == null) {
-			line._y = 0;
-			if (topMargin != Integer.MIN_VALUE) {
-				line._y += topMargin;
-			}
-		} else {
-			if (topMargin == Integer.MIN_VALUE) {
-				line._y = _previousLine._y + _previousLine.getHeight()
-						+ getLinePadding() + _previousLine.getMarginInsets().bottom; // XXX:
-				// should
-				// add
-				// previous
-				// margin
-				// bottom?
-			} else {
-				line._y = _previousLine._y
-						+ _previousLine.getHeight()
-						+ Math.max(topMargin,
-								_previousLine.getMarginInsets().bottom);
-			}
-		}
-		// line.validate();
-	}
-
-	/**
-	 * Called by flush(), adds the BlockBox associated with this BlockFlowLayout
-	 * to the current line and then ends the line.
-	 */
-	protected void endBlock() {
-		getFlowContext().addToCurrentLine(_blockBox);
-
-		// FIXME: here should tell the context the bottom margin.
-		getFlowContext().endLine();
-	}
-
-	/**
-	 * @see FlowContext#endLine()
-	 */
-	public void endLine() {
-		// this is called from child layouts.
-		// If there is no current line, state is equivalent to new line
-		if (_currentLine == null) {
-			return;
-		}
-		if (_currentLine.isOccupied()) {
-			layoutLine(); // finalize the current line layout
-		} else {
-			_currentLine = null;
-			return;
-		}
-		LineBox box = _currentLine;
-		_previousLine = box;
-		_currentLine = null;// _previousLine; //XXX: ???? why (yang)
-
-		// setupLine(getCurrentLine());
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getCurrentY()
-	 */
-	public int getCurrentY() {
-		return getCurrentLine()._y; // FIXME: margin of previous block?
-	}
-
-	/**
-	 * Returns the BlockFlow associated with this BlockFlowLayout
-	 * 
-	 * @return the BlockFlow
-	 */
-	protected final BlockFlow getBlockFlow() {
-		return (BlockFlow) getFlowFigure();
-	}
-
-	/**
-	 * Adjust all fragments in the current line to have the same baseline. Do
-	 * any additional adjustments, such as horizontal alignment.
-	 */
-	protected void layoutLine() {
-		// currentLine.x = 0; //XXX: comment out, don't understand why set to 0,
-		// because it has already
-		// been set when setupLine(). And if do need, should
-		// set to getBorderPaddingInsets().left
-		switch (getBlockFlow().getHorizontalAligment()) {
-		case PositionConstants.RIGHT:
-			_currentLine._x = _blockBox.getContentWidth()
-					- getBorderPaddingInsets().right - _currentLine.getWidth();
-			break;
-		case PositionConstants.CENTER:
-			_currentLine._x = (_blockBox.getContentWidth()
-					+ getBorderPaddingInsets().left
-					- getBorderPaddingInsets().right - _currentLine.getWidth()) / 2;
-			break;
-		}
-		// FIXME: should check vertical alignment here?
-		_currentLine.commit();
-		_blockBox.add(_currentLine);
-	}
-
-	/**
-	 * @see FlowContainerLayout#flush()
-	 */
-	protected void flush() {
-		if (_currentLine != null)
-			layoutLine();
-		endBlock();
-	}
-
-	/**
-	 * @see FlowContainerLayout#preLayout()
-	 */
-	protected void preLayout() {
-		_blockBox = getBlockFlow().getBlockBox();
-		setupBlock();
-		// Probably could setup current and previous line here, or just previous
-	}
-
-	/**
-	 * sets up the single block that contains all of the lines.
-	 */
-	protected void setupBlock() {
-		// Ask for a new line, in case we are in the middle of a line
-
-		// FIXME: the endLine() should tell context the top margin of this
-		// block.
-		getFlowContext().endLine();
-
-		LineBox line = getFlowContext().getCurrentLine();
-		// int recommended = line.getAvailableWidth();
-		// if (recommended != previousRecommendedWidth)
-		// Remove all current Fragments
-		_blockBox.clear();
-
-		// Setup the one fragment for this Block with the correct X and
-		// available width
-
-		// FIXME: here should check whether the CSS already set recommended
-		// width for this
-		// block.
-		_blockBox.setRecommendedWidth(line.getAvailableWidth());
-
-		_blockBox._y = getFlowContext().getCurrentY();
-
-		// FIXME: blockBox.x should be context.getBorderPaddingInsets().left
-		// or just line.x ?
-		_blockBox._x = 0;
-	}
-
-	Insets getBorderPaddingInsets() {
-		// FIXME:
-		return new Insets();
-	}
-
-	int getLinePadding() {
-		return 0;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#dispose()
-	 */
-	public void dispose() {
-        // TODO: anything to dispose?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getContainerWidth()
-	 */
-	public int getContainerWidth() {
-		int width = Math.max(0, Math.max(_blockBox.getWidth(), _blockBox
-				.getRecommendedWidth()));
-		return width;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BoxUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BoxUtil.java
deleted file mode 100644
index b91e30e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/BoxUtil.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.swt.graphics.Color;
-
-/**
- * @author mengbo
- */
-public class BoxUtil {
-	/**
-	 * @param box
-	 * @param style
-	 */
-	public static void setupBorderPaddingMargin(FlowBox box, ICSSStyle style) {
-		box.setMarginInsets(new Insets(style.getMarginInsets()));
-		box.setBorderInsets(new Insets(style.getBorderInsets()));
-		box.setPaddingInsets(new Insets(style.getPaddingInsets()));
-
-		if (box.getBorderPaddingHeight() > box.getHeight()) {
-			box.setHeight(box.getBorderPaddingHeight());
-		}
-		if (box.getBorderPaddingWidth() > box.getWidth()) {
-			box.setWidth(box.getBorderPaddingWidth());
-		}
-	}
-
-	/**
-	 * Debug code.
-	 * 
-	 * @param g
-	 * @param box
-	 */
-	public static void drawBox(Graphics g, FlowBox box) {
-		Color color = null;
-		if (box instanceof BlockBox) {
-			// color = ColorConstants.red;
-		} else if (box instanceof LineBox) {
-			color = ColorConstants.blue;
-		} else if (box instanceof TextFragmentBox) {
-			color = ColorConstants.green;
-		} else {
-			color = ColorConstants.darkGreen;
-		}
-		if (color != null) {
-			g.setForegroundColor(color);
-			g.setLineStyle(Graphics.LINE_DASH);
-			g.setLineWidth(1);
-			g.drawRectangle(box._x, box._y, box.getWidth(), box.getHeight());
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSBlockFlowLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSBlockFlowLayout.java
deleted file mode 100644
index dd02b49..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSBlockFlowLayout.java
+++ /dev/null
@@ -1,745 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta;
-import org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-import org.eclipse.jst.pagedesigner.css2.widget.BorderUtil;
-import org.eclipse.swt.graphics.FontMetrics;
-
-/**
- * The block layout for {@link CSSFigure}figures. Basic code structure is from
- * BlockFlowLayout.
- * 
- * @author mengbo
- */
-public class CSSBlockFlowLayout extends CSSLayout implements ICSSPainter2 {
-	private LineBox _previousLine = null;
-
-	/**
-	 * the block box for the layout object
-	 */
-	protected BlockBox _blockBox = null;
-
-	/**
-	 * The font metrics for this layout object
-	 */
-	protected FontMetrics _fontMetrices;
-
-	int _userSpecifiedWidth;
-
-	int _userSpecifiedHeight;
-
-	/*
-	 * whether we need HScroll and VScroll when overflow is set to "scroll".
-	 * will be updated in "endBlock" and used in "paintFigurePostClientArea"
-	 */
-	boolean _needHScroll = false;
-
-	boolean _needVScroll = false;
-
-	/**
-     * Creates a new CSSBlockFlowLayout with the given BlockFlow.
-	 * @param cssfigure
-	 */
-	public CSSBlockFlowLayout(CSSFigure cssfigure) {
-		super(cssfigure);
-	}
-
-	/**
-	 * @return true if this layout box has more than one line
-	 */
-	protected boolean hasMoreThanOneLine() {
-		return _previousLine != null;
-	}
-
-	/**
-	 * @return true if this layout block is inline
-	 */
-	public boolean isInlineBlock() {
-		String obj = getCSSStyle().getDisplay();
-		return ICSSPropertyID.VAL_INLINE_BLOCK.equals(obj)
-				|| ICSSPropertyID.VAL_INLINE_TABLE.equals(obj);
-	}
-
-	/**
-	 * @return true if should expand the width to all available width. 
-	 */
-	public boolean shouldExpand() {
-		ICSSStyle style = getCSSStyle();
-		if (style == null) {
-			return false;
-		}
-        return "block".equalsIgnoreCase(style.getDisplay())
-        		|| "list-item".equalsIgnoreCase(style.getDisplay());
-	}
-
-	// ---------------------------------------------------------------------------------------------------
-	// preLayout stage. Major job is get the top-left corner information of the
-	// new block.
-
-	/**
-	 * sets up the single block that contains all of the lines.
-	 */
-	protected void setupBlock() {
-		// int recommended = line.getAvailableWidth();
-		// if (recommended != previousRecommendedWidth)
-		// Remove all current Fragments
-		_blockBox.clear();
-		// Ask for a new line, in case we are in the middle of a line
-
-		if (!isInlineBlock()) {
-			LineBox lineBox = getFlowContext().getCurrentLine();
-			if (lineBox != null && !lineBox.isEmptyStringLine()) {
-				getFlowContext().endLine();
-			}
-		}
-
-		ICSSStyle style = getCSSStyle();
-
-		// endLine will result in context create a new line, so we are in the
-		// new line now.
-		// passing in the top margin, and context will consider that when create
-		// the new line.
-		int marginTop = style.getMarginInsets().top;
-		LineBox line = getFlowContext().getCurrentLine(marginTop);
-
-		// Setup the one fragment for this Block with the correct X and
-		// available width
-
-		// FIXME: according to spec, when using percentage width/height, should
-		// percentage to
-		// the "containing block". But we don't have very good "containing
-		// block" resolution
-		// implementation yet.
-
-		// calculate the min size
-		// int minWidth = 0;
-		// int minHeight = 0;
-		// if (style != null)
-		// {
-		// // try to see whether there is any designer specified min size
-		// ITagEditInfo info = (ITagEditInfo)
-		// style.getAdapter(ITagEditInfo.class);
-		// if (info != null)
-		// {
-		// minWidth = info.getMinWidth();
-		// minHeight = info.getMinHeight();
-		// }
-		//
-		// // CSS also has the min-width/min-height property. We should also get
-		// that,
-		// // and using the max of the "min-width" css property and the designer
-		// specified min size.
-		// int height = getLengthValue(style,ICSSPropertyID.ATTR_MIN_HEIGHT);
-		// if(height > minHeight)
-		// {
-		// minHeight = height;
-		// }
-		// int width = getLengthValue(style,ICSSPropertyID.ATTR_MIN_WIDTH);
-		// if(width > minWidth)
-		// {
-		// minWidth = width;
-		// }
-		// }
-
-		// keep track of user specified size, this will be used when handling
-		// the "overflow" CSS property.
-		_userSpecifiedWidth = 0;
-		_userSpecifiedHeight = 0;
-
-		{
-			int width = getLengthValue(style, ICSSPropertyID.ATTR_WIDTH);
-
-			int availableWidth = line.getAvailableWidth()
-					- style.getMarginInsets().getWidth();
-			if (width <= 0) {
-				// no width setting
-				if (isCalculatingMaxWidth()) {
-					_blockBox.setRecommendedWidth(Integer.MAX_VALUE);
-					// _blockBox.setWidth( (minWidth>0?minWidth:0));
-				} else {
-					_blockBox.setRecommendedWidth(availableWidth);
-					if (shouldExpand()) {
-						_blockBox.setWidth(availableWidth);
-					} else {
-						// _blockBox.setWidth( (minWidth>0?minWidth:0));
-					}
-				}
-			} else {
-				int w = width;
-				if (!style.isSizeIncludeBorderPadding()) {
-					w += style.getBorderInsets().getWidth()
-							+ style.getPaddingInsets().getWidth();
-				}
-				// XXX: should we use minWidth or follow user's choice?
-				// if (w < minWidth)
-				// {
-				// w = minWidth;
-				// }
-				_userSpecifiedWidth = w;
-				_blockBox.setWidth(w);
-				_blockBox.setRecommendedWidth(w);
-			}
-		}
-
-		{
-			int height = getLengthValue(style, ICSSPropertyID.ATTR_HEIGHT);
-			// Object height =
-			// style.getStyleProperty(ICSSPropertyID.ATTR_HEIGHT);
-			// Length heightLength = (height instanceof Length) ? (Length)
-			// height : null;
-
-			if (height <= 0) {
-				// if (minHeight > 0)
-				// {
-				// // _blockBox.setHeight(minHeight);
-				// _blockBox.setRecommendedHeight(minHeight);
-				// }
-				// else
-				{
-					_blockBox.setHeight(0);
-					_blockBox.setRecommendedHeight(0);
-				}
-			} else {
-				int h = height;
-				if (handlingBorderForBlock()
-						&& !style.isSizeIncludeBorderPadding()) {
-					h += style.getBorderInsets().getHeight()
-							+ style.getPaddingInsets().getHeight();
-				}
-				// XXX: should we follow minHeight or user's choice?
-				// if (minHeight > h)
-				// {
-				// h = minHeight;
-				// }
-				_userSpecifiedHeight = h;
-				_blockBox.setHeight(h);
-				_blockBox.setRecommendedHeight(h);
-			}
-		}
-		_blockBox.setMarginInsets(new Insets(style.getMarginInsets()));
-		if (handlingBorderForBlock()) {
-			BoxUtil.setupBorderPaddingMargin(_blockBox, getCSSStyle());
-		}
-
-		// as in designer, we don't want to the element to have zero size, so
-		// set a minimun size here.
-		// _blockBox.setWidth(Math.max(20, _blockBox.getWidth()));
-		// int minHeight = getCSSStyle().getCSSFont().getFontSize() +
-		// _blockBox.getBorderPaddingHeight();
-		// _blockBox.setHeight(Math.max(minHeight, _blockBox.getHeight()));
-
-		_blockBox._y = line._y;
-		_blockBox._x = line._x;
-
-		setBlockVerticalAlign(_blockBox);
-	}
-
-	/**
-	 * @param style
-	 * @param property
-	 * @return the length value
-	 */
-	protected int getLengthValue(ICSSStyle style, String property) {
-		int lengthValue = 0;
-		if (style != null) {
-			Object object = style.getStyleProperty(property);
-			Length lengthObj = (object instanceof Length) ? (Length) object
-					: null;
-
-			if (lengthObj != null) {
-				lengthValue = lengthObj.getValue();
-				if (lengthObj.isPercentage()) {
-					if (ICSSPropertyID.ATTR_WIDTH.equalsIgnoreCase(property)
-							|| ICSSPropertyID.ATTR_MIN_WIDTH
-									.equalsIgnoreCase(property)) {
-						lengthValue = this.getFlowContext().getCurrentLine().getRecommendedContentWidth()
-								* lengthValue / 100;
-					} else if (ICSSPropertyID.ATTR_HEIGHT
-							.equalsIgnoreCase(property)
-							|| ICSSPropertyID.ATTR_MIN_HEIGHT
-									.equalsIgnoreCase(property)) {
-						// XXX: we should omit it because we don't support
-						// percentage height now.
-						lengthValue = 0;
-					}
-				}
-			}
-		}
-		return lengthValue;
-	}
-
-	private void setBlockVerticalAlign(BlockBox box) {
-		ICSSStyle style = getCSSStyle();
-		if (style != null) {
-			box.setVerticalAlignData(style
-					.getStyleProperty(ICSSPropertyID.ATTR_VERTICAL_ALIGN));
-		}
-	}
-
-	/**
-	 * @see FlowContainerLayout#preLayout()
-	 */
-	protected void preLayout() {
-		super.preLayout();
-		_blockBox = new BlockBox();
-		setupBlock();
-		// Probably could setup current and previous line here, or just previous
-	}
-
-	// -------------------------------------------------------------------------------------------------------
-	/**
-	 * layout the lines in this layout
-	 */
-	protected void layoutLines() {
-		List lines = _blockBox.getFragments();
-		if (lines != null) {
-			for (int i = 0; i < lines.size(); i++) {
-				if (lines.get(i) instanceof LineBox) {
-					layoutLine((LineBox) lines.get(i));
-				}
-			}
-		}
-	}
-
-	/**
-	 * Called by flush(), adds the BlockBox associated with this BlockFlowLayout
-	 * to the current line and then ends the line.
-	 */
-	protected void endBlock() {
-		layoutLines();
-		ICSSStyle style = getCSSStyle();
-		if (style != null) {
-			int minWidth = 0;
-			int minHeight = 0;
-			// try to see whether there is any designer specified min size
-			ITagEditInfo info = (ITagEditInfo) style
-					.getAdapter(ITagEditInfo.class);
-			if (info != null) {
-				minWidth = info.getMinWidth();
-				minHeight = info.getMinHeight();
-			}
-
-			// CSS also has the min-width/min-height property. We should also
-			// get that,
-			// and using the max of the "min-width" css property and the
-			// designer specified min size.
-			int height = getLengthValue(style, ICSSPropertyID.ATTR_MIN_HEIGHT);
-			if (height > minHeight) {
-				minHeight = height;
-			}
-			int width = getLengthValue(style, ICSSPropertyID.ATTR_MIN_WIDTH);
-			if (width > minWidth) {
-				minWidth = width;
-			}
-			if (minHeight > _blockBox.getHeight()) {
-				_blockBox.setHeight(minHeight);
-			}
-			if (minWidth > _blockBox.getWidth()) {
-				_blockBox.setWidth(minWidth);
-			}
-		}
-
-		// reset scroll information.
-		this._needHScroll = this._needVScroll = false;
-
-		// ok, now we need to adjust the _blockBox's size according to the
-		// "overflow" setting.
-		// depends on different "overflow" style of this block, different sizing
-		// policy may apply.
-		// ICSSStyle style = this.getCSSStyle();
-		if (style != null) {
-			Object overflow = style
-					.getStyleProperty(ICSSPropertyID.ATTR_OVERFLOW);
-			if (ICSSPropertyID.VAL_HIDDEN.equals(overflow)) {
-				if (_userSpecifiedWidth > 0) {
-					_blockBox.setWidth(_userSpecifiedWidth);
-				}
-				if (_userSpecifiedHeight > 0) {
-					_blockBox.setHeight(_userSpecifiedHeight);
-				}
-			} else if (ICSSPropertyID.VAL_SCROLL.equals(overflow)
-					|| ICSSPropertyID.VAL_AUTO.equals(overflow)) {
-				// adjust _needHScroll and _needVScroll
-				if (_userSpecifiedWidth > 0
-						&& _userSpecifiedWidth < _blockBox.getWidth()) {
-					_needHScroll = true;
-				}
-				if (_userSpecifiedHeight > 0
-						&& _userSpecifiedHeight < _blockBox.getHeight()) {
-					_needVScroll = true;
-				}
-				if (_needHScroll && !_needVScroll) {
-					if (_userSpecifiedHeight > 0
-							&& _blockBox.getInternalContentHeight() >= 0
-							&& _userSpecifiedHeight < _blockBox
-									.getInternalContentHeight()
-									+ _blockBox.getPaddingInsets().getHeight()
-									+ BorderUtil.SCROLL_WIDTH) {
-						_needVScroll = true;
-					}
-				}
-				if (!_needHScroll && _needVScroll) {
-					if (_userSpecifiedWidth > 0
-							&& _blockBox.getInternalContentWidth() >= 0
-							&& _userSpecifiedWidth < _blockBox
-									.getInternalContentWidth()
-									+ _blockBox.getPaddingInsets().getWidth()
-									+ BorderUtil.SCROLL_WIDTH) {
-						_needHScroll = true;
-					}
-				}
-
-				if (_userSpecifiedWidth > 0) {
-					_blockBox.setWidth(_userSpecifiedWidth);
-				}
-				if (_userSpecifiedHeight > 0) {
-					_blockBox.setHeight(_userSpecifiedHeight);
-				}
-			}
-		}
-
-		if (getFlowContext().isCurrentLineOccupied()
-				&& getFlowContext().getCurrentLine().getAvailableWidth() < _blockBox._width
-						+ _blockBox.getMarginInsets().getWidth()) {
-			getFlowContext().endLine();
-		}
-		if (!isInlineBlock()) {
-			LineBox line = getFlowContext().getCurrentLine();
-			line.setHorizonalData(getCSSStyle().getStyleProperty(
-					ICSSPropertyID.ATTR_HORIZONTAL_ALIGN));
-			line.setHtmlInitData(getCSSStyle().getHTMLelementInitValue(
-					ICSSPropertyID.ATTR_HORIZONTAL_ALIGN));
-			line.add(_blockBox);
-			// getFlowContext().addToCurrentLine(_blockBox);
-		} else {
-			getFlowContext().addToCurrentLine(_blockBox);
-		}
-		getFlowContext().getCurrentLine().getMarginInsets().bottom = getCSSStyle()
-				.getMarginInsets().bottom;
-
-		if (!isInlineBlock()) {
-			getFlowContext().endLine();
-		}
-	}
-
-	/**
-	 * @param line
-	 */
-	protected void layoutLine(LineBox line) {
-		// currentLine.x = 0; //XXX: comment out, don't understand why set to 0,
-		// because it has already
-		// been set when setupLine(). And if do need, should
-		// set to getBorderPaddingInsets().left
-		// if (!isInlineBlock() && shouldExpand())
-		// {
-		// FIXME: currently we are using getRecommendedContentWidth,
-		// what happen if after adding the new line, the new width is bigger
-		// than
-		// recommendedContentWidth? should we use getWidth() instead of
-		// recommendedcontentWidth?
-		Object textalign = line.getHorizonalData();
-		if (textalign == null
-				|| ICSSPropertyMeta.NOT_SPECIFIED.equals(textalign)) {
-			textalign = (getCSSStyle()
-					.getStyleProperty(ICSSPropertyID.ATTR_TEXTALIGN));
-		}
-		if (textalign == null
-				|| ICSSPropertyMeta.NOT_SPECIFIED.equals(textalign)) {
-			textalign = line.getHtmlInitData();
-		}
-		if (ICSSPropertyID.VAL_RIGHT.equals(textalign)) {
-			line._x = _blockBox.getContentWidth() - line.getWidth();
-		} else if (ICSSPropertyID.VAL_CENTER.equals(textalign)) {
-			line._x = (_blockBox.getContentWidth() - line.getWidth()) / 2;
-		}
-
-		if (line._x < 0) {
-			line._x = 0;
-		}
-		line.commit();
-	}
-
-	/**
-	 * Adjust all fragments in the current line to have the same baseline. Do
-	 * any additional adjustments, such as horizontal alignment.
-	 */
-	protected void addCurrentLine() {
-		// The follow code is commented out, and moved into layoutLine(line)
-		// called by endBlock().
-		// since only when endBlock is called we really know how big is this
-		// block box, and then can
-		// do horizontal alignment.
-		// // currentLine.x = 0; //XXX: comment out, don't understand why set to
-		// 0, because it has already
-		// // been set when setupLine(). And if do need, should
-		// // set to getBorderPaddingInsets().left
-		// if (!isInlineBlock() && shouldExpand())
-		// {
-		// // FIXME: currently we are using getRecommendedContentWidth,
-		// // what happen if after adding the new line, the new width is bigger
-		// than
-		// // recommendedContentWidth? should we use getWidth() instead of
-		// // recommendedcontentWidth?
-		//
-		// Object textalign =
-		// (getCSSStyle().getStyleProperty(ICSSPropertyID.ATTR_TEXTALIGN));
-		// if (textalign == ICSSPropertyID.VAL_RIGHT)
-		// {
-		// _currentLine._x = _blockBox.getContentWidth() +
-		// _blockBox.getBorderPaddingInsets().left - _currentLine.getWidth();
-		// }
-		// else if (textalign == ICSSPropertyID.VAL_CENTER)
-		// {
-		//
-		// _currentLine._x = _blockBox.getBorderPaddingInsets().left +
-		// (_blockBox.getContentWidth() - _currentLine.getWidth()) / 2;
-		// }
-		// if (_currentLine._x < 0)
-		// _currentLine._x = 0;
-		// }
-		//
-		// // FIXME: should check vertical alignment here?
-		// _currentLine.commit();
-
-		// layoutLine(_currentLine);
-		_blockBox.add(_currentLine);
-	}
-
-	/**
-	 * @see FlowContainerLayout#flush()
-	 */
-	protected void flush() {
-		if (_currentLine != null && _currentLine.isOccupied()) {
-			addCurrentLine();
-		}
-		endBlock();
-	}
-
-	/**
-	 * @see FlowContainerLayout#cleanup()
-	 */
-	protected void cleanup() {
-		_currentLine = _previousLine = null;
-		_fontMetrices = null;
-	}
-
-	// ----------------------------------------------------------------------------------
-
-	/**
-	 * Override to setup the line's x, remaining, and available width.
-	 * 
-	 * @param line
-	 *            the LineBox to set up
-	 * @param topMargin 
-	 */
-	protected void setupLine(LineBox line, int topMargin) {
-		line.clear();
-
-		// the caller of getCurrentLine() may add leftMargin and leftPadding and
-		// leftBorder to line.x
-		line._x = 0;
-
-		// FIXME: here should check the floating boxes, and minus the width of
-		// them from
-		// current line.
-		line.setRecommendedWidth(_blockBox.getRecommendedContentWidth());
-		if (_previousLine == null) {
-			line._y = 0;
-			if (topMargin != Integer.MIN_VALUE) {
-				line._y += topMargin;
-			}
-		} else {
-			if (topMargin == Integer.MIN_VALUE) {
-				line._y = _previousLine._y + _previousLine.getHeight()
-						+ getLinePadding() + _previousLine.getMarginInsets().bottom; // XXX:
-				// should
-				// add
-				// previous
-				// margin
-				// bottom?
-			} else {
-				line._y = _previousLine._y
-						+ _previousLine.getHeight()
-						+ Math.max(topMargin,
-								_previousLine.getMarginInsets().bottom);
-			}
-		}
-		setFontinfoForLine(line);
-		// line.validate();
-	}
-
-	private void setFontinfoForLine(LineBox line) {
-
-		ICSSStyle style = getCSSStyle();
-		if (style != null) {
-			if (_fontMetrices == null) {
-				// as getSwtFont is resource consuming, so we cache the
-				// _fontMetrics.
-				_fontMetrices = FigureUtilities.getFontMetrics(style
-						.getCSSFont().getSwtFont());
-			}
-			line.setFontMetrics(_fontMetrices);
-		}
-	}
-
-	/**
-	 * @see FlowContainerLayout#createNewLine()
-	 */
-	protected void createNewLine() {
-		_currentLine = new LineBox();
-		setupLine(_currentLine, Integer.MIN_VALUE);
-	}
-
-	protected void createNewLine(int topmargin) {
-		_currentLine = new LineBox();
-		setupLine(_currentLine, topmargin);
-	}
-
-	/**
-	 * @see FlowContext#endLine()
-	 */
-	public void endLine() {
-		// this is called from child layouts.
-		// If there is no current line, state is equivalent to new line
-		if (_currentLine == null) {
-			return;
-		}
-		if (_currentLine.isOccupied()) {
-			addCurrentLine(); // finalize the current line layout
-		} else {
-			_currentLine = null;
-			return;
-		}
-
-		LineBox box = _currentLine;
-		// _currentLine = _previousLine; //XXX: ???? why (yang)
-		_previousLine = box;
-
-		_currentLine = null;
-		// setupLine(getCurrentLine());
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getCurrentY()
-	 */
-	public int getCurrentY() {
-		return getCurrentLine()._y; // FIXME: margin of previous block?
-	}
-
-	int getLinePadding() {
-		return 0;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSLayout#useLocalCoordinates()
-	 */
-	public boolean useLocalCoordinates() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#dispose()
-	 */
-	public void dispose() {
-		// 
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.ICSSLayout#getFragmentsForRead()
-	 */
-	public List getFragmentsForRead() {
-		List r = new ArrayList(1);
-		r.add(_blockBox);
-		return r;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.ICSSLayout#postValidate()
-	 */
-	public void postValidate() {
-
-		Rectangle r = new Rectangle(_blockBox._x, _blockBox._y, _blockBox
-				.getWidth(), _blockBox.getHeight());
-		getCSSFigure().setBounds(r);
-		List list = getCSSFigure().getChildren();
-		for (int i = 0; i < list.size(); i++) {
-			((FlowFigure) list.get(i)).postValidate();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getContainerWidth()
-	 */
-	public int getContainerWidth() {
-		int width = Math.max(0, Math.max(_blockBox.getWidth(), _blockBox
-				.getRecommendedWidth()));
-		return width;
-	}
-
-	/**
-	 * when the "overflow" is "scroll", we need to paint the scrollbar
-	 */
-	public void paintFigurePostClientArea(Graphics g) {
-		ICSSStyle style = this.getCSSStyle();
-		if (style != null) {
-			Object overflow = style
-					.getStyleProperty(ICSSPropertyID.ATTR_OVERFLOW);
-			if (ICSSPropertyID.VAL_SCROLL.equals(overflow)
-					|| ICSSPropertyID.VAL_AUTO.equals(overflow)) {
-				if (this._needHScroll || this._needVScroll) {
-					// as this is using localCoordinate, so translate to
-					// relative to left/up corder of whole
-					// blockbox.
-					g.translate(-_blockBox.getBorderPaddingInsets().left,
-							-_blockBox.getBorderPaddingInsets().top);
-
-					Rectangle rect = new Rectangle(0, 0, _blockBox.getWidth(),
-							_blockBox.getHeight());
-					rect.crop(_blockBox.getBorderInsets());
-
-					if (this._needHScroll && this._needVScroll) {
-						BorderUtil.drawScrollBar(g, BorderUtil.SCROLL_WIDTH,
-								rect, BorderUtil.BOTH);
-					} else if (this._needHScroll) {
-						BorderUtil.drawScrollBar(g, BorderUtil.SCROLL_WIDTH,
-								rect, BorderUtil.HORIZONTAL_BAR);
-					} else if (this._needVScroll) {
-						BorderUtil.drawScrollBar(g, BorderUtil.SCROLL_WIDTH,
-								rect, BorderUtil.VERTICAL_BAR);
-					}
-				}
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSBrFlowLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSBrFlowLayout.java
deleted file mode 100644
index 19ef939..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSBrFlowLayout.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.List;
-
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @author mengbo
- */
-public class CSSBrFlowLayout extends CSSInlineFlowLayout implements ICSSPainter {
-	/**
-	 * @param flow
-	 */
-	public CSSBrFlowLayout(CSSFigure flow) {
-		super(flow);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSInlineFlowLayout#flush()
-	 */
-	protected void flush() {
-		FlowBox forcedBox = new FlowBox();
-		forcedBox.setWidth(16);
-		forcedBox.setHeight(getCSSStyle().getCSSFont().getXHeight());
-		addToCurrentLine(forcedBox);
-		endLine();
-
-		FlowBox flowbox = new FlowBox();
-		flowbox.setHeight(getCSSStyle().getCSSFont().getFontSize());
-		getCurrentLine().add(flowbox);
-
-		super.flush();
-	}
-
-	public void paintFigure(Graphics g) {
-		List fragments = getFragmentsForRead();
-		if (!fragments.isEmpty()) {
-			FlowBox box = (FlowBox) fragments.get(0);
-			g.drawImage(getSharedHTMLImage(), new Point(box._x, box._y));
-		}
-	}
-
-	private static Image getSharedHTMLImage() {
-		
-		return PDPlugin.getDefault().getImage("LineBreak.gif");
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSFigure.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSFigure.java
deleted file mode 100644
index a6c5289..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSFigure.java
+++ /dev/null
@@ -1,525 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.List;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.LayoutManager;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.border.CSSBorder;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.property.VisibilityMeta;
-import org.eclipse.jst.pagedesigner.css2.style.DefaultStyle;
-import org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo;
-import org.eclipse.jst.pagedesigner.css2.widget.BorderUtil;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.RGB;
-
-/**
- * Normally a CSSFigure is a container. It's layout will be driven by different
- * display type information from the style.
- * 
- * Each CSSFigure will be driven by ICSSStyle, the display type of the ICSSStyle
- * will decide the layout to be used for the figure.
- * 
- * @author mengbo
- */
-public class CSSFigure extends FlowFigure implements ICSSFigure {
-	private static Logger _log = PDPlugin.getLogger(CSSFigure.class);
-
-	private static final Rectangle PRIVATE_RECT = new Rectangle();
-
-	private ICSSStyle _style;
-
-	// if this field is set, then regetLayout() will still return this layout,
-	// without going through the CSS resolution
-	private CSSLayout _fixedLayout;
-
-	/**
-	 * Default constructor 
-	 * Equivalent to CSSFigure(DefaultStyle.getInstance())
-	 */
-	public CSSFigure() {
-		this(DefaultStyle.getInstance());
-	}
-
-	/**
-	 * @param style
-	 */
-	public CSSFigure(ICSSStyle style) {
-		_style = style;
-		invalidateCSS();
-	}
-
-	public ICSSStyle getCSSStyle() {
-		return _style;
-	}
-
-	/**
-	 * @param style
-	 */
-	public void setCSSStyle(ICSSStyle style) {
-		_style = style;
-		invalidateCSS();
-	}
-
-	public void revalidate() {
-		CSSLayout layout = (CSSLayout) getLayoutManager();
-		layout.figureRevalidate();
-		super.revalidate();
-	}
-
-	/**
-	 * this method is called when the css source noticed style change. So tell
-	 * the figure should invalidate its cached data.
-	 */
-	public void invalidateCSS() {
-		// maybe we changed from inline to block or block to inline
-		// XXX: or even to table?
-		CSSLayout layout = regetLayout(getLayoutManager());
-		this.setLayoutManager(layout);
-	}
-
-	/**
-	 * @param layout
-	 */
-	public void setFixedLayoutManager(CSSLayout layout) {
-		this._fixedLayout = layout;
-		this.setLayoutManager(regetLayout(getLayoutManager()));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Figure#setLayoutManager(org.eclipse.draw2d.LayoutManager)
-	 */
-	public void setLayoutManager(LayoutManager manager) {
-		LayoutManager old = getLayoutManager();
-		if (old != manager) {
-			FlowContext context = null;
-			if (old instanceof FlowFigureLayout) {
-				context = ((FlowFigureLayout) old).getOriginalFlowContext();
-			}
-			if (manager instanceof FlowFigureLayout) {
-				((FlowFigureLayout) manager).setOriginalFlowContext(context);
-			}
-
-			if (manager instanceof FlowContext) {
-				List list = getChildren();
-				for (int i = 0, size = list.size(); i < size; i++) {
-					try {
-						((FlowFigure) list.get(i))
-								.setOriginalFlowContext((FlowContext) manager);
-					} catch (ClassCastException classcastexception) {
-						// Error in flowContext setting.
-						_log.error("Error.CSSFigure.0", classcastexception); //$NON-NLS-1$
-					}
-				}
-			}
-		}
-		super.setLayoutManager(manager);
-	}
-
-	/**
-	 * @param old
-	 * @return the layout
-	 */
-	protected CSSLayout regetLayout(LayoutManager old) {
-		if (_fixedLayout != null) {
-			return _fixedLayout;
-		}
-		CSSLayout layout = DisplayToLayout.displayToLayout(this, getCSSStyle()
-				.getDisplay(), old);
-		if (layout != null) {
-			return layout;
-		}
-        return new CSSInlineFlowLayout(this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Figure#containsPoint(int, int)
-	 */
-	public boolean containsPoint(int x, int y) {
-		// check whether any float figure contains it.
-		// FIXME: need check floating figure here!!!
-		if (!super.containsPoint(x, y)) {
-			return false;
-		}
-		List frags = getFragmentsForRead();
-		// Here we should not get void pointer.
-		if (frags != null) {
-			for (int i = 0; i < frags.size(); i++) {
-				FlowBox box = (FlowBox) frags.get(i);
-				if (box != null && box.containsPoint(x, y)) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.ICSSFigure#getFragmentsForRead()
-	 */
-	public List getFragmentsForRead() {
-		CSSLayout layout = (CSSLayout) getLayoutManager();
-		return layout.getFragmentsForRead();
-	}
-
-	/**
-	 * this method is a shortcut to getFragmentsForRead
-	 * 
-	 * @return fragment bounds
-	 */
-	public Rectangle[] getFragmentsBounds() {
-		List list = getFragmentsForRead();
-		if (list == null || list.size() == 0) {
-			// should not happen. but still handle it.
-			return new Rectangle[] { getBounds() };
-		}
-        Rectangle[] ret = new Rectangle[list.size()];
-        for (int i = 0, size = list.size(); i < size; i++) {
-        	FlowBox box = (FlowBox) list.get(i);
-        	ret[i] = new Rectangle(box._x, box._y, box.getWidth(), box
-        			.getHeight());
-        }
-        return ret;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.IFigure#setBounds(org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void setBounds(Rectangle r) {
-		if (getBounds().equals(r)) {
-			return;
-		}
-		boolean invalidate = getBounds().width != r.width
-				|| getBounds().height != r.height;
-		super.setBounds(r);
-
-		CSSLayout layout = (CSSLayout) this.getLayoutManager();
-		layout.setBoundsCalled(r, invalidate);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigure#postValidate()
-	 */
-	public void postValidate() {
-		CSSLayout layout = (CSSLayout) getLayoutManager();
-		layout.postValidateForAbsolute();
-		layout.postValidate();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.IFigure#validate()
-	 */
-	public void validate() {
-		super.validate();
-		// should not call this.postValidate() here. PostValidate() should
-		// only be started from the FlowPage. Otherwise it will be called
-		// multiple times on a figure.
-		// this.postValidate();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Figure#useLocalCoordinates()
-	 */
-	protected boolean useLocalCoordinates() {
-		CSSLayout layout = (CSSLayout) getLayoutManager();
-		if (layout == null) {
-			return false;
-		}
-        return layout.useLocalCoordinates();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.IFigure#paint(org.eclipse.draw2d.Graphics)
-	 */
-	public void paint(Graphics graphics) {
-		ICSSStyle style = getCSSStyle();
-		if (style != null) {
-			Object visibility = style
-					.getStyleProperty(ICSSPropertyID.ATTR_VISIBILITY);
-			// handle visibility: hidden here.
-			// TODO: "collapse" is not supported yet!
-			if (VisibilityMeta.HIDDEN.equals(visibility)) {
-				return;
-			}
-		}
-
-		CSSLayout layout = (CSSLayout) this.getLayoutManager();
-		graphics.pushState();
-		try {
-			paintFigure(graphics);
-			graphics.restoreState();
-			paintClientArea(graphics);
-			if (layout instanceof ICSSPainter2) {
-				if (useLocalCoordinates()) {
-					graphics.translate(getBounds().x + getInsets().left,
-							getBounds().y + getInsets().top);
-					((ICSSPainter2) layout).paintFigurePostClientArea(graphics);
-					graphics.restoreState();
-				} else {
-					((ICSSPainter2) layout).paintFigurePostClientArea(graphics);
-				}
-			}
-			paintBorder(graphics);
-		} finally {
-			graphics.popState();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigure#paintFigure(org.eclipse.draw2d.Graphics)
-	 */
-	protected void paintFigure(Graphics g) {
-		Color rgbColor = null;
-		boolean fillArea = false;
-		Object bg = getCSSStyle().getBackgroundColor();
-		if (bg instanceof RGB) {
-			rgbColor = new Color(null, (RGB) bg);
-			g.setBackgroundColor(rgbColor);
-			fillArea = true;
-		} else if (bg instanceof Color) {
-			g.setBackgroundColor((Color) bg);
-			fillArea = true;
-		}
-		if (fillArea) {
-			List fragments = getFragmentsForRead();
-
-			for (int i = 0, n = fragments.size(); i < n; i++) {
-				Object obj = fragments.get(i);
-				if (obj instanceof FlowBox) {
-					FlowBox box = (FlowBox) obj;
-					g.fillRectangle(box._x, box._y, box.getWidth(), box
-							.getHeight());
-				}
-			}
-		}
-		if (rgbColor != null) {
-			rgbColor.dispose();
-		}
-		g.restoreState();
-
-		LayoutManager layout = getLayoutManager();
-		if (layout instanceof ICSSPainter) {
-			if (useLocalCoordinates()) {
-				g.translate(getBounds().x + getInsets().left, getBounds().y
-						+ getInsets().top);
-				((ICSSPainter) layout).paintFigure(g);
-				g.restoreState();
-			} else {
-				((ICSSPainter) layout).paintFigure(g);
-			}
-		}
-
-		// paint selected mode here.
-		paintSelection(g);
-
-		if (Debug.DEBUG_BOX) {
-			// draw two levels of boxes. Since normally each figure will only
-			// have two levels of boxes.
-			List fragments = this.getFragmentsForRead();
-			for (int i = 0, size = fragments.size(); i < size; i++) {
-				FlowBox box = (FlowBox) fragments.get(i);
-				BoxUtil.drawBox(g, box);
-				if (box instanceof BlockBox) {
-					BlockBox compositeBox = (BlockBox) box;
-					List list = compositeBox.getFragments();
-					for (int j = 0; j < list.size(); j++) {
-						g.translate(this.getInsets().left,
-								this.getInsets().right);
-						BoxUtil.drawBox(g, (FlowBox) list.get(j));
-						g.restoreState();
-					}
-				}
-			}
-		}
-		if (Debug.DEBUG_BASELINE) {
-			List fragments = this.getFragmentsForRead();
-			for (int i = 0, size = fragments.size(); i < size; i++) {
-				Object obj = fragments.get(i);
-				if (obj instanceof LineBox) {
-					LineBox linebox = (LineBox) obj;
-					g.setForegroundColor(ColorConstants.red);
-					g.drawLine(linebox._x, linebox._y + linebox.getAscent(),
-							linebox._x + linebox.getWidth(), linebox._y
-									+ linebox.getAscent());
-				}
-			}
-		}
-
-		if (Debug.DEBUG_BORDERPADDING) {
-			if (this.getLayoutManager() instanceof CSSBlockFlowLayout) {
-				g.setLineWidth(1);
-				Rectangle rect = getBounds().getCopy().crop(getInsets());
-				g.setForegroundColor(ColorConstants.green);
-				g.drawRectangle(rect);
-				g.setForegroundColor(ColorConstants.red);
-				g.drawRectangle(getBounds());
-			}
-		}
-
-		if (Debug.DEBUG_BOX) {
-			CSSLayout csslayout = (CSSLayout) this.getLayoutManager();
-			if (csslayout.getAbsoluteContext() != null) {
-				BlockBox blockbox = csslayout.getAbsoluteContext()._blockBox;
-				g.setLineWidth(1);
-				g.setForegroundColor(ColorConstants.green);
-				g.drawRectangle(blockbox._x, blockbox._y, blockbox.getWidth(),
-						blockbox.getHeight());
-			}
-		}
-	}
-
-	/**
-	 * Paints this Figure's client area. The client area is typically defined as
-	 * the anything inside the Figure's {@link org.eclipse.draw2d.Border} or {@link org.eclipse.draw2d.geometry.Insets}, and
-	 * by default includes the children of this Figure. On return, this method
-	 * must leave the given Graphics in its initial state.
-	 * 
-	 * @param graphics
-	 *            The Graphics used to paint
-	 * @since 2.0
-	 */
-	protected void paintClientArea(Graphics graphics) {
-		if (this.getChildren().isEmpty()) {
-			return;
-		}
-
-		Object overflow = ICSSPropertyID.VAL_VISIBLE;
-		ICSSStyle style = this.getCSSStyle();
-		if (style != null) {
-			overflow = style.getStyleProperty(ICSSPropertyID.ATTR_OVERFLOW);
-		}
-
-		boolean optimizeClip = ICSSPropertyID.VAL_VISIBLE.equals(overflow);
-
-		if (useLocalCoordinates()) {
-			graphics.translate(getBounds().x + getInsets().left, getBounds().y
-					+ getInsets().top);
-			if (!optimizeClip) {
-				graphics.clipRect(getClientArea(PRIVATE_RECT));
-			}
-			graphics.pushState();
-			paintChildren(graphics);
-			graphics.popState();
-			graphics.restoreState();
-		} else {
-			if (optimizeClip) {
-				paintChildren(graphics);
-			} else {
-				graphics.clipRect(getClientArea(PRIVATE_RECT));
-				graphics.pushState();
-				paintChildren(graphics);
-				graphics.popState();
-				graphics.restoreState();
-			}
-		}
-	}
-
-	/**
-	 * @param g
-	 */
-	protected void paintSelection(Graphics g) {
-		ICSSStyle style = this.getCSSStyle();
-		if (style != null) {
-			if (style.isInSelection()) {
-				ITagEditInfo editInfo = (ITagEditInfo) style
-						.getAdapter(ITagEditInfo.class);
-				if (editInfo != null && editInfo.isWidget()) {
-					BorderUtil.maskFigure(this, g);
-				}
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Figure#paintBorder(org.eclipse.draw2d.Graphics)
-	 */
-	protected void paintBorder(Graphics graphics) {
-		CSSLayout layout = (CSSLayout) getLayoutManager();
-		if (layout != null && !layout.handlingBorderForBlock()) {
-			return;
-		}
-
-		ICSSStyle style = this.getCSSStyle();
-		if (style != null) {
-			CSSBorder border1 = new CSSBorder(this.getCSSStyle());
-			border1.paint(this, graphics, NO_INSETS);
-
-			// draw a border for those special elements like <h:form>, etc.
-			ITagEditInfo editInfo = (ITagEditInfo) style
-					.getAdapter(ITagEditInfo.class);
-			if (editInfo != null && editInfo.needBorderDecorator()) {
-				BorderUtil.drawBorderDecorator(this, graphics);
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.IFigure#getInsets()
-	 */
-	public Insets getInsets() {
-		CSSLayout layout = (CSSLayout) getLayoutManager();
-		if (layout != null && !layout.handlingBorderForBlock()) {
-			return new Insets();
-		}
-		ICSSStyle style = this.getCSSStyle();
-		if (style != null) {
-			return style.getBorderInsets().getAdded(style.getPaddingInsets());
-		}
-		return new Insets();
-	}
-
-	/**
-	 * FIXME: need trace the implementation of Figure.invalidate() We want to
-	 * just mark this figure as invalid, but don't want to the layout get
-	 * invalidated.
-	 * 
-	 */
-	public void invalidate2() {
-		if (!isValid())
-			return;
-		// if (getLayoutManager() != null)
-		// getLayoutManager().invalidate();
-		setValid(false);
-
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSInlineFlowLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSInlineFlowLayout.java
deleted file mode 100644
index 39ddf89..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSInlineFlowLayout.java
+++ /dev/null
@@ -1,320 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo;
-
-/**
- * The layout manager for {@link CSSFigure}figures. This class is based on
- * InlineFlowLayout of draw2d.
- * 
- * @author mengbo
- */
-public class CSSInlineFlowLayout extends CSSLayout {
-	List _fragments = new ArrayList();
-
-	/**
-	 * Creates a new InlineFlowLayout with the given FlowFigure.
-	 * 
-	 * @param flow
-	 *            The FlowFigure
-	 */
-	public CSSInlineFlowLayout(CSSFigure flow) {
-		super(flow);
-	}
-
-	/**
-	 * Clears out all fragments prior to the call to layoutChildren().
-	 */
-	public void preLayout() {
-		super.preLayout();
-		_fragments.clear();
-		// force creating of the first line. avoid empty element don't have
-		// fragments.
-		// createFirstLine();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContainerLayout#layoutChildren()
-	 */
-	protected void layoutChildren() {
-		// For designer, to make it to have some size. otherwise can't
-		// be found on screen.
-		// List children = getCSSFigure().getChildren();
-		// if (children.size() == 0)
-		// {
-		// FlowBox box = new FlowBox();
-		// box._height = getCSSStyle().getCSSFont().getFontSize();
-		// box._width = 2;
-		// addToCurrentLine(box);
-		//
-		// }
-		super.layoutChildren();
-	}
-
-	/**
-	 * Adds the given FlowBox to the current line of this InlineFlowLayout.
-	 * 
-	 * @param block
-	 *            the FlowBox to add to the current line
-	 */
-	public void addToCurrentLine(FlowBox block) {
-		getCurrentLine().add(block);
-		// XXX: ???: will currentLine be added multiple times to fragments?
-		// (yang)
-		// _fragments.add(_currentLine);
-	}
-
-	private void createFirstLine() {
-		_currentLine = new LineBox();
-		setupLine(_currentLine, true);
-		_fragments.add(_currentLine);
-	}
-
-	/**
-	 * @see FlowContainerLayout#createNewLine()
-	 */
-	protected void createNewLine() {
-		_currentLine = new LineBox();
-		setupLine(_currentLine, false);
-		_fragments.add(_currentLine);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContainerLayout#createNewLine(int)
-	 */
-	protected void createNewLine(int topMargin) {
-		// inline flow don't support vertical margin.
-		createNewLine();
-	}
-
-	/**
-	 * @see FlowContainerLayout#cleanup()
-	 */
-	protected void cleanup() {
-		_currentLine = null;
-	}
-
-	/**
-	 * @see FlowContainerLayout#flush()
-	 */
-	protected void flush() {
-		if (_fragments.isEmpty()) {
-			createFirstLine();
-		} else if (_fragments.size() == 1) {
-
-			ICSSStyle style = getCSSStyle();
-			int minWidth = 0, minHeight = 0;
-			// try to see whether there is any designer specified min size
-			ITagEditInfo info = (ITagEditInfo) style
-					.getAdapter(ITagEditInfo.class);
-			if (info != null) {
-				minWidth = info.getMinWidth();
-				minHeight = info.getMinHeight();
-			}
-			FlowBox box = (FlowBox) _fragments.get(0);
-			if (minWidth > box._width) {
-				box._width = minWidth;
-			}
-			if (minHeight > box._height) {
-				box._height = minHeight;
-			}
-		}
-
-		if (_currentLine != null /* && _currentLine.isOccupied() */) {
-			_currentLine.getMarginInsets().right = getCSSStyle().getMarginInsets().right;
-			getFlowContext().addToCurrentLine(_currentLine);
-		}
-
-	}
-
-	/**
-	 * @see FlowContext#endLine()
-	 */
-	public void endLine() {
-		if (_currentLine == null) {
-			getFlowContext().endLine();
-			return;
-		}
-		// If nothing was ever placed in the line, ignore it. and if the line is
-		// the first line, just remove it.
-		if (_currentLine.isOccupied()) {
-			getFlowContext().addToCurrentLine(_currentLine);
-		} else if (_fragments.size() == 1) {
-			_fragments.remove(0);
-		}
-		getFlowContext().endLine();
-		_currentLine = null;
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getCurrentY()
-	 */
-	public int getCurrentY() {
-		return getCurrentLine()._y;
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContainerLayout#isCurrentLineOccupied()
-	 */
-	public boolean isCurrentLineOccupied() {
-		if (_currentLine == null) {
-			return getFlowContext().isCurrentLineOccupied();
-		} else if (_currentLine.getFragments().isEmpty()) {
-			return getFlowContext().isCurrentLineOccupied();
-		} else {
-			return true;
-		}
-	}
-
-	/**
-	 * Initializes the given LineBox. Called by createNewLine().
-	 * 
-	 * @param line
-	 *            The LineBox to initialize.
-	 * @param firstline 
-	 */
-	protected void setupLine(LineBox line, boolean firstline) {
-		LineBox parent = getFlowContext().getCurrentLine();
-		line._x = 0;
-		line._y = getFlowContext().getCurrentY();
-
-		line.setRecommendedWidth(parent.getAvailableWidth());
-
-		setLineVerticalAlign(line);
-		setFontinfoForLine(line);
-
-		if (firstline && getCSSStyle() != null) {
-			ICSSStyle style = getCSSStyle();
-			int minWidth = 0, minHeight = 0;
-			// try to see whether there is any designer specified min size
-			ITagEditInfo info = (ITagEditInfo) style
-					.getAdapter(ITagEditInfo.class);
-			if (info != null) {
-				minWidth = info.getMinWidth();
-				minHeight = info.getMinHeight();
-			}
-
-			// // CSS also has the min-width/min-height property. We should also
-			// get that,
-			// // and using the max of the "min-width" css property and the
-			// designer specified min size.
-			// int height =
-			// getLengthValue(style,ICSSPropertyID.ATTR_MIN_HEIGHT);
-			// if(height > minHeight)
-			// {
-			// minHeight = height;
-			// }
-			// int width = getLengthValue(style,ICSSPropertyID.ATTR_MIN_WIDTH);
-			// if(width > minWidth)
-			// {
-			// minWidth = width;
-			// }
-			if (minWidth > 0) {
-				line.setWidth(minWidth);
-			}
-			int fontHeight = this.getCSSStyle().getCSSFont().getXHeight();
-			if (minHeight > 0 && minHeight > fontHeight) {
-				line.setHeight(minHeight);
-			} else {
-				line.setHeight(fontHeight);
-			}
-		}
-	}
-
-	private void setLineVerticalAlign(LineBox box) {
-		ICSSStyle style = getCSSStyle();
-		if (style != null) {
-			box.setVerticalAlignData(style
-					.getStyleProperty(ICSSPropertyID.ATTR_VERTICAL_ALIGN));
-		}
-	}
-
-	private void setFontinfoForLine(LineBox line) {
-
-		ICSSStyle style = getCSSStyle();
-		if (style != null) {
-			line.setFontMetrics(FigureUtilities.getFontMetrics(style
-					.getCSSFont().getSwtFont()));
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#dispose()
-	 */
-	public void dispose() {
-		// 
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.ICSSLayout#getFragmentsForRead()
-	 */
-	public List getFragmentsForRead() {
-		return _fragments;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.ICSSLayout#postValidate()
-	 */
-	public void postValidate() {
-		List list = _fragments;
-
-		FlowBox box;
-		int left = Integer.MAX_VALUE, top = left;
-		int right = Integer.MIN_VALUE, bottom = right;
-		for (int i = 0; i < list.size(); i++) {
-			box = (FlowBox) list.get(i);
-			// if (box instanceof LineBox && !((LineBox) box).isOccupied())
-			// {
-			// continue; // skip unoccupied line
-			// }
-			left = Math.min(left, box._x);
-			right = Math.max(right, box._x + box._width);
-			top = Math.min(top, box._y);
-			bottom = Math.max(bottom, box._y + box._height);
-		}
-		getCSSFigure().setBounds(
-				new Rectangle(left, top, right - left, bottom - top));
-		list = getCSSFigure().getChildren();
-		for (int i = 0; i < list.size(); i++) {
-			((FlowFigure) list.get(i)).postValidate();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getContainerWidth()
-	 */
-	public int getContainerWidth() {
-		// FIXME: don't really understand what means for inline
-		return this.getFlowContext().getContainerWidth();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSLayout.java
deleted file mode 100644
index 9683a34..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSLayout.java
+++ /dev/null
@@ -1,477 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.List;
-
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.property.PositionMeta;
-import org.eclipse.jst.pagedesigner.css2.property.VerticalAlignMeta;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-
-/**
- * CSSLayout is the base layout manager for different CSS layouts, such as block
- * layout, inline layout (possible in the future table layout, etc)
- * 
- * @author mengbo
- */
-public abstract class CSSLayout extends FlowFigureLayout implements FlowContext {
-	private BlockFlowContext _absoluteContext;
-
-	// when doing absolute layout, and if top/left are both "auto", it will be
-	// relating to the normaly flow position. The following two fields try to
-	// catch normal flow layout position.
-	// int _xForAbsolute;
-	// int _yForAbsolute;
-	private FlowBox _boxForAbsolute;
-
-	/**
-	 * the current line
-	 */
-	protected LineBox _currentLine;
-
-	private boolean _calculatingMaxWidth = false;
-
-	/**
-	 * @param flowFigure 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#FlowFigureLayout(FlowFigure)
-	 */
-	protected CSSLayout(CSSFigure flowFigure) {
-		super(flowFigure);
-	}
-
-	/**
-	 * a shortcut method to get the style associated with the figure.
-	 * 
-	 * @return the css style
-	 */
-	public ICSSStyle getCSSStyle() {
-		return getCSSFigure().getCSSStyle();
-	}
-
-	/**
-	 * @return the absolute context
-	 */
-	protected final BlockFlowContext getAbsoluteContext() {
-        return _absoluteContext;
-    }
-
-    /**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#addToCurrentLine(FlowBox)
-	 */
-	public void addToCurrentLine(FlowBox block) {
-		getCurrentLine().add(block);
-	}
-
-	/**
-	 * Used by getCurrentLine().
-	 */
-	protected abstract void createNewLine();
-
-	/**
-	 * Used by getCurrentLine(int topmargin)
-	 * 
-	 * @param topMargin
-	 */
-	protected void createNewLine(int topMargin) {
-		createNewLine();
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getCurrentLine()
-	 */
-	public LineBox getCurrentLine() {
-		if (_currentLine == null) {
-			createNewLine();
-		}
-		return _currentLine;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getCurrentLine(int)
-	 */
-	public LineBox getCurrentLine(int topMargin) {
-		if (_currentLine == null) {
-			createNewLine(topMargin);
-		}
-		// if the current line only contains an empty string, reset the current
-		// line using the given margin.
-		else if (_currentLine.isEmptyStringLine()) {
-			List list = _currentLine.getFragments();
-			createNewLine(topMargin);
-			_currentLine._fragments.addAll(list);
-		}
-		return _currentLine;
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#isCurrentLineOccupied
-	 */
-	public boolean isCurrentLineOccupied() {
-		return _currentLine != null && _currentLine.isOccupied();
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#layout()
-	 */
-	protected void layout() {
-		preLayout();
-		layoutChildren();
-		flush();
-		cleanup();
-	}
-
-	/**
-	 * @return true if is absolute position
-	 */
-	protected final boolean isAbsolutePosition() {
-		ICSSStyle style = getCSSStyle();
-
-		// FIXME: Some layout don't support absolute, need check here
-		if (style != null) {
-			Object obj = style.getStyleProperty(ICSSPropertyID.ATTR_POSITION);
-			if (PositionMeta.ABSOLUTE.equals(obj)
-					|| PositionMeta.FIXED.equals(obj)) {
-				return supportAbsolutePosition();
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Child class could override this method.
-	 * 
-	 * @return true if supports absolute position  
-	 */
-	protected boolean supportAbsolutePosition() {
-		if (findContainingPositionedFigure() == null) {
-			return false;
-		}
-		return true;
-	}
-
-	/**
-	 * Perform a prelayout
-	 */
-	protected void preLayout() {
-		ICSSStyle style = this.getCSSStyle();
-		if (style != null) {
-			style.processCounters();
-		}
-
-		if (isAbsolutePosition()) {
-			FlowContext parentFigureContext = getParentFigureContext();
-			_absoluteContext = new BlockFlowContext(parentFigureContext, style);
-			_boxForAbsolute = new FlowBox();// size is 0. Just as a flag, so
-			// later we
-			// could figure out where will this figure be
-			// be put in case of not absolute
-			_boxForAbsolute.setVerticalAlignData(VerticalAlignMeta.TOP);
-			parentFigureContext.addToCurrentLine(_boxForAbsolute);
-		} else {
-			_absoluteContext = null;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#getFlowContext()
-	 */
-	public FlowContext getFlowContext() {
-		if (_absoluteContext != null) {
-			return _absoluteContext;
-		}
-        return getOriginalFlowContext();
-	}
-
-	/**
-	 * @return the flow context
-	 */
-	private FlowContext getParentFigureContext() {
-		return super.getFlowContext();
-	}
-
-	final void postValidateForAbsolute() {
-		if (_absoluteContext != null) {
-			ICSSStyle style = this.getCSSStyle();
-
-			_absoluteContext.endBlock();
-
-			int xOffset;
-			int yOffset;
-
-			ICSSFigure containingPositionedFigure = findContainingPositionedFigure();
-			IFigure parentFigure = this.getCSSFigure().getParent();
-
-			xOffset = calculatePositionRelativeToParent(style,
-					containingPositionedFigure, parentFigure, true);
-			yOffset = calculatePositionRelativeToParent(style,
-					containingPositionedFigure, parentFigure, false);
-			move(_absoluteContext._blockBox, xOffset, yOffset);
-		}
-	}
-
-	/**
-	 * @param style
-	 * @param containingPositionedFigure
-	 * @param parentFigure
-	 * @return
-	 */
-	private int calculatePositionRelativeToParent(ICSSStyle style,
-			ICSSFigure containingPositionedFigure, IFigure parentFigure,
-			boolean horizontal) {
-		int xOffset;
-		Object left = horizontal ? style
-				.getStyleProperty(ICSSPropertyID.ATTR_LEFT) : style
-				.getStyleProperty(ICSSPropertyID.ATTR_TOP);
-		Object right = horizontal ? style
-				.getStyleProperty(ICSSPropertyID.ATTR_RIGHT) : style
-				.getStyleProperty(ICSSPropertyID.ATTR_BOTTOM);
-
-		if (!(left instanceof Length) && !(right instanceof Length)) {
-			// _boxForAbsolute partipated the layout of the parent figure, and
-			// is already relative to parent.
-			return horizontal ? _boxForAbsolute._x : _boxForAbsolute._y;
-		}
-
-		// ok, user specified left or right. let's calculate the left
-		int leftValue;
-		if (left instanceof Length) {
-			Length leftLength = (Length) left;
-			leftValue = leftLength.getValue();
-			if (leftLength.isPercentage()) {
-				leftValue = (horizontal ? containingPositionedFigure
-						.getBounds().width : containingPositionedFigure
-						.getBounds().height)
-						* leftValue / 100;
-			}
-		} else {
-			Length rightLength = (Length) right;
-			int lengthValue = rightLength.getValue();
-			if (rightLength.isPercentage()) {
-				lengthValue = (horizontal ? containingPositionedFigure
-						.getBounds().width : containingPositionedFigure
-						.getBounds().height)
-						* lengthValue / 100;
-			}
-
-			if (horizontal) {
-				leftValue = containingPositionedFigure.getBounds().width
-						- _absoluteContext._blockBox.getWidth() - lengthValue;
-			} else {
-				leftValue = containingPositionedFigure.getBounds().height
-						- _absoluteContext._blockBox.getHeight() - lengthValue;
-			}
-
-		}
-
-		// xOffset is relative to the first box of the containing figure
-		List fragments = containingPositionedFigure
-				.getFragmentsForRead();
-		if (fragments.size() > 0) {
-			FlowBox box = (FlowBox) fragments.get(0);
-			// box._x is the x location relative to containingPositionedFigure's
-			// parent.
-			// so now xOffset is relative to containingPositionedFigure's
-			// parent.
-			xOffset = (horizontal ? box._x : box._y) + leftValue;
-		} else {
-			xOffset = leftValue; // should not happen.
-		}
-		Point p;
-		if (horizontal) {
-			p = new Point(xOffset, 0);
-		} else {
-			p = new Point(0, xOffset);
-		}
-		containingPositionedFigure.translateFromParent(p);
-		containingPositionedFigure.translateToAbsolute(p);
-		parentFigure.translateToRelative(p);
-		return horizontal ? p.x : p.y;
-	}
-
-	/**
-	 * @return
-	 */
-	private ICSSFigure findContainingPositionedFigure() {
-		IFigure figure = this.getCSSFigure().getParent();
-		while (figure instanceof ICSSFigure) {
-			return (ICSSFigure) figure;
-			// ICSSStyle style = ((ICSSFigure) figure).getCSSStyle();
-			// if (DisplayToLayout.isPositioned(style))
-			// {
-			// return (ICSSFigure) figure;
-			// }
-			// figure = figure.getParent();
-		}
-		return null;
-
-	}
-
-	/**
-	 * @param resultBox
-	 * @param x
-	 * @param y
-	 */
-	private void move(CompositeBox compBox, int x, int y) {
-		compBox._x += x;
-		compBox._y += y;
-		List list = compBox.getFragments();
-		for (int i = 0; i < list.size(); i++) {
-			FlowBox box = (FlowBox) list.get(i);
-
-			if (box instanceof CompositeBox && !(box instanceof BlockBox)) {
-				move((CompositeBox) box, x, y);
-			} else {
-				box._x += x;
-				box._y += y;
-			}
-		}
-	}
-
-	/**
-	 * Layout all children.
-	 */
-	protected void layoutChildren() {
-		List children = getFlowFigure().getChildren();
-		for (int i = 0; i < children.size(); i++) {
-			Figure f = (Figure) children.get(i);
-			f.invalidate();
-			f.validate();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getLastMarginRight()
-	 */
-	public int getLastMarginRight() {
-		if (_currentLine == null || !_currentLine.isOccupied()) {
-			return 0;
-		}
-		FlowBox box = (FlowBox) _currentLine.getFragments().get(
-				_currentLine.getFragments().size() - 1);
-		if (box != null) {
-			return box.getMarginInsets().right;
-		}
-        return 0;
-	}
-
-	/**
-	 * @param c
-	 */
-	public void setCalculatingMaxWidth(boolean c) {
-		_calculatingMaxWidth = c;
-	}
-
-	/**
-	 * @return the calculated maximum width
-	 */
-	public boolean getCalcuatingMaxWidth() {
-		return _calculatingMaxWidth;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#isCalculatingMaxWidth()
-	 */
-	public boolean isCalculatingMaxWidth() {
-		if (_calculatingMaxWidth) {
-			return true;
-		} else if (this.getFlowContext() == null) {
-			return false;
-		} else {
-			return this.getFlowContext().isCalculatingMaxWidth();
-		}
-	}
-
-	/**
-	 * Called after {@link #layoutChildren()}when all children have been laid
-	 * out. This method exists to flush the last line.
-	 */
-	protected abstract void flush();
-
-	/**
-	 * Flush anything pending and free all temporary data used during layout.
-	 */
-	protected abstract void cleanup();
-
-	// ------------------------------------------------------------------------------------
-
-	/**
-	 * @return the css figure
-	 */
-	protected final CSSFigure getCSSFigure() {
-		return (CSSFigure) getFlowFigure();
-	}
-
-	/**
-	 * 
-	 * @return the fragments for read
-	 */
-	public abstract List getFragmentsForRead();
-
-	/**
-	 * postValidate the child figures of this CSSFigure. Normally layout fall
-	 * into the first category need implement this method.
-	 */
-	public abstract void postValidate();
-
-	/**
-	 * setBounds is called on the CSSFigure. Normally layout fall into the
-	 * second category need implement this method.
-	 * 
-	 * @param rect
-	 * @param invalidate
-	 */
-	public void setBoundsCalled(Rectangle rect, boolean invalidate) {
-        // TODO: dead?
-	}
-
-	/**
-	 * Child class can override this. Normally block figure will return true.
-	 * 
-	 * @return true if should use local coordinates
-	 */
-	protected boolean useLocalCoordinates() {
-		return false;
-	}
-
-	/**
-	 * If CSSLayout will call paint rountine to draw Border for its box, this
-	 * method will return true, else return false, for example,the input file
-	 * will return false.
-	 * 
-	 * @return true if handling border block
-	 */
-	protected boolean handlingBorderForBlock() {
-		return true;
-	}
-
-	/**
-	 * This method is called when the corresponding figure is revalidated.
-	 * 
-	 */
-	protected void figureRevalidate() {
-		// child class can override.
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSListItemLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSListItemLayout.java
deleted file mode 100644
index a8400f4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSListItemLayout.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.List;
-
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.list.CounterHelper;
-import org.eclipse.jst.pagedesigner.css2.list.ICounterValueGenerator;
-import org.eclipse.jst.pagedesigner.css2.marker.CounterUtil;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.style.DefaultStyle;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @author mengbo
- */
-public class CSSListItemLayout extends CSSBlockFlowLayout implements
-		ICSSPainter {
-	private static final String DEFAULT_LIST_COUNTER = "_anonymous";
-
-	private static final int CIRCLE_DIAMETER = 6;
-
-	private static final int DISC_DIAMETER = 5;
-
-	private static final int ROUNDRECT_ARC = 2;
-
-	private static final int TEXT_PADDING = 16;
-
-	private int _count;
-
-	/**
-	 * @param cssfigure
-	 */
-	public CSSListItemLayout(CSSFigure cssfigure) {
-		super(cssfigure);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.ICSSPainter#paintFigure(org.eclipse.draw2d.Graphics)
-	 */
-	public void paintFigure(Graphics g) {
-		ICSSStyle style = this.getCSSStyle();
-		if (style == null) {
-			style = DefaultStyle.getInstance();
-		}
-
-		Rectangle drawArea = null;
-		Font font = getCSSStyle().getCSSFont().getSwtFont();
-
-		// draw the marker box
-		Object styleType = style
-				.getStyleProperty(ICSSPropertyID.ATTR_LIST_STYLE_TYPE);
-
-		g.pushState();
-
-		Color newColor = null;
-		Object color = style.getColor();
-		if (color instanceof Color) {
-			g.setForegroundColor((Color) color);
-			g.setBackgroundColor((Color) color);
-		} else if (color instanceof RGB) {
-			newColor = new Color(Display.getCurrent(), (RGB) color);
-			g.setForegroundColor(newColor);
-			g.setBackgroundColor(newColor);
-		}
-
-		if (styleType instanceof String) {
-			int type = CounterHelper.toTypeInt((String) styleType);
-			switch (type) {
-			case CounterHelper.LIST_T_UPPER_ALPHA:
-			case CounterHelper.LIST_T_LOWER_ALPHA:
-			case CounterHelper.LIST_T_LOWER_ROMAN:
-			case CounterHelper.LIST_T_UPPER_ROMAN:
-			case CounterHelper.LIST_T_DECIMAL:
-				g.setFont(font);
-				String displayString = CounterUtil.convertCount(_count, type);
-				Point point = getDrawPointForText(displayString);
-				g.drawString(displayString, point);
-				break;
-			case CounterHelper.LIST_T_CIRCLE:
-				drawArea = getDrawAreaForGraph(CIRCLE_DIAMETER, CIRCLE_DIAMETER);
-				g.drawArc(drawArea, 0, 360);
-				break;
-			case CounterHelper.LIST_T_SQUARE:
-				drawArea = getDrawAreaForGraph(DISC_DIAMETER, DISC_DIAMETER);
-				g.fillRectangle(drawArea);
-			case CounterHelper.LIST_T_DECIMAL_LEADING_ZERO:
-			case CounterHelper.LIST_T_LOWER_GREEK:
-			case CounterHelper.LIST_T_ARMENIAN:
-			case CounterHelper.LIST_T_GEORGIAN:
-			case CounterHelper.LIST_T_IMAGE:
-			case CounterHelper.LIST_T_NONE:
-			default:
-				drawArea = getDrawAreaForGraph(DISC_DIAMETER, DISC_DIAMETER);
-				g.fillRoundRectangle(drawArea, ROUNDRECT_ARC, ROUNDRECT_ARC);
-				break;
-			}
-		}
-		g.popState();
-
-		if (newColor != null) {
-			newColor.dispose();
-		}
-	}
-
-	/**
-	 * @param g
-	 * @return
-	 */
-	private Rectangle getDrawAreaForGraph(int width, int height) {
-		Rectangle drawArea;
-
-		int x = 0;
-		int y = 0;
-
-		List list = _blockBox.getFragments();
-		Rectangle box = _blockBox.toRectangle().getCopy().expand(
-				_blockBox.getBorderPaddingInsets().getAdded(
-						_blockBox.getMarginInsets()));
-		if (list != null && !list.isEmpty()) {
-			LineBox line = (LineBox) list.get(0);
-			y = line.getBaseline() - CIRCLE_DIAMETER;
-			x = box.x;
-		} else {
-			x = box.x;
-			y = box.height / 2 - CIRCLE_DIAMETER;
-		}
-		drawArea = new Rectangle(x - CIRCLE_DIAMETER * 5 / 2, y, width, height);
-		return drawArea;
-	}
-
-	private Point getDrawPointForText(String displayString) {
-		Font font = getCSSStyle().getCSSFont().getSwtFont();
-
-		int x = 0;
-		int y = 0;
-
-		Rectangle box = _blockBox.toRectangle().getCopy().expand(
-				_blockBox.getBorderPaddingInsets().getAdded(
-						_blockBox.getMarginInsets()));
-
-		x = box.x - FigureUtilities.getTextWidth(displayString, font);
-		x = x
-				- (TEXT_PADDING - FigureUtilities.getFontMetrics(font)
-						.getDescent());
-
-		return new Point(x, y);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContainerLayout#layoutChildren()
-	 */
-	protected void layoutChildren() {
-		ICounterValueGenerator counter = this.getCSSStyle().findCounter(
-				DEFAULT_LIST_COUNTER, true);
-		if (counter != null) {
-			_count = counter.getCurrentCount();
-		} else {
-			// should not happen.
-			_count = 1; // use 1 as the default value
-		}
-		super.layoutChildren();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSPageFlowLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSPageFlowLayout.java
deleted file mode 100644
index 8662bc2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSPageFlowLayout.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Rectangle;
-
-/**
- * This layout if for those thigns that it's parent will decide its size. Such
- * as table cell.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class CSSPageFlowLayout extends CSSBlockFlowLayout {
-	private Dimension _pageSize = new Dimension();
-
-	private int _recommendedWidth;
-
-	private int _pageSizeCacheKeys[] = new int[4];
-
-	private Dimension _pageSizeCacheValues[] = new Dimension[4];
-
-
-	/**
-	 * @param cssfigure
-	 */
-	public CSSPageFlowLayout(CSSFigure cssfigure) {
-		super(cssfigure);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#invalidate()
-	 */
-	public void invalidate() {
-		super.invalidate();
-		_pageSizeCacheKeys = new int[4];
-		_pageSizeCacheValues = new Dimension[4];
-		_pageSize = new Dimension();
-		_recommendedWidth = 0;
-	}
-
-	protected void endBlock() {
-		layoutLines();
-	}
-
-	/**
-	 * TODO: This method is not being called.
-	 */
-	public void postValidate() {
-		Rectangle r = new Rectangle(_blockBox._x, _blockBox._y, _blockBox
-				.getWidth(), _blockBox.getHeight());
-		r = r.expand(getCSSFigure().getInsets());
-		_pageSize.width = r.width;
-		_pageSize.height = r.height;
-
-		List list = getCSSFigure().getChildren();
-		for (int i = 0; i < list.size(); i++) {
-			((FlowFigure) list.get(i)).postValidate();
-		}
-
-	}
-
-	/**
-	 * Setup blockBox to the initial bounds of the Page
-	 */
-	protected void setupBlock() {
-		// Remove all current Fragments
-		_blockBox.clear();
-
-		// Setup the one fragment for this Block with the correct X and
-		// available width
-		int recommendedWidth = getRecommendedWidth();
-		_blockBox.setRecommendedWidth(recommendedWidth);
-
-		if (recommendedWidth > 0 && recommendedWidth != Integer.MAX_VALUE) {
-			_blockBox.setWidth(recommendedWidth);
-		}
-
-		_blockBox._x = 0;
-	}
-
-	private int getRecommendedWidth() {
-		return _recommendedWidth;
-	}
-
-	private void setRecommendedWidth(int width) {
-		if (_recommendedWidth == width) {
-			return;
-		}
-		_recommendedWidth = width;
-		getCSSFigure().invalidate2();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSLayout#setBoundsCalled(org.eclipse.jst.pagedesigner.css2.layout.CSSFigure,
-	 *      org.eclipse.draw2d.geometry.Rectangle, boolean)
-	 */
-	public void setBoundsCalled(Rectangle r, boolean invalidate) {
-		super.setBoundsCalled(r, invalidate);
-		CSSFigure figure = getCSSFigure();
-		int newWidth = r.width - figure.getInsets().getWidth();
-		if (invalidate || getRecommendedWidth() != newWidth) {
-			setRecommendedWidth(newWidth);
-			figure.getUpdateManager().addInvalidFigure(figure);
-		}
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.Figure#getPreferredSize(int, int)
-	 */
-	public Dimension getPreferredSize(IFigure container, int width, int h) {
-		if (width >= 0) {
-			width = Math.max(0, width - container.getInsets().getWidth());
-		}
-
-		for (int i = 0; i < 4; i++) {
-			if (_pageSizeCacheKeys[i] == width
-					&& _pageSizeCacheValues[i] != null) {
-				return _pageSizeCacheValues[i];
-			}
-		}
-
-		_pageSizeCacheKeys[3] = _pageSizeCacheKeys[2];
-		_pageSizeCacheKeys[2] = _pageSizeCacheKeys[1];
-		_pageSizeCacheKeys[1] = _pageSizeCacheKeys[0];
-		_pageSizeCacheKeys[0] = width;
-
-		_pageSizeCacheValues[3] = _pageSizeCacheValues[2];
-		_pageSizeCacheValues[2] = _pageSizeCacheValues[1];
-		_pageSizeCacheValues[1] = _pageSizeCacheValues[0];
-
-		// Flowpage must temporarily layout to determine its preferred size
-		int oldWidth = getRecommendedWidth();
-		setRecommendedWidth(width);
-		container.validate();
-		_pageSizeCacheValues[0] = _pageSize.getExpanded(container.getInsets()
-				.getWidth(), container.getInsets().getHeight());
-
-		if (width != oldWidth) {
-			setRecommendedWidth(oldWidth);
-			container.getUpdateManager().addInvalidFigure(container);
-		}
-		return _pageSizeCacheValues[0];
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSTextFigure.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSTextFigure.java
deleted file mode 100644
index afb0f46..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSTextFigure.java
+++ /dev/null
@@ -1,310 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.provider.ICSSTextProvider;
-import org.eclipse.jst.pagedesigner.css2.style.DefaultStyle;
-import org.eclipse.jst.pagedesigner.css2.style.StyleUtil;
-import org.eclipse.jst.pagedesigner.viewer.CaretPositionResolver;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.RGB;
-
-/**
- * @author mengbo
- */
-public class CSSTextFigure extends FlowFigure implements ICSSFigure {
-	private ICSSTextProvider _provider;
-
-	private List _fragments = new ArrayList(1);
-
-	/**
-	 * @param provider
-	 */
-	public CSSTextFigure(ICSSTextProvider provider) {
-		_provider = provider;
-		this.setLayoutManager(createDefaultFlowLayout());
-	}
-
-	public ICSSStyle getCSSStyle() {
-		IFigure parentFigure = this.getParent();
-		if (parentFigure instanceof ICSSFigure) {
-			ICSSStyle style = ((ICSSFigure) parentFigure).getCSSStyle();
-			if (style != null) {
-				return style;
-			}
-		}
-		return DefaultStyle.getInstance();
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.IFigure#containsPoint(int, int)
-	 */
-	public boolean containsPoint(int x, int y) {
-		if (!super.containsPoint(x, y)) {
-			return false;
-		}
-		List frags = getFragments();
-		for (int i = 0, n = frags.size(); i < n; i++) {
-			if (((FlowBox) frags.get(i)).containsPoint(x, y)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @return the default flow layout
-	 * 
-	 */
-	protected FlowFigureLayout createDefaultFlowLayout() {
-		return new CSSTextLayout(this);
-	}
-
-	/**
-	 * Returns the <code>LineBox</code> fragments contained in this InlineFlow
-	 * 
-	 * @return The fragments
-	 */
-	public List getFragments() {
-		return _fragments;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.ICSSFigure#getFragmentsForRead()
-	 */
-	public List getFragmentsForRead() {
-		return getFragments();
-	}
-
-	/**
-	 * @return the text
-	 */
-	public String getText() {
-		return _provider.getTextData();
-	}
-
-	/**
-	 * @see FlowFigure#postValidate()
-	 */
-	public void postValidate() {
-		List list = getFragments();
-		FlowBox box;
-		int left = Integer.MAX_VALUE, top = left;
-		int right = Integer.MIN_VALUE, bottom = right;
-		for (int i = 0, n = list.size(); i < n; i++) {
-			box = (FlowBox) list.get(i);
-			left = Math.min(left, box._x);
-			right = Math.max(right, box._x + box._width);
-			top = Math.min(top, box._y);
-			bottom = Math.max(bottom, box._y + box._height);
-		}
-		setBounds(new Rectangle(left, top, right - left, bottom - top));
-		list = getChildren();
-		for (int i = 0, n = list.size(); i < n; i++) {
-			((FlowFigure) list.get(i)).postValidate();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Figure#paintBorder(org.eclipse.draw2d.Graphics)
-	 */
-	protected void paintBorder(Graphics graphics) {
-		if (Debug.DEBUG_TEXTBORDER) {
-			if (_fragments != null) {
-				graphics.setForegroundColor(ColorConstants.darkBlue);
-				for (int i = 0, size = _fragments.size(); i < size; i++) {
-					FlowBox box = (FlowBox) _fragments.get(i);
-					BoxUtil.drawBox(graphics, box);
-				}
-				graphics.restoreState();
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.Figure#paintFigure(Graphics)
-	 */
-	protected void paintFigure(Graphics g) {
-		Object result = this.getCSSStyle().getColor();
-		Color color;
-		if (result instanceof Color) {
-			color = (Color) result;
-		} else if (result instanceof RGB) {
-			color = new Color(null, (RGB) result);
-		} else {
-			color = null;
-		}
-		int[] range = null;
-		if (!StyleUtil.isInWidget(this.getCSSStyle())) {
-			range = _provider.getSelectedRange();
-		}
-		if (range == null || range[0] == range[1]) {
-			// we are not in selection
-			TextLayoutSupport.paintTextFigure(g, _fragments, getCSSStyle()
-					.getCSSFont().getSwtFont(), color, ((Integer) getCSSStyle()
-					.getStyleProperty(ICSSPropertyID.ATTR_TEXTDECORATION))
-					.intValue());
-		} else {
-			TextLayoutSupport.paintTextFigureWithSelection(g, _fragments,
-					_provider.getTextData(), getCSSStyle().getCSSFont()
-							.getSwtFont(), color, ((Integer) getCSSStyle()
-							.getStyleProperty(
-									ICSSPropertyID.ATTR_TEXTDECORATION))
-							.intValue(), range[0], range[1],
-					ColorConstants.white, ColorConstants.blue);
-		}
-		if (color != result && color != null) {
-			color.dispose();
-		}
-	}
-
-	/**
-	 * Find out lines which has closer y coordinate to point, and then line
-	 * which has closer x coordinate.
-	 * 
-	 * @param relative
-	 * @return return the offset
-	 */
-    // TODO: refactoring?
-	public int getNewInsertionOffset(Point relative) {
-		TextFragmentBox closestBox = null;
-		// if there is one which are at the same line with relative, calculate
-		// that line first;
-		for (int i = 0, n = _fragments.size(); i < n; i++) {
-			TextFragmentBox box = (TextFragmentBox) _fragments.get(i);
-			if (box.containsPoint(relative.x, relative.y)) {
-				int index = FlowUtilities.getTextInWidth(box.getTextData(),
-						getCSSStyle().getCSSFont().getSwtFont(), relative.x
-								- box._x, TextLayoutSupport
-								.getAverageCharWidth(box));
-				return box._offset + index;
-			}
-            if (closestBox == null) {
-            	closestBox = box;
-            } else {
-            	// box is above point
-            	TextFragmentBox tempBox = box;
-            	int offset1 = Math
-            			.abs(CaretPositionResolver.getYDistance(
-            					new Rectangle(tempBox._x, tempBox._y,
-            							tempBox._width, tempBox._height),
-            					relative));
-            	tempBox = closestBox;
-            	int offset2 = Math
-            			.abs(CaretPositionResolver.getYDistance(
-            					new Rectangle(tempBox._x, tempBox._y,
-            							tempBox._width, tempBox._height),
-            					relative));
-            	if (offset1 < offset2) {
-            		closestBox = box;
-            	}
-            }
-            // at the same line
-            if (box.containsPoint(box._x, relative.y)) {
-            	TextFragmentBox tempBox = box;
-            	int offset1 = Math
-            			.abs(CaretPositionResolver.getXDistance(
-            					new Rectangle(tempBox._x, tempBox._y,
-            							tempBox._width, tempBox._height),
-            					relative));
-            	tempBox = closestBox;
-            	int offset2 = Math
-            			.abs(CaretPositionResolver.getXDistance(
-            					new Rectangle(tempBox._x, tempBox._y,
-            							tempBox._width, tempBox._height),
-            					relative));
-            	if (offset1 < offset2) {
-            		closestBox = box;
-            	}
-            }
-		}
-
-		if (closestBox.containsPoint(closestBox._x, relative.y)
-				|| closestBox.containsPoint(relative.x, closestBox._y)) {
-			int offset = relative.x - closestBox._x;
-			int index = FlowUtilities.getTextInWidth(closestBox.getTextData(),
-					getCSSStyle().getCSSFont().getSwtFont(), offset,
-					TextLayoutSupport.getAverageCharWidth(closestBox));
-			return closestBox._offset + index;
-		}
-        return -1;
-	}
-
-	/**
-	 * @param relative
-	 * @return the insertion offset
-	 */
-	public int getInsertionOffset(Point relative) {
-		for (int i = 0, n = _fragments.size(); i < n; i++) {
-			TextFragmentBox box = (TextFragmentBox) _fragments.get(i);
-			if (box.containsPoint(relative.x, relative.y)) {
-				int index = FlowUtilities.getTextInWidth(box.getTextData(),
-						getCSSStyle().getCSSFont().getSwtFont(), relative.x
-								- box._x, TextLayoutSupport
-								.getAverageCharWidth(box));
-				return box._offset + index;
-			}
-		}
-		return -1;
-	}
-
-	/**
-	 * the returned rectangle will be relative to this text figure.
-	 * 
-	 * @param offset
-	 * @return the caret position
-	 */
-	public Rectangle calculateCaretPosition(int offset) {
-		// search reverse order, find the latest box that has _offset small than
-		// the specified one
-		if (offset > 0) {
-			for (int i = _fragments.size() - 1; i >= 0; i--) {
-				TextFragmentBox box = (TextFragmentBox) _fragments.get(i);
-				if (box._offset <= offset) {
-					// ok, we find the box.
-					if (box._offset + box._length < offset) {
-						return new Rectangle(box._x + box._width, box._y, 1,
-								box._height);
-					}
-                    String s = box.getTextData().substring(0,
-                    		offset - box._offset);
-                    int width = FlowUtilities.getTextExtents(s,
-                    		getCSSStyle().getCSSFont().getSwtFont()).width;
-                    return new Rectangle(box._x + width, box._y, 1,
-                    		box._height);
-				}
-			}
-		} else {
-			if (_fragments.size() > 0) {
-				TextFragmentBox box = (TextFragmentBox) _fragments.get(0);
-				return new Rectangle(box._x, box._y, 1, box._height);
-			}
-		}
-		// should only reach here when there is no fragments.
-		return new Rectangle(getBounds().x, getBounds().y, 1, getBounds().height);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSTextLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSTextLayout.java
deleted file mode 100644
index 2805c98..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSTextLayout.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.style.AbstractStyle;
-import org.eclipse.swt.graphics.Font;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-// NOTE: CSSTextLayout does not extends CSSFlowLayout. Since text is a little
-// special,
-// we don't want to do things like "preLayout()" as in CSSFlowLayout.
-public class CSSTextLayout extends FlowFigureLayout {
-	/**
-	 * Wrapping will ONLY occur at valid line breaks
-	 */
-	public static final int WORD_WRAP_HARD = 0;
-
-	/**
-	 * Wrapping will always occur at the end of the available space, breaking in
-	 * the middle of a word.
-	 */
-	public static final int WORD_WRAP_SOFT = 1;
-
-	/**
-	 * Wrapping will always occur at the end of available space, truncating a
-	 * word if it doesn't fit.
-	 */
-	// don't support this flag
-	// public static final int WORD_WRAP_TRUNCATE = 2;
-	private int _wrappingStyle = WORD_WRAP_HARD;
-
-	/**
-	 * @param textfigure
-	 */
-	public CSSTextLayout(CSSTextFigure textfigure) {
-		super(textfigure);
-	}
-
-	// --------------------------------------------------------------------------------------------------
-	FlowBox findLastNonLineBox(LineBox box) {
-		List fragments = box.getFragments();
-		for (int i = fragments.size() - 1; i >= 0; i--) {
-			FlowBox item = (FlowBox) fragments.get(i);
-			if (item instanceof LineBox) {
-				FlowBox found = findLastNonLineBox((LineBox) item);
-				if (found != null) {
-					return found;
-				}
-			} else {
-				return item;
-			}
-		}
-		return null;
-	}
-
-	// boolean isElementContentWhitespaceEnding()
-	// {
-	// if (!this._context.isCurrentLineOccupied())
-	// return true;
-	// LineBox line = this._context.getCurrentLine();
-	// FlowBox lastNoneLinebox = findLastNonLineBox(line);
-	// if (lastNoneLinebox instanceof TextFragmentBox)
-	// return ((TextFragmentBox) lastNoneLinebox)._isLastCharWhitespace;
-	// else
-	// return true;
-	// }
-	//
-	// String normalize(String text)
-	// {
-	// text = EntityMap.translateAndCompact(text);
-	// if (text.length() > 0 &&
-	// Character.isElementContentWhitespace(text.charAt(0)) &&
-	// isElementContentWhitespaceEnding())
-	// return text.substring(1);
-	// else
-	// return text;
-	// }
-
-	private void layoutEmptyString(List fragments, Font font) {
-		// empty node! we want to create a fake fragment, so things can be
-		// consistent
-		// that all the CSSTextFigure will have something inside, also in this
-		// way, even
-		// empty text node will have a position, thus we can support showing
-		// caret associated
-		// with this text figure.
-		fragments.clear();
-		TextFragmentBox box = TextLayoutSupport.getFragment(0, fragments);
-		box._length = 0;
-		box._offset = 0;
-		box._height = 0;
-		box._width = 0;
-		box.setTextData("");
-
-		// {following comments deprecated XXX: If is empty string, we only want
-		// to this figure to have a size, but don't
-		// want to it to be added into current line. Otherwise, a line with only
-		// a empty string
-		// will also take a line's space.}
-
-		// please reference LineBox.isOccupied()
-		// now we treat a line with only an empty text as not occupied.
-		getFlowContext().getCurrentLine().add(box);
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#layout()
-	 */
-	protected void layout() {
-		CSSTextFigure flowFigure = (CSSTextFigure) getFlowFigure();
-
-		List fragments = flowFigure.getFragments();// Reuse the previous List
-		// of fragments
-		String text = flowFigure.getText();
-		Font font = flowFigure.getCSSStyle().getCSSFont().getSwtFont();
-		Object whitespace = flowFigure.getCSSStyle().getStyleProperty(
-				ICSSPropertyID.ATTR_WHITESPACE);
-
-		if (whitespace == ICSSPropertyID.VAL_PRE) {
-			if (text == null || text.length() == 0)
-				layoutEmptyString(fragments, font);
-			else
-				TextLayoutSupport.layoutNoWrap(getFlowContext(), text,
-						fragments, font);
-		} else if (whitespace == ICSSPropertyID.VAL_NOWRAP) {
-			if (text == null || text.length() == 0)
-				layoutEmptyString(fragments, font);
-			else
-				TextLayoutSupport.layoutNoWrap(getFlowContext(), text,
-						fragments, font);
-		} else {
-			if (text == null || text.length() == 0)
-				layoutEmptyString(fragments, font);
-			else {
-				//fix for bug #221629 - BEGIN
-				boolean useShouldTrimLeadingWSInlineMethod = false;
-				IFigure parentFigure = flowFigure.getParent();
-				if (parentFigure instanceof CSSFigure) {
-					ICSSStyle style = ((CSSFigure)parentFigure).getCSSStyle();
-					if (style instanceof AbstractStyle) {
-						Element element = ((AbstractStyle)style).getElement();
-						if (element != null &&
-								element.getNodeName().equals(IHTMLConstants.TAG_SPAN)) {
-							useShouldTrimLeadingWSInlineMethod = true;
-						}
-					}
-				}
-				boolean trimLeadingChar;
-				if (!useShouldTrimLeadingWSInlineMethod) {
-					trimLeadingChar = (text.charAt(0) == ' ' && shouldTrimLeadingWhitespace(getFlowContext()));
-				} else {
-					trimLeadingChar = (text.charAt(0) == ' ' && shouldTrimLeadingWhitespaceInline(getFlowContext()));
-				}
-				//fix for bug #221629 - END
-				TextLayoutSupport.layoutNormal(getFlowContext(), text,
-						fragments, font, _wrappingStyle, trimLeadingChar);
-			}
-		}
-	}
-
-	/**
-	 * @param context
-	 * @return true if should trim leading whitespace
-	 */
-    // XXX: maybe should move to TextSupport later.
-	public boolean shouldTrimLeadingWhitespace(FlowContext context) {
-		if (!context.isCurrentLineOccupied()) {
-			return true;
-		}
-		while (context instanceof CSSInlineFlowLayout) {
-			context = ((CSSInlineFlowLayout) context).getFlowContext();
-		}
-		LineBox line = context.getCurrentLine();
-		if (line == null || !line.isOccupied()) {
-			return true;
-		}
-		FlowBox lastNoneLinebox = findLastNonLineBox(line);
-		if (lastNoneLinebox == null || lastNoneLinebox.getWidth() == 0) {
-			return true;
-		} else if (lastNoneLinebox instanceof TextFragmentBox) {
-			return ((TextFragmentBox) lastNoneLinebox)._isLastCharWhitespace;
-		} else {
-			return false;
-		}
-	}
-
-	/**
-	 * Used instead of shouldTrimLeadingWhitespace(FlowContext) if parent
-	 * figure's style is for an appropriate in-line element, such as "span".
-	 * 
-	 * @param context FlowContext instance.
-	 * @return true if should trim leading whitespace, else false.
-	 */
-	private boolean shouldTrimLeadingWhitespaceInline(FlowContext context) {
-		if (!context.isCurrentLineOccupied()) {
-			return true;
-		}
-		LineBox line = context.getCurrentLine();
-		if (line == null || !line.isOccupied()) {
-			return true;
-		}
-		FlowBox lastNoneLinebox = findLastNonLineBox(line);
-		if (lastNoneLinebox == null || lastNoneLinebox.getWidth() == 0) {
-			return true;
-		} else if (lastNoneLinebox instanceof TextFragmentBox) {
-			return ((TextFragmentBox) lastNoneLinebox)._isLastCharWhitespace;
-		} else {
-			return false;
-		}
-	}
-
-	public void dispose() {
-        // TODO: anything to dispose?
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSWidgetLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSWidgetLayout.java
deleted file mode 100644
index 8e50123..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CSSWidgetLayout.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.provider.DimensionInfo;
-import org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider;
-
-/**
- * @author mengbo
- */
-public class CSSWidgetLayout extends CSSBlockFlowLayout implements ICSSPainter {
-	private WidgetBox _widgetBox;
-
-	private ICSSWidgetProvider _provider;
-
-	/**
-	 * @param flowfigure
-	 * @param provider 
-	 */
-	public CSSWidgetLayout(CSSFigure flowfigure, ICSSWidgetProvider provider) {
-		super(flowfigure);
-		_provider = provider;
-	}
-
-	/**
-	 * normally this method is called directly after constructor
-	 * 
-	 * @param provider
-	 */
-	public void setProvider(ICSSWidgetProvider provider) {
-		_provider = provider;
-	}
-
-	/**
-	 * @return the provider
-	 */
-	public ICSSWidgetProvider getProvider() {
-		// return ((CSSWidgetFigure)this.getFlowFigure()).getProvider();
-		return _provider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout#isInlineBlock()
-	 */
-	public boolean isInlineBlock() {
-		ICSSWidgetProvider provider = getProvider();
-		return provider.isInline();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#layout()
-	 */
-	protected void layoutChildren() {
-		ICSSWidgetProvider provider = getProvider();
-
-		// if we did endLine, then will result in context create a new line, so
-		// we may in the new line now.
-		// passing in the top margin, and context will consider that when
-		// creating the new line.
-
-		int suggestedWith = _blockBox.getContentWidth();
-		int suggestedHeight = _blockBox.getContentHeight();
-		// int suggestedWith = getSuggestedWidth(line, style, provider);
-		// int suggestedHeight = getSuggestedHeight(line, style, provider);
-
-		DimensionInfo resultInfo = provider.getPreferredDimension(
-				suggestedWith, suggestedHeight);
-		Dimension resultSize = resultInfo.getDimension();
-
-		_widgetBox = new WidgetBox(); // ((CSSWidgetFigure)getFlowFigure()).getWidgetBox();
-		// if (provider.isHandlingBorder() || style == null)
-		// {
-		_widgetBox.setWidth(resultSize.width);
-		_widgetBox.setHeight(resultSize.height);
-		_widgetBox.setAscent(resultInfo.getAscent());
-		// }
-		// else
-		// {
-		// widgetBox.setWidth(resultSize.width +
-		// style.getBorderInsets().getWidth());
-		// widgetBox.setHeight(resultSize.height +
-		// style.getBorderInsets().getHeight());
-		// widgetBox.setAscent(resultInfo.getAscent()+style.getBorderInsets().top);
-		// }
-		this.addToCurrentLine(_widgetBox);
-		// if (!provider.isInline())
-		// {
-		// context.endLine();
-		// }
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#dispose()
-	 */
-	public void dispose() {
-        // TODO: anything to dispose?
-	}
-
-	// public int getSuggestedWidth(LineBox line, ICSSStyle style,
-	// ICSSWidgetProvider provider)
-	// {
-	// if (style == null) return -1;
-	//
-	// Object width = style.getStyleProperty(ICSSPropertyID.ATTR_WIDTH);
-	// Length recommendedWidth = (width instanceof Length) ? (Length) width :
-	// null;
-	//
-	// int rw = 0;
-	// if (recommendedWidth == null || recommendedWidth.getValue() <= 0)
-	// {
-	// return -1;
-	// }
-	// else
-	// {
-	// if (recommendedWidth.isPercentage())
-	// {
-	// rw = line.getAvailableWidth() * recommendedWidth.getValue() / 100;
-	// }
-	// else
-	// {
-	// rw = recommendedWidth.getValue();
-	// }
-	//
-	// if (!style.isSizeIncludeBorderPadding() && provider.isHandlingBorder())
-	// {
-	// rw += style.getBorderInsets().getWidth() +
-	// style.getPaddingInsets().getWidth();
-	// }
-	// else if (style.isSizeIncludeBorderPadding() &&
-	// !provider.isHandlingBorder())
-	// {
-	// rw -= style.getBorderInsets().getWidth() +
-	// style.getPaddingInsets().getWidth();
-	// }
-	// }
-	//
-	// return rw;
-	// }
-	//
-	// public int getSuggestedHeight(LineBox line, ICSSStyle style,
-	// ICSSWidgetProvider provider)
-	// {
-	// if (style == null) return -1;
-	//
-	// Object height = style.getStyleProperty(ICSSPropertyID.ATTR_HEIGHT);
-	// Length recommendedHeight = (height instanceof Length) ? (Length) height :
-	// null;
-	//
-	// int rh = 0;
-	// if (recommendedHeight == null || recommendedHeight.getValue() <= 0)
-	// {
-	// return -1;
-	// }
-	// else
-	// {
-	// if (recommendedHeight.isPercentage())
-	// {
-	// // we don't support percentage height for this version, ignore
-	// return -1;
-	// }
-	// else
-	// {
-	// rh = recommendedHeight.getValue();
-	// }
-	//
-	// if (!style.isSizeIncludeBorderPadding() && provider.isHandlingBorder())
-	// {
-	// rh += style.getBorderInsets().getHeight() +
-	// style.getPaddingInsets().getHeight();
-	// }
-	// else if (style.isSizeIncludeBorderPadding() &&
-	// !provider.isHandlingBorder())
-	// {
-	// rh -= style.getBorderInsets().getHeight() +
-	// style.getPaddingInsets().getHeight();
-	// }
-	// }
-	//
-	// return rh;
-	// }
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.ICSSPainter#paintFigure(org.eclipse.draw2d.Graphics)
-	 */
-	public void paintFigure(Graphics g) {
-		ICSSWidgetProvider provider = this.getProvider();
-		if (provider != null && _widgetBox != null) {
-			provider.paintFigure(g, new Rectangle(_widgetBox._x, _widgetBox._y,
-					_widgetBox.getWidth(), _widgetBox.getHeight()));
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSLayout#handlingBorderForBlock()
-	 */
-	public boolean handlingBorderForBlock() {
-		ICSSWidgetProvider provider = this.getProvider();
-		if (provider != null) {
-			return provider.isHandlingBorder();
-		}
-		return super.handlingBorderForBlock();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CompositeBox.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CompositeBox.java
deleted file mode 100644
index 75d6a0e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/CompositeBox.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * A FlowBox that can contain other BlockInfos. The contained BlockInfos are
- * called <i>fragments </i>.
- * 
- * @author mengbo
- * @since 2.1
- */
-public abstract class CompositeBox extends FlowBox {
-
-	/**
-	 * The contained fragments.
-	 */
-	protected List _fragments = new ArrayList();
-
-	int _recommendedWidth;
-
-	int _recommendedHeight;
-
-	/**
-	 * Adds the specified FlowBox. Updates the width, height, and ascent
-	 * properties.
-	 * 
-	 * @param block
-	 *            the FlowBox being added
-	 */
-	public void add(FlowBox block) {
-		// The order is critical.see the first "if" block in the unionInfo()
-		// method.
-		unionInfo(block);
-		_fragments.add(block);
-	}
-
-	/**
-	 * Removes all owned fragments and invalidates this CompositeBox.
-	 */
-	public void clear() {
-		_fragments.clear();
-		resetInfo();
-	}
-
-	/**
-	 * Overridden to ensure that the CompositeBox is valid.
-	 * 
-	 * @see FlowBox#getBounds()
-	 */
-	// public Rectangle getBounds() {
-	// validate();
-	// return this;
-	// }
-	/**
-	 * @return the List of fragments
-	 */
-	public List getFragments() {
-		return _fragments;
-	}
-
-	/**
-	 * Returns the recommended width for this CompositeBox.
-	 * 
-	 * @return the recommended width
-	 */
-	public int getRecommendedWidth() {
-		return _recommendedWidth;
-	}
-
-	/**
-	 * resets fields before unioning the data from the fragments.
-	 */
-	protected void resetInfo() {
-		_width = _height = 0;
-	}
-
-	/**
-	 * Sets the recommended width for this CompositeBox.
-	 * 
-	 * @param w
-	 *            the width
-	 */
-	public void setRecommendedWidth(int w) {
-		_recommendedWidth = w;
-	}
-
-	/**
-	 * @param h
-	 */
-	public void setRecommendedHeight(int h) {
-		_recommendedHeight = h;
-	}
-
-	/**
-	 * unions the fragment's width, height, and ascent into this composite.
-	 * 
-	 * @param box
-	 *            the fragment
-	 */
-	protected void unionInfo(FlowBox box) {
-		int right = Math.max(_x + _width, box._x + box._width);
-		int bottom = Math.max(_y + _height, box._y + box._height);
-		_x = Math.min(_x, box._x);
-		_y = Math.min(_y, box._y);
-		_width = right - _x;
-		_height = bottom - _y;
-	}
-
-	/**
-	 * @return the content width
-	 */
-	public int getContentWidth() {
-		return getWidth() - getBorderPaddingWidth();
-	}
-
-	/**
-	 * @return the content height
-	 */
-	public int getContentHeight() {
-		return getHeight() - getBorderPaddingHeight();
-	}
-
-	/**
-	 * @return the recommended content width
-	 */
-	public int getRecommendedContentWidth() {
-		return Math.max(0, getRecommendedWidth() - getBorderPaddingWidth());
-	}
-	//
-	// public int getRecommendedContentHeight()
-	// {
-	// return Math.max(0, getRecommendedHeight() - getBorderPaddingHeight());
-	// }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/Debug.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/Debug.java
deleted file mode 100644
index f83e901..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/Debug.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-/**
- * Debug constants.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class Debug {
-	/**
-	 * Debug flag
-	 */
-	public static final boolean DEBUG_BASELINE = false;
-
-	/**
-	 * Debug flag
-	 */
-	public static final boolean DEBUG_BOX = false;
-
-	/**
-	 * Debug flag
-	 */
-	public static final boolean DEBUG_BORDERPADDING = false;
-
-	/**
-	 * Debug flag
-	 */
-	public static final boolean DEBUG_TEXTBORDER = false;
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/DisplayToLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/DisplayToLayout.java
deleted file mode 100644
index cefb4de..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/DisplayToLayout.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.draw2d.LayoutManager;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.table.CSSTRGroupLayout;
-import org.eclipse.jst.pagedesigner.css2.layout.table.CSSTRLayout;
-import org.eclipse.jst.pagedesigner.css2.layout.table.CSSTableCaptionLayout;
-import org.eclipse.jst.pagedesigner.css2.layout.table.CSSTableCellLayout;
-import org.eclipse.jst.pagedesigner.css2.layout.table.CSSTableLayout2;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.property.PositionMeta;
-
-/**
- * @author mengbo
- */
-public final class DisplayToLayout {
-	/**
-	 * @param figure
-	 * @param display
-	 * @param old
-	 * @return the layout
-	 */
-	public static CSSLayout displayToLayout(CSSFigure figure, String display,
-			LayoutManager old) {
-		if ("block".equalsIgnoreCase(display)) //$NON-NLS-1$
-		{
-			return new CSSBlockFlowLayout(figure);
-		} else if ("inline".equalsIgnoreCase(display)) //$NON-NLS-1$
-		{
-			return new CSSInlineFlowLayout(figure);
-		} else if ("table".equalsIgnoreCase(display) || "inline-table".equalsIgnoreCase(display)) //$NON-NLS-1$ $NON-NLS-2$
-		{
-			return new CSSTableLayout2(figure);
-		} else if ("table-row".equalsIgnoreCase(display)) //$NON-NLS-1$
-		{
-			return new CSSTRLayout(figure);
-		} else if ("table-row-group".equalsIgnoreCase(display) //$NON-NLS-1$
-				|| "table-header-group".equalsIgnoreCase(display) //$NON-NLS-1$
-				|| "table-footer-group".equalsIgnoreCase(display)) //$NON-NLS-1$
-		{
-			return new CSSTRGroupLayout(figure);
-		} else if ("table-cell".equalsIgnoreCase(display)) //$NON-NLS-1$
-		{
-			return new CSSTableCellLayout(figure);
-		} else if (display.equalsIgnoreCase("table-caption")) //$NON-NLS-1$
-		{
-			return new CSSTableCaptionLayout(figure);
-		} else if ("inline-block".equalsIgnoreCase(display)) //$NON-NLS-1$
-		{
-			return new CSSBlockFlowLayout(figure) {
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout#isInlineBlock()
-				 */
-				public boolean isInlineBlock() {
-					return true;
-				}
-			};
-		} else if (ICSSPropertyID.VAL_LIST_ITEM.equalsIgnoreCase(display)) {
-			return new CSSListItemLayout(figure);
-		}
-		return null;
-	}
-
-	/**
-	 * @param display 
-	 * @return true if is inline
-	 */
-	public static boolean isInline(String display) {
-		return "inline".equalsIgnoreCase(display) //$NON-NLS-1$
-				|| "inline-block".equalsIgnoreCase(display); //$NON-NLS-1$
-	}
-
-	/**
-	 * @param style
-	 * @return true if is positioned
-	 */
-	public static boolean isPositioned(ICSSStyle style) {
-		Object position = style.getStyleProperty(ICSSPropertyID.ATTR_POSITION);
-		if (PositionMeta.STATIC.equalsIgnoreCase((String) position)) {
-			return false;
-		}
-        return true;
-	}
-	
-	private DisplayToLayout()
-	{
-	    // util class, no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FigureUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FigureUtil.java
deleted file mode 100644
index 56d775c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FigureUtil.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Translatable;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public  final class FigureUtil {
-	/**
-	 * @param figure
-	 * @param t
-	 */
-    // XXX:
-    // seemed Figure.translateToRelative is bug?
-	public static final void translateToRelative(IFigure figure, Translatable t) {
-		if (figure.getParent() != null) {
-			translateToRelative(figure.getParent(), t);
-			// figure.getParent().translateToRelative(t);
-			figure.translateFromParent(t);
-		}
-	}
-
-	/**
-	 * @param figure
-	 * @param t
-	 */
-    // XXX:
-    // seemed Figure.translateToAbsolute is bug?
-	public static final void translateToAbsolute(IFigure figure, Translatable t) {
-		if (figure.getParent() != null) {
-			figure.translateToParent(t);
-			translateToAbsolute(figure.getParent(), t);
-			// figure.getParent().translateToAbsolute(t);
-		}
-
-	}
-	
-	private FigureUtil()
-	{
-	    // util class.  No instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowBox.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowBox.java
deleted file mode 100644
index 52b3765..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowBox.java
+++ /dev/null
@@ -1,230 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Rectangle;
-
-/**
- * This class represents the CSS box model. See chapter 8 of CSS2 spec.
- * 
- * see http://www.w3.org/TR/REC-CSS2/box.html
- * 
- */
-public class FlowBox {
-	private Object _verticalAlignData = null;
-
-	/**
-	 * The x location
-	 */
-	protected int _x;
-
-	/**
-	 * The y location
-	 */
-	protected int _y;
-
-	int _width;
-
-	int _height;
-
-	private Insets _marginInsets = new Insets();
-
-	private Insets _borderInsets = new Insets();
-
-	private Insets _paddingInsets = new Insets();
-
-	/**
-	 * This method must be called on a block that is completely positioned and
-	 * committed.
-	 * 
-	 * @param x
-	 *            X
-	 * @param y
-	 *            Y
-	 * @return <code>true</code> if the FlowBox contains the point
-	 */
-	public boolean containsPoint(int x, int y) {
-		return x >= this._x && y >= this._y && x < this._x + this._width
-				&& y < this._y + this._height;
-	}
-
-	/**
-	 * By default, a FlowBox is all ascent, and no descent, so the height is
-	 * returned.
-	 * 
-	 * @return the <i>ascent </i> in pixels above the baseline
-	 */
-	public int getAscent() {
-		return getHeight();
-	}
-
-
-	/**
-	 * By default, a simple FlowBox is all ascent, and no descent. Zero is
-	 * returned.
-	 * 
-	 * @return the <i>descent </i> in pixels below the baseline
-	 */
-	public final int getDescent() {
-		return getHeight() - getAscent();
-	}
-
-	/**
-	 * Returns the height
-	 * 
-	 * @return height
-	 */
-	public int getHeight() {
-		return _height;
-	}
-
-	/**
-	 * Returns the width
-	 * 
-	 * @return width
-	 */
-	public int getWidth() {
-		return _width;
-	}
-
-	/**
-	 * @param w
-	 */
-	public void setWidth(int w) {
-		_width = w;
-	}
-
-	/**
-	 * @param h
-	 */
-	public void setHeight(int h) {
-		_height = h;
-	}
-
-	/**
-	 * Used to set the baseline of this FlowBox to the specified value.
-	 * 
-	 * @param value
-	 *            the new baseline
-	 */
-	public void makeBaseline(int value) {
-		_y = (value - getAscent());
-	}
-
-	/**
-	 * @return the border padding width
-	 */
-	public int getBorderPaddingWidth() {
-		return _borderInsets.getWidth() + _paddingInsets.getWidth();
-	}
-
-	/**
-	 * @return the border padding height
-	 */
-	public int getBorderPaddingHeight() {
-		return _borderInsets.getHeight() + _paddingInsets.getHeight();
-	}
-
-	/**
-	 * @return the border padding insets
-	 */
-	public Insets getBorderPaddingInsets() {
-		Insets temp = new Insets(_borderInsets);
-		return temp.add(_paddingInsets);
-	}
-
-	/**
-	 * @param rect
-	 */
-	public void setXYWidthHeight(Rectangle rect) {
-		this._x = rect.x;
-		this._y = rect.y;
-		this.setWidth(rect.width);
-		this.setHeight(rect.height);
-	}
-
-	/**
-	 * @return Returns the _verticalAlignData.
-	 */
-	public Object getVerticalAlignData() {
-		return _verticalAlignData;
-	}
-
-	/**
-	 * @param alignData
-	 *            The _verticalAlignData to set.
-	 */
-	public void setVerticalAlignData(Object alignData) {
-		_verticalAlignData = alignData;
-	}
-
-	/**
-	 * @return a copy of the rectangle
-	 * TODO: use getCopy() ?
-	 */
-	public Rectangle getRectangle() {
-		return new Rectangle(this._x, this._y, this.getWidth(), this
-				.getHeight());
-	}
-
-    /**
-     * @return the x coordinate
-     */
-    public final int getX() {
-        return _x;
-    }
-
-    /**
-     * @return the y coordinate
-     */
-    public final int getY() {
-        return _y;
-    }
-
-    /**
-     * @param y
-     */
-    protected void setY(int y)
-    {
-        _y = y;
-    }
-    
-    /**
-     * @return the margin insets
-     */
-    public final Insets getMarginInsets() {
-        return _marginInsets;
-    }
-
-    final void setMarginInsets(Insets marginInsets) {
-        _marginInsets = marginInsets;
-    }
-
-    final Insets getBorderInsets() {
-        return _borderInsets;
-    }
-
-    final void setBorderInsets(Insets borderInsets)
-    {
-        _borderInsets = borderInsets;
-    }
-    
-    final Insets getPaddingInsets() {
-        return _paddingInsets;
-    }
-	
-	final void setPaddingInsets(Insets paddingInsets)
-	{
-	    _paddingInsets = paddingInsets;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowContainerLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowContainerLayout.java
deleted file mode 100644
index ca43353..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowContainerLayout.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.List;
-
-import org.eclipse.draw2d.Figure;
-
-/**
- * A layout for FlowFigures with children.
- * <P>
- * WARNING: This class is not intended to be subclassed by clients.
- * 
- * @author mengbo
- * @since 2.1
- */
-public abstract class FlowContainerLayout extends FlowFigureLayout implements
-		FlowContext {
-//	private static Logger _log = PDPlugin.getLogger(FlowContainerLayout.class);
-
-	/**
-	 * the current line
-	 */
-	protected LineBox _currentLine;
-
-	private boolean _calculatingMaxWidth;
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#FlowFigureLayout(FlowFigure)
-	 */
-	protected FlowContainerLayout(FlowFigure flowFigure) {
-		super(flowFigure);
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#addToCurrentLine(FlowBox)
-	 */
-	public void addToCurrentLine(FlowBox block) {
-		getCurrentLine().add(block);
-	}
-
-	/**
-	 * Used by getCurrentLine().
-	 */
-	protected abstract void createNewLine();
-
-	/**
-	 * Used by getCurrentLine(int topmargin)
-	 * 
-	 * @param topMargin
-	 */
-	protected void createNewLine(int topMargin) {
-		createNewLine();
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getCurrentLine()
-	 */
-	public LineBox getCurrentLine() {
-		if (_currentLine == null)
-			createNewLine();
-		return _currentLine;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getCurrentLine(int)
-	 */
-	public LineBox getCurrentLine(int topMargin) {
-		if (_currentLine == null) {
-			createNewLine(topMargin);
-		}
-		// if the current line only contains an empty string, reset the current
-		// line using the given margin.
-		else if (_currentLine.isEmptyStringLine()) {
-			List list = _currentLine.getFragments();
-			createNewLine(topMargin);
-			_currentLine._fragments.addAll(list);
-		}
-		return _currentLine;
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#isCurrentLineOccupied
-	 */
-	public boolean isCurrentLineOccupied() {
-		return _currentLine != null && _currentLine.isOccupied();
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#layout()
-	 */
-	protected void layout() {
-		preLayout();
-		layoutChildren();
-		flush();
-		cleanup();
-	}
-
-	/**
-	 * Layout all children.
-	 */
-	protected void layoutChildren() {
-		List children = getFlowFigure().getChildren();
-		for (int i = 0; i < children.size(); i++) {
-			Figure f = (Figure) children.get(i);
-			f.invalidate();
-			f.validate();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#getLastMarginRight()
-	 */
-	public int getLastMarginRight() {
-		if (_currentLine == null || !_currentLine.isOccupied()) {
-			return 0;
-		}
-		FlowBox box = (FlowBox) _currentLine.getFragments().get(
-				_currentLine.getFragments().size() - 1);
-		if (box != null) {
-			return box.getMarginInsets().right;
-		}
-        return 0;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowContext#isCalculatingMaxWidth()
-	 */
-	public boolean isCalculatingMaxWidth() {
-		if (_calculatingMaxWidth) {
-			return true;
-		} else if (this.getFlowContext() == null) {
-			return false;
-		} else {
-			return this.getFlowContext().isCalculatingMaxWidth();
-		}
-	}
-
-	/**
-	 * Called before layoutChildren() to setup any necessary state.
-	 */
-	protected abstract void preLayout();
-
-	/**
-	 * Called after {@link #layoutChildren()}when all children have been laid
-	 * out. This method exists to flush the last line.
-	 */
-	protected abstract void flush();
-
-	/**
-	 * Flush anything pending and free all temporary data used during layout.
-	 */
-	protected abstract void cleanup();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowContext.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowContext.java
deleted file mode 100644
index bdd4e51..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowContext.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-/**
- * Copied from draw2d. Enhanced to meet page designer's needs. The context that
- * a {@link FlowFigureLayout}uses to perform its layout.
- * <P>
- * WARNING: This interface is not intended to be implemented by clients. It
- * exists to define the API between the layout and its context.
- */
-public interface FlowContext {
-
-	/**
-	 * Adds the given box into the current line.
-	 * 
-	 * @param box
-	 *            the FlowBox to add
-	 */
-	void addToCurrentLine(FlowBox box);
-
-	/**
-	 * The current line should be committed if it is occupied, and then set to
-	 * <code>null</code>. Otherwise, do nothing.
-	 */
-	void endLine();
-
-	/**
-	 * Obtains the current line, creating a new line if there is no current
-	 * line. if create a new line, the new line's x will be set correctly
-	 * without considering the new element's left margin. Also, if create new
-	 * line, it will treat as the new line's top margin is 0.
-	 * 
-	 * @return the current line
-	 */
-	LineBox getCurrentLine();
-
-	/**
-	 * if create a new line, the new line's x will be set correctly without
-	 * considering the new element's left margin.
-	 * 
-	 * @param topMargin
-	 * @return the current line
-	 */
-	LineBox getCurrentLine(int topMargin);
-
-	/**
-	 * Returns the current Y value.
-	 * 
-	 * @return the current Y value
-	 */
-	int getCurrentY();
-
-	/**
-	 * @return <code>true</code> if the current line contains any fragments
-	 */
-	boolean isCurrentLineOccupied();
-
-	/**
-	 * @return the last margin right coord
-	 */
-	int getLastMarginRight();
-
-	/**
-	 * when layout table, we need to calculate max width of a cell. This is done
-	 * by don't break line (other than explicit required). Currently, the
-	 * solution is to make the recommended width to be very big, and when create
-	 * block element we don't set the block element's size to be recommended
-	 * width. Please see CSSBlockFlowLayout
-	 * 
-	 * @return true if is calculating max width
-	 */
-	boolean isCalculatingMaxWidth();
-
-	/**
-	 * when calculating percentage width, we need the container width
-	 * 
-	 * @return container width
-	 */
-	int getContainerWidth();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowFigure.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowFigure.java
deleted file mode 100644
index 6a910d8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowFigure.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.List;
-
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-
-/**
- * The base implementation for text flow figures. A flow figure is used to
- * render a document in which elements are laid out horizontally within a "line"
- * until that line is filled. Layout continues on the next line.
- * <p>
- * WARNING: This class is not intended to be subclassed by clients. Future
- * versions may contain additional abstract methods.
- * 
- * @author mengbo
- * @since 2.1
- */
-public abstract class FlowFigure extends Figure {
-
-	// static final boolean SHOW_BASELINE = true;
-
-	/**
-	 * Constructs a new FlowFigure.
-	 */
-	public FlowFigure() {
-		// setLayoutManager(createDefaultFlowLayout());
-	}
-
-	/**
-	 * If the child is a <code>FlowFigure</code>, its FlowContext is passed
-	 * to it.
-	 * 
-	 * @see org.eclipse.draw2d.IFigure#add(IFigure, Object, int)
-	 */
-	public void add(IFigure child, Object constraint, int index) {
-		super.add(child, constraint, index);
-		if (child instanceof FlowFigure) {
-			FlowFigure ff = (FlowFigure) child;
-			if (getLayoutManager() instanceof FlowContext) {
-				ff.setOriginalFlowContext((FlowContext) getLayoutManager());
-			} else {
-				PDPlugin.getLogger(this.getClass()).error("layout is not FlowContext", new Throwable("This exception is artificial so  we can get a stack trace"));
-			}
-		}
-	}
-
-	/**
-	 * Creates the default layout manager
-	 * 
-	 * @return The default layout
-	 */
-	// protected abstract FlowFigureLayout createDefaultFlowLayout();
-	/**
-	 * @see Figure#paintFigure(Graphics)
-	 */
-	protected void paintFigure(Graphics g) {
-		super.paintFigure(g);
-		// g.drawRectangle(getBounds().getResized(-1,-1));
-	}
-
-	/**
-	 * Called after validate has occurred. This is used to update the bounds of
-	 * the FlowFigure to encompass its new flow boxed created during validate.
-	 */
-	public abstract void postValidate();
-
-	/**
-	 * FlowFigures override setBounds() to prevent translation of children.
-	 * "bounds" is a derived property for FlowFigures, calculated from the
-	 * fragments that make up the FlowFigure.
-	 * 
-	 * @see Figure#setBounds(Rectangle)
-	 */
-	public void setBounds(Rectangle r) {
-		if (getBounds().equals(r))
-			return;
-		erase();
-		bounds.x = r.x;
-		bounds.y = r.y;
-		bounds.width = r.width;
-		bounds.height = r.height;
-		fireFigureMoved();
-		repaint();
-	}
-
-	/**
-	 * Sets the flow context.
-	 * 
-	 * @param flowContext
-	 *            the flow context for this flow figure
-	 */
-	public void setOriginalFlowContext(FlowContext flowContext) {
-		((FlowFigureLayout) getLayoutManager())
-				.setOriginalFlowContext(flowContext);
-	}
-
-	public String toString() {
-		if (_displayString == null)
-        {
-			return super.toString();
-        }
-        return _displayString + " " + getClass().getName();
-	}
-
-	private String _displayString; // for debug
-
-	/**
-	 * @return the flow context
-	 */
-	public FlowContext getFlowContext() {
-		return ((FlowFigureLayout) getLayoutManager()).getFlowContext();
-	}
-
-	// ----------------------------------------------------------------------
-	// as absolute positioning and relative positioning may have children
-	// out-side
-	// of parent bounds, so we want to disable clipping when drawing figures
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Figure#paintChildren(org.eclipse.draw2d.Graphics)
-	 */
-	protected void paintChildren(Graphics graphics) {
-		IFigure child;
-
-		Rectangle clip = Rectangle.SINGLETON;
-		List children = this.getChildren();
-		for (int i = 0; i < children.size(); i++) {
-			child = (IFigure) children.get(i);
-			if (child.isVisible() && child.intersects(graphics.getClip(clip))) {
-				// graphics.clipRect(child.getBounds());
-				child.paint(graphics);
-				graphics.restoreState();
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Figure#paintClientArea(org.eclipse.draw2d.Graphics)
-	 */
-	protected void paintClientArea(Graphics graphics) {
-		if (this.getChildren().isEmpty())
-			return;
-
-		// boolean optimizeClip = getBorder() == null || getBorder().isOpaque();
-
-		if (useLocalCoordinates()) {
-			graphics.translate(getBounds().x + getInsets().left, getBounds().y
-					+ getInsets().top);
-			// if (!optimizeClip)
-			// graphics.clipRect(getClientArea(PRIVATE_RECT));
-			graphics.pushState();
-			paintChildren(graphics);
-			graphics.popState();
-			graphics.restoreState();
-		} else {
-			// if (optimizeClip)
-			paintChildren(graphics);
-			// else {
-			// graphics.clipRect(getClientArea(PRIVATE_RECT));
-			// graphics.pushState();
-			// paintChildren(graphics);
-			// graphics.popState();
-			// graphics.restoreState();
-			// }
-		}
-
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowFigureLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowFigureLayout.java
deleted file mode 100644
index 4a77597..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowFigureLayout.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.draw2d.AbstractLayout;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Dimension;
-
-/**
- * Layout for flow figures
- *
- */
-public abstract class FlowFigureLayout extends AbstractLayout {
-
-	/**
-	 * <code>true</code> if the context has changed, and a layout is needed.
-	 */
-	protected boolean _invalid = true;
-
-	/**
-	 * The flow context in which this LayoutManager exists.
-	 */
-	private FlowContext _context;
-
-	/**
-	 * The figure passed by layout(Figure) is held for convenience.
-	 */
-	private final FlowFigure _flowFigure;
-
-	/**
-	 * Constructs a new FlowFigureLayout with the given FlowFigure.
-	 * 
-	 * @param flowfigure
-	 *            the FlowFigure
-	 */
-	protected FlowFigureLayout(FlowFigure flowfigure) {
-		this._flowFigure = flowfigure;
-	}
-
-	/**
-	 * TextFlowLayouts do not calculate a preferred size because it is too
-	 * expensive. {@link FlowPage}will actually layout itself in order to
-	 * calculate preferredSize.
-	 * 
-	 * @see AbstractLayout#calculatePreferredSize(IFigure)
-	 */
-	public Dimension calculatePreferredSize(IFigure f, int w, int h) {
-		return null;
-	}
-
-	/**
-	 * @return the FlowFigure
-	 */
-	protected FlowFigure getFlowFigure() {
-		return _flowFigure;
-	}
-
-	/**
-	 * Marks this layout as invalid.
-	 * 
-	 * @see org.eclipse.draw2d.LayoutManager#invalidate()
-	 */
-	public void invalidate() {
-		_invalid = true;
-		super.invalidate();
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.LayoutManager#layout(IFigure)
-	 */
-	public final void layout(IFigure figure) {
-		layout();
-		_invalid = false;
-	}
-
-	/**
-	 * Called during {@link #layout(IFigure)}. The {@link  #_invalid}flag is
-	 * reset after this method is called.
-	 */
-	protected abstract void layout();
-
-	/**
-	 * Sets the context for this layout manager.
-	 * 
-	 * @param flowContext
-	 *            the context of this layout
-	 */
-	public void setOriginalFlowContext(FlowContext flowContext) {
-		_context = flowContext;
-	}
-
-	/**
-	 * @return the original flow context
-	 */
-	protected final FlowContext getOriginalFlowContext() {
-		return _context;
-	}
-
-	/**
-	 * get flow context.
-	 * 
-	 * @return the flow context
-	 */
-	public FlowContext getFlowContext() {
-		return _context;
-	}
-
-	public String toString() {
-		// for debug purpose.
-		return _flowFigure.toString();
-	}
-
-	/**
-	 * Called to dispose the layout
-	 */
-	abstract public void dispose();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowPage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowPage.java
deleted file mode 100644
index cd81a03..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowPage.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.Iterator;
-
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Rectangle;
-
-/**
- * The root of a Flow hierarchy. A flow page can be treated as a normal figure,
- * but contains FlowFigures.
- * <P>
- * A FlowPage will not have a defined width unless it is inside a figure whose
- * layout provides width hints when calling
- * {@link org.eclipse.draw2d.IFigure#getPreferredSize(int, int)}.
- * <P>
- * WARNING: This class is not intended to be subclassed by clients.
- */
-public class FlowPage extends BlockFlow {
-
-	private Dimension _pageSize = new Dimension();
-
-	private int _recommendedWidth;
-
-	private int _pageSizeCacheKeys[] = new int[4];
-
-	private Dimension _pageSizeCacheValues[] = new Dimension[4];
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.BlockFlow#createDefaultFlowLayout()
-	 */
-	protected FlowFigureLayout createDefaultFlowLayout() {
-		return new PageFlowLayout(this);
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.Figure#getMinimumSize()
-	 */
-	public Dimension getMinimumSize(int w, int h) {
-		return getPreferredSize(w, h);
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.Figure#invalidate()
-	 */
-	public void invalidate() {
-		_pageSizeCacheValues = new Dimension[4];
-		super.invalidate();
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.Figure#getPreferredSize(int, int)
-	 */
-	public Dimension getPreferredSize(int width, int h) {
-		if (width >= 0)
-			width = Math.max(0, width - getInsets().getWidth());
-
-		for (int i = 0; i < 4; i++) {
-			if (_pageSizeCacheKeys[i] == width
-					&& _pageSizeCacheValues[i] != null)
-				return _pageSizeCacheValues[i];
-		}
-
-		_pageSizeCacheKeys[3] = _pageSizeCacheKeys[2];
-		_pageSizeCacheKeys[2] = _pageSizeCacheKeys[1];
-		_pageSizeCacheKeys[1] = _pageSizeCacheKeys[0];
-		_pageSizeCacheKeys[0] = width;
-
-		_pageSizeCacheValues[3] = _pageSizeCacheValues[2];
-		_pageSizeCacheValues[2] = _pageSizeCacheValues[1];
-		_pageSizeCacheValues[1] = _pageSizeCacheValues[0];
-
-		// Flowpage must temporarily layout to determine its preferred size
-		int oldWidth = getRecommendedWidth();
-		setRecommendedWidth(width);
-		validate();
-		_pageSizeCacheValues[0] = _pageSize.getExpanded(getInsets().getWidth(),
-				getInsets().getHeight());
-
-		if (width != oldWidth) {
-			setRecommendedWidth(oldWidth);
-			getUpdateManager().addInvalidFigure(this);
-		}
-		return _pageSizeCacheValues[0];
-	}
-
-	int getRecommendedWidth() {
-		return _recommendedWidth;
-	}
-
-	/**
-	 * @see BlockFlow#postValidate()
-	 */
-	public void postValidate() {
-		Rectangle r = getBlockBox().toRectangle();
-		_pageSize.width = r.width;
-		_pageSize.height = r.height;
-		for (final Iterator it = getChildren().iterator(); it.hasNext();)
-        {
-            ((FlowFigure)it.next()).postValidate();            
-        }
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigure#setBounds(Rectangle)
-	 */
-	public void setBounds(Rectangle r) {
-		if (getBounds().equals(r))
-			return;
-		boolean invalidate = getBounds().width != r.width
-				|| getBounds().height != r.height;
-		super.setBounds(r);
-		int newWidth = r.width - getInsets().getWidth();
-		if (invalidate || getRecommendedWidth() != newWidth) {
-			setRecommendedWidth(newWidth);
-			getUpdateManager().addInvalidFigure(this);
-		}
-	}
-
-	private void setRecommendedWidth(int width) {
-		if (_recommendedWidth == width)
-			return;
-		_recommendedWidth = width;
-		super.invalidate();
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.Figure#validate()
-	 */
-	public void validate() {
-		if (isValid())
-			return;
-		super.validate();
-		postValidate();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Figure#setValid(boolean)
-	 */
-	public void setValid(boolean value) {
-		super.setValid(value);
-	}
-
-	public Insets getInsets() {
-		return new Insets(8);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowUtilities.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowUtilities.java
deleted file mode 100644
index 6cd9e19..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/FlowUtilities.java
+++ /dev/null
@@ -1,271 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.text.BreakIterator;
-
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontMetrics;
-
-/**
- * Utility class for FlowFigures.
- * 
- */
-public final class FlowUtilities extends FigureUtilities {
-	/**
-	 * Returns the number of characters from the specified String that will fit
-	 * in the available amount of space. An average character width can be
-	 * provided as a hint for faster calculation.
-	 * 
-	 * @param frag
-	 *            the TextFragmentBox
-	 * @param string
-	 *            the String
-	 * @param font
-	 *            the Font used for measuring
-	 * @param availableWidth
-	 *            the available width in pixels
-	 * @param avg
-	 *            0.0, or an avg character width to use during calculation
-	 * @param wrapping
-	 *            the word wrap style
-	 * @return the number of characters that will fit in the space
-	 */
-	public static int setupFragmentBasedOnTextSpace(TextFragmentBox frag,
-			String string, Font font, int availableWidth, float avg,
-			int wrapping) {
-		int result = getTextForSpace(string, font, availableWidth, avg,
-				wrapping);
-		frag._length = result;
-		setupFragment(frag, font, string);
-		return result;
-	}
-
-	/**
-	 * given the text string, font and available width and wrapping mode.
-	 * Calculate how much text can fit into.
-	 * 
-	 * @param string
-	 * @param font
-	 * @param availableWidth
-	 * @param avg
-	 * @param wrapping
-	 * @return how much text can fit into
-	 */
-	public static int getTextForSpace(String string, Font font,
-			int availableWidth, float avg, int wrapping) {
-		if (string.length() == 0) {
-			return 0;
-		}
-
-		FontMetrics metrics = getFontMetrics(font);
-		BreakIterator breakItr = BreakIterator.getLineInstance();
-		breakItr.setText(string);
-		int MIN, min, max;
-		if (avg == 0.0) {
-			avg = metrics.getAverageCharWidth();
-		}
-
-		int firstBreak = breakItr.next();
-
-		int winNL = string.indexOf("\r\n"); //$NON-NLS-1$
-		int macNL = string.indexOf('\r');
-		int unixNL = string.indexOf('\n');
-
-		MIN = min = (wrapping == CSSTextLayout.WORD_WRAP_HARD) ? firstBreak : 1;
-		if (macNL == winNL) {
-			macNL = -1; // If the Mac newline is just the prefix to the win NL,
-			// ignore it
-		}
-
-		max = string.length() + 1;
-
-		if (winNL != -1) {
-			max = Math.min(max, winNL);
-			min = Math.min(min, winNL);
-		}
-		if (unixNL != -1) {
-			max = Math.min(max, unixNL);
-			min = Math.min(min, unixNL);
-		}
-		if (macNL != -1) {
-			max = Math.min(max, macNL);
-			min = Math.min(min, macNL);
-		}
-
-		int origMax = max;
-		// The size of the current guess
-		int guess = 0, guessSize = 0;
-
-		while ((max - min) > 1) {
-			// Pick a new guess size
-			// New guess is the last guess plus the missing width in pixels
-			// divided by the average character size in pixels
-			guess = guess + (int) ((availableWidth - guessSize) / avg);
-
-			if (guess >= max) {
-				guess = max - 1;
-			}
-			if (guess <= min) {
-				guess = min + 1;
-			}
-
-			// Measure the current guess
-			guessSize = getStringExtents2(string.substring(0, guess), font).width;
-
-			if (guessSize <= availableWidth) {
-				// We did not use the available width
-				min = guess;
-			} else {
-				// We exceeded the available width
-				max = guess;
-			}
-		}
-
-		int result = string.length();
-		switch (wrapping) {
-		case CSSTextLayout.WORD_WRAP_HARD:
-			if (min == string.length() || min == winNL || min == unixNL
-					|| min == macNL) {
-				result = min;
-			} else if (max == origMax
-					&& getStringExtents2(string.substring(0, max), font).width <= availableWidth) {
-				result = max;
-			} else {
-				result = Math.max(MIN, breakItr.preceding(Math.min(max, string
-						.length() - 1)));
-			}
-			break;
-
-		case CSSTextLayout.WORD_WRAP_SOFT:
-			if (min == string.length() || min == winNL || min == unixNL
-					|| min == macNL) {
-				result = min;
-			} else if (max == origMax
-					&& getStringExtents2(string.substring(0, max), font).width <= availableWidth) {
-				result = max;
-			} else if (breakItr.isBoundary(min)) {
-				result = min;
-			} else if (breakItr.isBoundary(Math.min(max, string.length() - 1))) {
-				result = max;
-			} else {
-				result = breakItr.preceding(Math.min(max, string.length() - 1));
-			}
-			if (result <= 0) {
-				result = min;
-			}
-			break;
-		// case CSSTextLayout.WORD_WRAP_TRUNCATE:
-		// if (min == string.length() || min == winNL || min == unixNL || min ==
-		// macNL)
-		// {
-		// result = frag._length = min;
-		// setupFragment(frag, font, string);
-		// if (frag.getWidth() <= availableWidth)
-		// return result;
-		// min -= 1;
-		// }
-		// else if (max == origMax && getStringExtents(string.substring(0, max),
-		// font).width <= availableWidth)
-		// {
-		// result = frag._length = max;
-		// setupFragment(frag, font, string);
-		// return result;
-		// }
-		// result = breakItr.preceding(Math.min(max + 1, string.length() - 1));
-		// if (result <= 0)
-		// {
-		// ELLIPSIS_SIZE =
-		// FigureUtilities.getStringExtents(CSSTextFigure.ELLIPSIS, font);
-		// getTextForSpace(frag, string, font, availableWidth -
-		// ELLIPSIS_SIZE.width, avg, CSSTextLayout.WORD_WRAP_SOFT);
-		// //frag.length = min;
-		// frag._truncated = true;
-		// result = breakItr.following(min);
-		// if (result == BreakIterator.DONE)
-		// result = string.length();
-		// }
-		// else
-		// {
-		// frag._length = result;
-		// }
-		}
-
-		return result;
-	}
-
-	/**
-	 * @param string
-	 * @param font
-	 * @param availableWidth
-	 * @param avg
-	 * @return the text width
-	 */
-	public static int getTextInWidth(String string, Font font,
-			int availableWidth, float avg) {
-		if (string.length() == 0) {
-			return 0;
-		}
-		int guess = 0;
-		while (true) {
-			Dimension a = getTextExtents(string.substring(0, guess), font);
-			if (a.width >= availableWidth) {
-				return guess;
-			}
-			guess++;
-			if (guess == string.length()) {
-				return guess;
-			}
-		}
-	}
-
-	/**
-	 * change the parent implementation of getStringExtents(). Don't expend the
-	 * 1 width. So empty string will not have any width.
-	 * 
-	 * @param s
-	 * @param f
-	 * @return the dimension
-	 */
-	public static Dimension getStringExtents2(String s, Font f) {
-		return new Dimension(getStringDimension(s, f));
-	}
-
-	static void setupFragment(TextFragmentBox frag, Font f, String s) {
-		// if (frag.length != s.length())
-		// we don't skip whitespace here. since already truncated in
-		// CSSTextLayout
-
-		// while (frag.length > 0 &&
-		// Character.isElementContentWhitespace(s.charAt(frag.length - 1)))
-		// frag.length--;
-		frag.setTextData(s.substring(0, frag._length));
-		Dimension d = getStringExtents2(s.substring(0, frag._length), f);
-		FontMetrics fm = getFontMetrics(f);
-		frag.setHeight(fm.getHeight());
-		frag.setAscent(fm.getAscent() + fm.getLeading());
-		if (frag._length > 0
-				&& Character.isWhitespace(s.charAt(frag._length - 1))) {
-			frag._isLastCharWhitespace = true;
-		} else {
-			frag._isLastCharWhitespace = false;
-		}
-		frag.setWidth(d.width);
-	}
-
-	private FlowUtilities()
-	{
-	    // no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/ICSSFigure.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/ICSSFigure.java
deleted file mode 100644
index cecf650..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/ICSSFigure.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-
-/**
- * @author mengbo
- */
-public interface ICSSFigure extends IFigure {
-	/**
-	 * get fragments of this figure. Each item of the list will be a FlowBox.
-	 * Note, this method is for read only, caller should not change the returned
-	 * list and items in the returned list.
-	 * 
-	 * @return the list of fragments
-	 */
-	public List getFragmentsForRead();
-
-	/**
-	 * get the CSSStyle of this CSS figure.
-	 * 
-	 * @return the css style
-	 */
-	public ICSSStyle getCSSStyle();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/ICSSLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/ICSSLayout.java
deleted file mode 100644
index f17c54a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/ICSSLayout.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.draw2d.LayoutManager;
-
-/**
- * There are several kinds of layout involved. 1. the layout need let the child
- * figures do certain layouting of themselves first, then decide the final
- * result based on child information. 2. the layout could decide the size
- * information of this figure without child information.
- * 
- * @author mengbo
- * @version 1.5
- */
-public interface ICSSLayout extends LayoutManager {
-	/**
-	 * Each ICSSLayout is dedicated to a single CSSFigure.
-	 * 
-	 * @return the figure
-	 */
-	public ICSSFigure getICSSFigure();
-
-	/**
-	 * 
-	 * @return
-	 */
-	// public List getFragmentsForRead();
-	/**
-	 * postValidate the child figures of this CSSFigure. Normally layout fall
-	 * into the first category need implement this method.
-	 */
-	// public void postValidate();
-	/**
-	 * setBounds is called on the CSSFigure. Normally layout fall into the
-	 * second category need implement this method.
-	 * 
-	 * @param rect
-	 * @param invalidate
-	 */
-	// public void setBoundsCalled(Rectangle rect, boolean invalidate);
-	/**
-	 * @return
-	 */
-	// public boolean useLocalCoordinates();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/ICSSPainter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/ICSSPainter.java
deleted file mode 100644
index 5f83cb8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/ICSSPainter.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.draw2d.Graphics;
-
-/**
- * @author mengbo
- */
-public interface ICSSPainter {
-	/**
-	 * this method is called in the figure's <code>paintFigure</code> method,
-	 * before <code>paintClientArea</code>. So it is called before children.
-	 * Thus, children may override its effects.
-	 * 
-	 * @param g
-	 */
-	public void paintFigure(Graphics g);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/ICSSPainter2.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/ICSSPainter2.java
deleted file mode 100644
index f93fb84..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/ICSSPainter2.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.draw2d.Graphics;
-
-/**
- * If the layout implements this interface, then it will have chance to paint
- * something to override children effect.
- * 
- * @see org.eclipse.jst.pagedesigner.css2.layout.ICSSPainter
- * @see org.eclipse.jst.pagedesigner.css2.layout.CSSFigure
- * 
- * @author mengbo
- * @version 1.5
- */
-public interface ICSSPainter2 {
-	/**
-	 * this method is called after <code>paintClientArea</code>. So it is
-	 * called after children. Thus, it could override some children effects.
-	 * 
-	 * @param g
-	 */
-	public void paintFigurePostClientArea(Graphics g);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/LineBox.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/LineBox.java
deleted file mode 100644
index fcfe8b4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/LineBox.java
+++ /dev/null
@@ -1,424 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.jst.pagedesigner.css2.property.VerticalAlignMeta;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-import org.eclipse.swt.graphics.FontMetrics;
-
-/**
- * A composite box representing a single line. LineBox calculates its ascent and
- * descent from the child boxes it contains. Clients can call
- * {@link #getAscent()} at any time and expect valid
- * values. The child boxes that are added to a line have unspecied locations
- * until {@link #commit()}is called, at which time the child boxes are layed
- * out in left-to-right order, and their baselines are all aligned vertically.
- * 
- */
-public class LineBox extends CompositeBox {
-	private final static int BASELINE = 0;
-
-	private final static int MIDDLE = 1;
-
-	private final static int SUB = 2;
-
-	private final static int SUPER = 3;
-
-	private final static int TEXT_TOP = 4;
-
-	private final static int TEXT_BOTTOM = 5;
-
-	private final static int TOP = 6;
-
-	private final static int BOTTOM = 7;
-
-	private final static int LENGTH = 8;
-
-	private int _ascent = 0;
-
-	private int _descent = 0;
-
-	private int _fontAscent = 0;
-
-	private int _fontDescent = 0;
-
-	private int _fontLeading = 0;
-
-	private Object _horizonalData = null;
-
-	private Object _htmlInitData = null;
-
-	private int _accumlatedWidth = 0;
-
-	/**
-	 * Removes all owned fragments and invalidates this CompositeBox.
-	 */
-	public void clear() {
-		super.clear();
-		_horizonalData = null;
-		_htmlInitData = null;
-	}
-
-	/**
-	 * Committing a LineBox will position its children correctly. All children
-	 * boxes are made to have the same baseline, and are layed out from
-	 * left-to-right.
-	 */
-	public void commit() {
-		int baseline = getBaseline();
-		int xLocation = _x;
-		for (int i = 0; i < _fragments.size(); i++) {
-			FlowBox block = (FlowBox) _fragments.get(i);
-			block._x = xLocation + block.getMarginInsets().left;
-			xLocation = block._x + block._width + block.getMarginInsets().right;
-
-			if (_fragments.size() > 1 && block instanceof TextFragmentBox) {
-				TextFragmentBox textBox = (TextFragmentBox) block;
-				if (textBox.getTextData().length() == 0) {
-					textBox._height = _fontAscent + _fontDescent + _fontLeading;
-					textBox.setAscent(_fontAscent + _fontLeading);
-					block._y = this._y;
-					continue;
-				}
-			}
-
-			switch (getVerticalAlignType(block)) {
-			case TOP:
-				block._y = this._y;
-				break;
-			case BOTTOM:
-				block._y = this.getBaseline() - (block.getHeight() - _descent);
-				break;
-			case MIDDLE:
-				int halfXHeight = getHalfXHeight();
-				block._y = this.getBaseline() - halfXHeight
-						- (block.getHeight() + 1) / 2;
-				break;
-			case TEXT_TOP:
-				block._y = this.getBaseline() - _fontAscent - _fontLeading;
-				break;
-			case TEXT_BOTTOM:
-				block._y = this.getBaseline() - (block._height - _fontDescent);
-				break;
-			case LENGTH:
-				block._y = this.getBaseline() + getIncrement(block);
-				break;
-			case SUPER:
-				block._y = this.getBaseline() - getHalfXHeight() * 2
-						- block._height;
-				break;
-			case SUB:
-				block._y = this.getBaseline() - block._height * _fontLeading
-						/ getFontHeight();
-				break;
-			case BASELINE:
-			default:
-				block.makeBaseline(baseline);
-				break;
-			}
-			if (block instanceof LineBox) {
-				((LineBox) block).commit();
-			}
-		}
-	}
-
-	private int getVerticalAlignType(FlowBox box) {
-		Object data = box.getVerticalAlignData();
-
-		if (data != null) {
-			if (data instanceof Length) {
-				return LENGTH;
-			} else if (VerticalAlignMeta.BASELINE.equals(data)) {
-				return BASELINE;
-			} else if (VerticalAlignMeta.MIDDLE.equals(data)) {
-				return MIDDLE;
-			} else if (VerticalAlignMeta.SUB.equals(data)) {
-				return SUB;
-			} else if (VerticalAlignMeta.SUPER.equals(data)) {
-				return SUPER;
-			} else if (VerticalAlignMeta.TEXT_TOP.equals(data)) {
-				return TEXT_TOP;
-			} else if (VerticalAlignMeta.TEXT_BOTTOM.equals(data)) {
-				return TEXT_BOTTOM;
-			} else if (VerticalAlignMeta.TOP.equals(data)) {
-				return TOP;
-			} else if (VerticalAlignMeta.BOTTOM.equals(data)) {
-				return BOTTOM;
-			}
-			return BASELINE;
-		}
-		return BASELINE;
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowBox#getAscent()
-	 */
-	public int getAscent() {
-		// because at initial, ascent is 0. And the linebox
-		// could have some size setting without children. In
-		// that case, we need handle differently.
-		if (_ascent == 0 && _fragments.isEmpty()) {
-			return getHeight();
-		}
-		return _ascent;
-	}
-
-	/**
-	 * Returns the width available to child fragments.
-	 * 
-	 * @return the width in pixels
-	 */
-	public int getAvailableWidth() {
-		if (_recommendedWidth < 0) {
-			return Integer.MAX_VALUE;
-		}
-		int availableWidth = _recommendedWidth - _accumlatedWidth;
-		if (availableWidth < 0) {
-			availableWidth = 0;
-		}
-		return availableWidth;
-	}
-
-	/**
-	 * Returns the baseline of this LineBox, which is the y value plus the
-	 * ascent.
-	 * 
-	 * @return the baseline value.
-	 */
-	public int getBaseline() {
-		return _y + getAscent();
-	}
-
-	/**
-	 * @see CompositeBox#resetInfo()
-	 */
-	protected void resetInfo() {
-		super.resetInfo();
-		_accumlatedWidth = 0;
-		_ascent = 0;
-	}
-
-	/**
-	 * @see CompositeBox#unionInfo(FlowBox)
-	 */
-	protected void unionInfo(FlowBox blockInfo) {
-		if (blockInfo instanceof TextFragmentBox) {
-			if (((TextFragmentBox) blockInfo).getTextData().length() == 0) {
-				return;
-			}
-		}
-
-		if (_fragments == null || _fragments.isEmpty()) {
-			this._ascent = 0;
-			this._descent = 0;
-			this._height = 0;
-		}
-
-		int valign = getVerticalAlignType(blockInfo);
-
-		if (valign == BASELINE) {
-			_ascent = Math.max(_ascent, blockInfo.getAscent());
-			if (blockInfo instanceof WidgetBox) {
-				_descent = 0;
-			} else {
-				_descent = Math.max(_descent, blockInfo.getDescent());
-			}
-			_height = Math.max(_height, _ascent + _descent);
-		} else if (valign == MIDDLE) {
-			int halfXHeight = getHalfXHeight();
-			_ascent = Math.max(_ascent, (blockInfo.getHeight() + 1) / 2
-					+ halfXHeight);
-			_descent = Math.max(_descent, blockInfo.getHeight() / 2
-					- halfXHeight);
-			_height = Math.max(_height, _ascent + _descent);
-		} else if (valign == TEXT_TOP) {
-			_ascent = Math.max(_ascent, _fontAscent + _fontLeading);
-			_descent = Math.max(_descent, blockInfo.getHeight() - _fontAscent
-					- _fontLeading);
-			_height = Math.max(_height, _ascent + _descent);
-		} else if (valign == TEXT_BOTTOM) {
-			_ascent = Math.max(_ascent, blockInfo.getHeight() - _fontDescent);
-			_descent = Math.max(_descent, _fontDescent);
-			_height = Math.max(_height, _ascent + _descent);
-		} else if (valign == SUB) {
-			int blockTop = blockInfo._height * _fontLeading / getFontHeight();
-			_ascent = Math.max(_ascent, blockTop);
-			_descent = Math.max(_descent, blockInfo.getHeight() - blockTop);
-			_height = Math.max(_height, _ascent + _descent);
-		} else if (valign == SUPER) {
-			int blockTop = blockInfo._height;
-			_ascent = Math.max(_ascent, getHalfXHeight() * 2 + blockTop);
-			_height = Math.max(_height, _ascent + _descent);
-		} else if (valign == LENGTH) {
-			int increment = getIncrement(blockInfo);
-			_ascent = Math.max(_ascent, blockInfo.getAscent() + increment);
-			_descent = Math.max(_descent, blockInfo.getDescent() - increment);
-			_height = Math.max(_height, _ascent + _descent);
-		} else if (valign == TOP) {
-			_descent = Math.max(_descent, blockInfo.getHeight() - _ascent);
-			_height = Math.max(_height, _ascent + _descent);
-		} else if (valign == BOTTOM) {
-			// XXX:the render of IE is not consistent with spec, mozilla is. so
-			// we follow mozilla's implementation.
-			_ascent = Math.max(_ascent, blockInfo.getHeight() - _descent);
-			_height = Math.max(_height, _ascent + _descent);
-		} else {
-			_ascent = Math.max(_ascent, blockInfo.getAscent());
-			_descent = Math.max(_descent, blockInfo.getDescent());
-			_height = Math.max(_height, blockInfo.getHeight());
-		}
-
-		_accumlatedWidth += blockInfo._width
-				+ blockInfo.getMarginInsets().getWidth();
-		if (_accumlatedWidth > _width) {
-			_width = _accumlatedWidth;
-		}
-	}
-
-	private int getIncrement(FlowBox blockInfo) {
-		int valign = getVerticalAlignType(blockInfo);
-		if (valign == LENGTH) {
-			int increment = 0;
-			Length length = (Length) blockInfo.getVerticalAlignData();
-			if (length.isPercentage()) {
-				increment = length.getValue() * getFontHeight() / 100;
-			} else {
-				increment = length.getValue();
-			}
-			return increment;
-		}
-		return 0;
-	}
-
-	/**
-	 * @return true if is occupied
-	 * @see org.eclipse.draw2d.geometry.Rectangle#isEmpty()
-	 */
-	public boolean isOccupied() {
-		if (_width > 0) {
-			return true;
-		}
-
-		if (_fragments.isEmpty()) {
-			return false;
-		}
-		// int size = _fragments.size();
-		// if (size > 1)
-		// {
-		// return true;
-		// }
-		// ok, we have one segment
-		// FlowBox box = (FlowBox) _fragments.get(0);
-		// if (box instanceof TextFragmentBox)
-		// {
-		// if (((TextFragmentBox) box).getTextData().length() == 0)
-		// {
-		// // this is an empty string text box.
-		// return false;
-		// }
-		// }
-		return true;
-	}
-
-	/**
-	 * @return true if is empty string line
-	 */
-	public boolean isEmptyStringLine() {
-		// if(this.getWidth() == 0)
-		// {
-		// return true;
-		// }
-		// else
-		// {
-		// return false;
-		// }
-		if (_fragments.size() == 1) {
-			FlowBox box = (FlowBox) _fragments.get(0);
-			if (box instanceof TextFragmentBox) {
-				if (box instanceof TextFragmentBox) {
-					if (((TextFragmentBox) box).getTextData().length() == 0) {
-						return true;
-					}
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @param fontMetrics
-	 */
-	public void setFontMetrics(FontMetrics fontMetrics) {
-		if (fontMetrics != null) {
-			_fontAscent = fontMetrics.getAscent();
-			_fontDescent = fontMetrics.getDescent();
-			_fontLeading = fontMetrics.getLeading();
-			// if (_fragments == null || _fragments.isEmpty())
-			// {
-			// this._ascent = _fontAscent + _fontLeading;
-			// this._descent = _fontDescent;
-			// if (this._height < this._ascent + this._descent)
-			// {
-			// this._height = this._ascent + this._descent;
-			// }
-			// }
-		} else {
-			_fontAscent = 0;
-			_fontDescent = 0;
-			_fontLeading = 0;
-		}
-	}
-
-	private int getHalfXHeight() {
-		return (_fontAscent + _fontDescent + _fontLeading) / 5;
-	}
-
-	private int getFontHeight() {
-		return _fontAscent + _fontDescent + _fontLeading;
-	}
-
-	/**
-	 * @return Returns the horizonalData.
-	 */
-	public Object getHorizonalData() {
-		return _horizonalData;
-	}
-
-	/**
-	 * @param horizonalData
-	 *            The horizonalData to set.
-	 */
-	public void setHorizonalData(Object horizonalData) {
-		this._horizonalData = horizonalData;
-	}
-
-	/**
-	 * @return Returns the htmlInitData.
-	 */
-	public Object getHtmlInitData() {
-		return _htmlInitData;
-	}
-
-	/**
-	 * @param htmlInitData
-	 *            The htmlInitData to set.
-	 */
-	public void setHtmlInitData(Object htmlInitData) {
-		this._htmlInitData = htmlInitData;
-	}
-
-    @Override
-    public void setY(int y) {
-        // make set y public
-        super.setY(y);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/MultiLineLabel.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/MultiLineLabel.java
deleted file mode 100644
index e49872c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/MultiLineLabel.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontMetrics;
-
-/**
- * A multi-line label
- *
- */
-public class MultiLineLabel extends Label {
-	private static String ELLIPSIS = "..."; //$NON-NLS-1$
-
-	protected void paintFigure(Graphics graphics) {
-		if (isOpaque()) {
-			graphics.fillRectangle(getBounds());
-		}
-		Rectangle bounds1 = getBounds();
-		graphics.translate(bounds1.x, bounds1.y);
-		drawText(graphics);
-		graphics.translate(-bounds1.x, -bounds1.y);
-	}
-
-	private void drawText(Graphics graphics) {
-		String[] strings = splitString(getText());
-		int y = 0;
-		int lineHeight = FigureUtilities.getFontMetrics(getFont()).getHeight();
-		for (int i = 0; i < strings.length; i++) {
-			graphics.drawText(getSubStringText(strings[i]), 0, y);
-			y += lineHeight;
-		}
-
-	}
-
-	private String[] splitString(String text) {
-		String[] lines = new String[1];
-		int start = 0, pos;
-		do {
-			pos = text.indexOf('\n', start);
-			if (pos == -1) {
-				lines[lines.length - 1] = text.substring(start);
-			} else {
-				boolean crlf = (pos > 0) && (text.charAt(pos - 1) == '\r');
-				lines[lines.length - 1] = text.substring(start, pos
-						- (crlf ? 1 : 0));
-				start = pos + 1;
-				String[] newLines = new String[lines.length + 1];
-				System.arraycopy(lines, 0, newLines, 0, lines.length);
-				lines = newLines;
-			}
-		} while (pos != -1);
-		return lines;
-	}
-
-	/**
-	 * @param text
-	 * @return the substring text
-	 */
-	private String getSubStringText(String text) {
-		String subStringText = text;
-
-		Font currentFont = getFont();
-		int textWidth = FigureUtilities.getTextWidth(text, currentFont);
-		if (textWidth - getSize().width <= 0) {
-			return subStringText;
-		}
-
-		Dimension effectiveSize = new Dimension(getSize().width, 0);
-
-		int dotsWidth = FigureUtilities.getTextWidth(ELLIPSIS, currentFont);
-
-		if (effectiveSize.width < dotsWidth) {
-			effectiveSize.width = dotsWidth;
-		}
-
-		int subStringLength = getLargestSubstringConfinedTo(text, currentFont,
-				effectiveSize.width - dotsWidth);
-		subStringText = new String(text.substring(0, subStringLength)
-				+ ELLIPSIS);
-		return subStringText;
-	}
-
-	int getLargestSubstringConfinedTo(String s, Font f, int availableWidth) {
-		FontMetrics metrics = FigureUtilities.getFontMetrics(f);
-		int min, max;
-		float avg = metrics.getAverageCharWidth();
-		min = 0;
-		max = s.length() + 1;
-
-		// The size of the current guess
-		int guess = 0, guessSize = 0;
-		while ((max - min) > 1) {
-			// Pick a new guess size
-			// New guess is the last guess plus the missing width in pixels
-			// divided by the average character size in pixels
-			guess = guess + (int) ((availableWidth - guessSize) / avg);
-
-			if (guess >= max) {
-				guess = max - 1;
-			}
-			if (guess <= min) {
-				guess = min + 1;
-			}
-
-			// Measure the current guess
-			guessSize = FigureUtilities
-					.getTextExtents(s.substring(0, guess), f).width;
-
-			if (guessSize < availableWidth) {
-				// We did not use the available width
-				min = guess;
-			} else {
-				// We exceeded the available width
-				max = guess;
-			}
-		}
-		return min;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/PageFlowLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/PageFlowLayout.java
deleted file mode 100644
index 33ff6a1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/PageFlowLayout.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.jst.pagedesigner.css2.font.CSSFont;
-import org.eclipse.jst.pagedesigner.css2.font.CSSFontManager;
-import org.eclipse.swt.graphics.Font;
-
-/**
- * A block layout which requires no FlowContext to perform its layout. This
- * class is used by {@link FlowPage}.
- * <p>
- * WARNING: This class is not intended to be subclassed by clients.
- */
-public class PageFlowLayout extends BlockFlowLayout {
-
-	/**
-	 * Creates a new PageFlowLayout with the given FlowPage
-	 * 
-	 * @param page
-	 *            the FlowPage
-	 */
-	public PageFlowLayout(FlowPage page) {
-		super(page);
-	}
-
-	/**
-	 * @see BlockFlowLayout#endBlock()
-	 */
-	protected void endBlock() {
-        // do nothing
-	}
-
-	/**
-	 * 
-	 */
-	public void postValidate() {
-       // TODO: This method is not being called.
-	}
-
-	protected void setupLine(LineBox line, int topMargin) {
-		super.setupLine(line, topMargin);
-
-		CSSFontManager fontManager = CSSFontManager.getInstance();
-		Font font = fontManager.getSwtFont((CSSFont) fontManager
-				.createDefaultFont());
-		line.setFontMetrics(FigureUtilities.getFontMetrics(font));
-	}
-
-	/**
-	 * Setup blockBox to the initial bounds of the Page
-	 */
-	protected void setupBlock() {
-		// Remove all current Fragments
-		_blockBox.clear();
-
-		// Setup the one fragment for this Block with the correct X and
-		// available width
-		_blockBox.setRecommendedWidth(((FlowPage) getFlowFigure())
-				.getRecommendedWidth());
-		_blockBox._x = 0;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/TextFragmentBox.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/TextFragmentBox.java
deleted file mode 100644
index 58776e4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/TextFragmentBox.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-/**
- * A Geometric object for representing a TextFragment region on a line of Text.
- */
-public class TextFragmentBox extends FlowBox {
-
-	/** The offset in pixels * */
-	public int _offset;
-
-	/** The length in pixels * */
-	public int _length;
-
-	private int _ascent;
-
-	// boolean _truncated;
-
-	/*package*/ boolean _isLastCharWhitespace = false;
-
-	private String _textData;
-
-	/**
-	 * Creates a new TextFragmentBox
-	 */
-	public TextFragmentBox() {
-        // do nothgin
-	}
-
-	/**
-	 * Returns the ascent of this TextFragmentBox
-	 * 
-	 * @return the ascent
-	 */
-	public int getAscent() {
-		return _ascent;
-	}
-
-	/**
-	 * Sets the ascent of this TextFragmentBox to the given value
-	 * 
-	 * @param a
-	 *            the ascent
-	 */
-	public void setAscent(int a) {
-		_ascent = a;
-	}
-
-	/**
-	 * Sets the height of this TextFragmentBox to the given value
-	 * 
-	 * @param h
-	 *            the height
-	 */
-	public void setHeight(int h) {
-		_height = h;
-	}
-
-	/**
-	 * Sets the width of this TextFragmentBox to the given value
-	 * 
-	 * @param w
-	 *            the width
-	 */
-	public void setWidth(int w) {
-		_width = w;
-	}
-
-	/**
-	 * @return the text data
-	 */
-	public String getTextData() {
-		return _textData;
-	}
-
-	/**
-	 * @param txt
-	 */
-	public void setTextData(String txt) {
-		_textData = txt;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/TextLayoutSupport.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/TextLayoutSupport.java
deleted file mode 100644
index 65ca4c1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/TextLayoutSupport.java
+++ /dev/null
@@ -1,427 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-import java.util.List;
-
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.css2.property.TextDecorationMeta;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-
-/**
- * @author mengbo
- */
-public class TextLayoutSupport {
-	private static final Logger _log = PDPlugin
-			.getLogger(TextLayoutSupport.class);
-
-	private static final String[] DELIMITERS = { "\r\n", //$NON-NLS-1$
-			"\n", //$NON-NLS-1$
-			"\r" //$NON-NLS-1$
-	}; //$NON-NLS-1$
-
-	static private int delimeterLength;
-
-	/**
-	 * Reuses an existing <code>TextFragmentBox</code>, or creates a new one.
-	 * 
-	 * @param i
-	 *            the index
-	 * @param fragments
-	 *            the original list of fragments
-	 * @return a TextFragmentBox
-	 */
-	// copied from TextLayout
-	protected static TextFragmentBox getFragment(int i, List fragments) {
-		if (fragments.size() > i) {
-			return (TextFragmentBox) fragments.get(i);
-		}
-		TextFragmentBox box = new TextFragmentBox();
-		fragments.add(box);
-		return box;
-	}
-
-	/**
-	 * Returns the average character width of given TextFragmentbox
-	 * 
-	 * @param fragment
-	 *            the TextFragmentBox
-	 * @return the average character width
-	 */
-	public static float getAverageCharWidth(TextFragmentBox fragment) {
-		if (fragment._width != 0 && fragment._length != 0) {
-			return fragment._width / (float) fragment._length;
-		}
-		return 0.0f;
-	}
-
-	// ----------------------------------------------------------------------------------------
-	/**
-	 * this method will create a set of TextFragment. Each fragment will offset
-	 * to the original text (whole text for the text figure).
-	 * @param context 
-	 * @param text 
-	 * @param fragments 
-	 * @param font 
-	 * @param wrappingStyle 
-	 * @param trimLeading 
-	 */
-	public static void layoutNormal(FlowContext context, String text,
-			List fragments, Font font, int wrappingStyle, boolean trimLeading) {
-		int i = 0; // The index of the current fragment;
-		int offset = 0;
-		if (trimLeading) {
-			offset = 1;
-			text = text.substring(1);
-		}
-
-		int length = 0; // The length of the current fragment
-		float prevAvgCharWidth;
-		LineBox currentLine;
-		TextFragmentBox fragment;
-
-		while (text.length() > 0) {
-			fragment = null;
-			prevAvgCharWidth = 0f;
-			fragment = getFragment(i, fragments);
-			prevAvgCharWidth = getAverageCharWidth(fragment);
-
-			// Check for newline, if it exists, call context.endLine and skip
-			// over the newline
-			// Exccept for first time through, don't do this.
-			if (i != 0) {
-				boolean changed = false;
-				if (text.charAt(0) == '\r') {
-					text = text.substring(1);
-					changed = true;
-					offset += 1;
-				}
-				if (text.length() != 0 && text.charAt(0) == '\n') {
-					text = text.substring(1);
-					changed = true;
-					offset += 1;
-				}
-				if (changed) {
-					context.endLine();
-				}
-			}
-
-			fragment._offset = offset;
-
-			// This loop is done at most twice.
-			// The second time through, a context.endLine()
-			// was requested, and the loop will break.
-			while (true) {
-				currentLine = context.getCurrentLine();
-				length = FlowUtilities.setupFragmentBasedOnTextSpace(fragment,
-						text, font, currentLine.getAvailableWidth(),
-						prevAvgCharWidth, wrappingStyle);
-
-				if (fragment._width <= currentLine.getAvailableWidth()
-						|| !context.isCurrentLineOccupied()) {
-					break;
-				}
-				context.endLine();
-			}
-			// fragment.x = context.getCurrentX();
-			context.addToCurrentLine(fragment);
-			text = text.substring(length);
-			offset += length;
-			if (text.length() > 0) {
-				context.endLine();
-			}
-			i++;
-		}
-
-		// Remove the remaining unused fragments.
-		while (i < fragments.size()) {
-			fragments.remove(fragments.size() - 1);
-		}
-	}
-
-	/**
-	 * @param context
-	 * @param text
-	 * @param fragments
-	 * @param font
-	 */
-	public static void layoutNoWrap(FlowContext context, String text,
-			List fragments, Font font) {
-		TextFragmentBox fragment;
-		int i = 0;
-		int offset = 0;
-
-		while (offset < text.length()) {
-			int result = nextLineBreak(text, offset);
-			fragment = getFragment(i++, fragments);
-			fragment._length = result - offset;
-			fragment._offset = offset;
-			FlowUtilities.setupFragment(fragment, font, text.substring(offset));
-			context.getCurrentLine().add(fragment);
-			offset = result + delimeterLength;
-			if (delimeterLength != 0) {
-				// in nextLineBreak we fo
-				context.endLine();
-			}
-
-		}
-		// Remove the remaining unused fragments.
-		while (i < fragments.size()) {
-			fragments.remove(i++);
-		}
-	}
-
-	private static int nextLineBreak(String text, int offset) {
-		int result = text.length();
-		delimeterLength = 0;
-		int current;
-		for (int i = 0; i < DELIMITERS.length; i++) {
-			current = text.indexOf(DELIMITERS[i], offset);
-			if (current != -1 && current < result) {
-				result = current;
-				delimeterLength = DELIMITERS[i].length();
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @param g
-	 * @param fragments
-	 * @param font
-	 * @param textDecoration
-	 */
-	public static void paintTextFigure(Graphics g, List fragments, Font font,
-			int textDecoration) {
-		paintTextFigure(g, fragments, font, null, textDecoration);
-	}
-
-	/**
-	 * @param g
-	 * @param rect
-	 * @param textDecoration
-	 */
-	public static void paintTextDecoration(Graphics g, Rectangle rect,
-			int textDecoration) {
-		if ((textDecoration & TextDecorationMeta.UNDERLINE) != 0) {
-			g.drawLine(rect.x, rect.y + rect.height - 1, rect.x + rect.width
-					- 1, rect.y + rect.height - 1);
-		}
-		if ((textDecoration & TextDecorationMeta.OVERLINE) != 0) {
-			g.drawLine(rect.x, rect.y + 1, rect.x + rect.width - 1, rect.y + 1);
-		}
-		if ((textDecoration & TextDecorationMeta.LINETHROUGH) != 0) {
-			g.drawLine(rect.x, rect.y + rect.height / 2, rect.x + rect.width
-					- 1, rect.y + rect.height / 2);
-		}
-	}
-
-	/**
-	 * @param g
-	 * @param fragments
-	 * @param font
-	 * @param color
-	 * @param textDecoration
-	 */
-	public static void paintTextFigure(Graphics g, List fragments, Font font,
-			Color color, int textDecoration) {
-		// FIXME: It happens there is problem in this method's parameters. what
-		// exception should be catched?
-		try {
-			TextFragmentBox frag;
-			// XXX: adjust font. Here is not using setFont(), because that will
-			// result in revalidate
-			g.setFont(font);
-
-			for (int i = 0; i < fragments.size(); i++) {
-				frag = (TextFragmentBox) fragments.get(i);
-				// if (!g.getClip(Rectangle.SINGLETON).intersects(frag))
-				// continue;
-				String draw;
-				draw = frag.getTextData();
-
-				if (color != null) {
-					g.setForegroundColor(color);
-				}
-				g.drawText(draw, frag._x, frag._y);
-				if ((textDecoration & TextDecorationMeta.UNDERLINE) != 0) {
-					g.drawLine(frag._x, frag._y + frag.getHeight() - 1, frag._x
-							+ frag.getWidth(), frag._y + frag.getHeight() - 1);
-				}
-				if ((textDecoration & TextDecorationMeta.OVERLINE) != 0) {
-					g.drawLine(frag._x, frag._y, frag._x + frag.getWidth(),
-							frag._y);
-				}
-				if ((textDecoration & TextDecorationMeta.LINETHROUGH) != 0) {
-					g.drawLine(frag._x, frag._y + frag.getHeight() / 2, frag._x
-							+ frag.getWidth(), frag._y + frag.getHeight() / 2);
-				}
-
-				if (Debug.DEBUG_BASELINE) {
-					g.drawLine(frag._x, frag._y + frag.getAscent(), frag._x
-							+ frag.getWidth(), frag._y + frag.getAscent());
-				}
-			}
-		} catch (Exception e) {
-			// "Error in text painting:"
-			_log.info("TextLayoutSupport.Info.1", e); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * 
-	 * @param g
-	 * @param fragments
-	 * @param text
-	 *            all the text in the Text figure.
-	 * @param font
-	 * @param color
-	 * @param textDecoration
-	 * @param start
-	 * @param end
-	 * @param selectionForeColor
-	 * @param selectionBackColor
-	 */
-	public static void paintTextFigureWithSelection(Graphics g, List fragments,
-			String text, Font font, Color color, int textDecoration, int start,
-			int end, Color selectionForeColor, Color selectionBackColor) {
-		// FIXME: It happens there is problem in this method's parameters. what
-		// exception should be catched?
-		try {
-			TextFragmentBox frag;
-
-			Color originalForeground = g.getForegroundColor();
-			Color originalBackgroud = g.getBackgroundColor();
-
-			// XXX: adjust font. Here is not using setFont(), because that will
-			// result in revalidate
-			g.setFont(font);
-
-			for (int i = 0, n = fragments.size(); i < n; i++) {
-				frag = (TextFragmentBox) fragments.get(i);
-
-				// to make things simpler, we always draw the line using default
-				// color
-				if (color != null) {
-					g.setForegroundColor(color);
-				}
-
-				// if (!g.getClip(Rectangle.SINGLETON).intersects(frag))
-				// continue;
-				String draw;
-				draw = frag.getTextData();
-				if (frag._offset >= end || frag._offset + frag._length <= start) {
-					// we are not in selection. no need to change color
-					g.drawText(draw, frag._x, frag._y);
-					paintTextDecoration(g, frag.getRectangle(), textDecoration);
-				} else if (frag._offset >= start
-						&& frag._offset + frag._length <= end) {
-					// we are fully in selection
-					g.setForegroundColor(selectionForeColor);
-					g.setBackgroundColor(selectionBackColor);
-					g
-							.fillRectangle(frag._x, frag._y, FlowUtilities
-									.getTextExtents(draw, font).width, frag
-									.getHeight());
-					g.drawText(draw, frag._x, frag._y);
-					paintTextDecoration(g, frag.getRectangle(), textDecoration);
-				} else {
-					// partial of the fragment's text is in selection.
-
-					// draw the original string first
-					g.drawText(draw, frag._x, frag._y);
-					// then override with the selected parts.
-					g.setForegroundColor(selectionForeColor);
-					g.setBackgroundColor(selectionBackColor);
-					int partialStart = frag._offset > start ? frag._offset
-							: start;
-					int partialEnd = (frag._offset + frag._length > end) ? end
-							: (frag._offset + frag._length);
-					int x = 0;
-					String skip = text.substring(frag._offset, partialStart);
-					x = FlowUtilities.getTextExtents(skip, font).width;
-					String todraw = text.substring(partialStart, partialEnd);
-					if (todraw.length() > 0) {
-						Dimension dimension = FlowUtilities.getTextExtents(skip
-								+ todraw, font);
-						g.fillRectangle(frag._x + x, frag._y, dimension.width
-								- x, dimension.height);
-						g.drawText(skip + todraw, frag._x, frag._y);
-						if (color != null) {
-							g.setForegroundColor(color);
-						} else {
-							g.setForegroundColor(originalForeground);
-						}
-						g.drawText(skip, frag._x, frag._y);
-						paintTextDecoration(g, frag.getRectangle(),
-								textDecoration);
-						g.setForegroundColor(selectionForeColor);
-						paintTextDecoration(g,
-								new Rectangle(frag._x + x, frag._y,
-										dimension.width - x, dimension.height),
-								textDecoration);
-					}
-				}
-
-				// we do this in each loop, to make sure we are using correct
-				// color
-				g.setForegroundColor(originalForeground);
-				g.setBackgroundColor(originalBackgroud);
-
-			}
-		} catch (Exception e) {
-			// "Error in text painting:"
-			_log.info("TextLayoutSupport.Info.1", e); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * @param textAlign
-	 * @param rect
-	 * @param textWidth
-	 * @return the x value
-	 */
-	public static int getBeginX(Object textAlign, Rectangle rect, int textWidth) {
-		int x = rect.x;
-		if (textAlign != null) {
-			String align = textAlign.toString();
-			if ("left".equalsIgnoreCase(align)) //$NON-NLS-1$
-			{
-				x = rect.x + 1;
-			} else if ("right".equalsIgnoreCase(align)) //$NON-NLS-1$
-			{
-				x = rect.x + rect.width - textWidth - 1;
-				if (x < 1) {
-					x = 1;
-				}
-			} else if ("center".equalsIgnoreCase(align)) //$NON-NLS-1$
-			{
-				int offset = (rect.width - textWidth) / 2;
-				if (offset <= 0) {
-					offset = 0;
-				}
-				x = x + offset + 1;
-			}
-		}
-		return x;
-	}
-	
-	private TextLayoutSupport()
-	{
-	    // no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/WidgetBox.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/WidgetBox.java
deleted file mode 100644
index 220d61c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/WidgetBox.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout;
-
-/**
- * Simple box support ascent.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class WidgetBox extends FlowBox {
-	private int _ascent = -1;
-
-	public int getAscent() {
-		if (_ascent < 0) {
-			return super.getAscent();
-		}
-        return _ascent;
-	}
-
-	/*package*/ void setAscent(int ascent) {
-		_ascent = ascent;
-	}
-
-	/**
-	 * @return true if supports ascent
-	 */
-	public boolean supportAscent() {
-		return _ascent > 0;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTRGroupLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTRGroupLayout.java
deleted file mode 100644
index 0a3cd40..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTRGroupLayout.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout.table;
-
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.LayoutManager;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.FlowFigure;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class CSSTRGroupLayout extends CSSBlockFlowLayout {
-
-	/**
-	 * @param cssfigure
-	 */
-	public CSSTRGroupLayout(CSSFigure cssfigure) {
-		super(cssfigure);
-	}
-
-	/**
-	 * @return the parent figure of TRGroup should be table figure. If so, return the
-     * corresponding table layout. 
-	 */
-	public CSSTableLayout2 getTableLayoutContext() {
-		IFigure parent = getCSSFigure().getParent();
-		if (parent != null) {
-			LayoutManager parentLayout = parent.getLayoutManager();
-			if (parentLayout instanceof CSSTableLayout2) {
-				return (CSSTableLayout2) parentLayout;
-			}
-		}
-
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout#postValidate()
-	 */
-	public void postValidate() {
-		CSSTableLayout2 tableLayout = getTableLayoutContext();
-		if (tableLayout == null) {
-			super.postValidate();
-		} else {
-			Rectangle r = getTRGroupRect(tableLayout);
-			if (r != null) {
-				_blockBox.setXYWidthHeight(r);
-				getCSSFigure().setBounds(r);
-				List list = getCSSFigure().getChildren();
-				for (int i = 0; i < list.size(); i++) {
-					((FlowFigure) list.get(i)).postValidate();
-				}
-			} else {
-				super.postValidate();
-			}
-		}
-	}
-
-	/**
-	 * @return
-	 */
-	private Rectangle getTRGroupRect(CSSTableLayout2 tableLayout) {
-		TableRowGroupInfo groupinfo = tableLayout.getGroupInfo(this
-				.getCSSFigure());
-		int rowIndex = groupinfo.getRowIndex();
-		int rowCount = groupinfo.getRowCount();
-		int y = (rowIndex + 1) * tableLayout.getVSpacing();
-		for (int k = 0; k < rowIndex; k++) {
-			y += tableLayout.getRowHeights()[k];
-		}
-		if (tableLayout.getCaptionInfo() != null
-				&& "top".equalsIgnoreCase(tableLayout.getCaptionInfo().getAlign())) //$NON-NLS-1$
-		{
-			y += tableLayout.getCaptionSize().height;
-		}
-
-		int height = (rowCount - 1) * tableLayout.getVSpacing();
-		for (int k = 0; k < rowCount; k++) {
-			height += tableLayout.getRowHeights()[rowIndex + k];
-		}
-		//ICSSFigure figure = groupinfo.getFigure();
-		return new Rectangle(tableLayout.getRowX(), y, tableLayout
-				.getRowWidth(), height);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout#useLocalCoordinates()
-	 */
-	public boolean useLocalCoordinates() {
-		// if is in table, we don't use local coordinates.
-		return getTableLayoutContext() == null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout#endBlock()
-	 */
-	protected void endBlock() {
-		if (getTableLayoutContext() == null) {
-			super.endBlock();
-		} else {
-			layoutLines();
-		}
-	}
-
-	// /* (non-Javadoc)
-	// * @see
-	// org.eclipse.jst.pagedesigner.css2.layout.FlowContainerLayout#layout()
-	// */
-	// protected void layout()
-	// {
-	// CSSTableLayout2 tableLayout = getTableLayoutContext();
-	// if (tableLayout == null)
-	// {
-	// // we are not in table? treat as block.
-	// super.layout();
-	// }
-	// else
-	// {
-	// // ok, we are in table. we need to layout our children.
-	// TableRowGroupInfo groupInfo =
-	// tableLayout.getGroupInfo(this.getCSSFigure());
-	// int[] rowHeights = tableLayout.getRowHeights();
-	// int vspacing = tableLayout.getVSpacing();
-	// int rowwidth = getCSSFigure().getBounds().width;// XXX: get from table
-	// layout?
-	// int grouprowindex = groupInfo.getRowIndex();
-	// List rows = groupInfo.getRowList();
-	// for (int i=0, size=rows.size(); i<size; i++)
-	// {
-	// TableRowInfo rowinfo = (TableRowInfo) rows.get(i);
-	// ICSSFigure figure = rowinfo.getFigure();
-	//                
-	// int y = 0;
-	// int rowindex = rowinfo.getRowIndex();
-	// for (int row=grouprowindex; row<rowindex; row++)
-	// {
-	// y += rowHeights[row];
-	// y += vspacing;
-	// }
-	// int height = rowHeights[rowindex];
-	// Rectangle rect = new Rectangle(0, y, rowwidth, height);
-	// figure.setBounds(rect);
-	// }
-	// }
-	// }
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSLayout#handlingBorderForBlock()
-	 */
-	public boolean handlingBorderForBlock() {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTRLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTRLayout.java
deleted file mode 100644
index 12590c1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTRLayout.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout.table;
-
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.LayoutManager;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.FlowFigure;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class CSSTRLayout extends CSSBlockFlowLayout {
-	/**
-	 * @param cssfigure
-	 */
-	public CSSTRLayout(CSSFigure cssfigure) {
-		super(cssfigure);
-	}
-
-	/**
-	 * @return the parent figure of TRGroup should be table figure. If so, return the
-     * corresponding table layout.
-	 */
-	public CSSTableLayout2 getTableLayoutContext() {
-		IFigure parent = getCSSFigure().getParent();
-		if (parent != null) {
-			LayoutManager parentLayout = parent.getLayoutManager();
-			if (parentLayout instanceof CSSTableLayout2) {
-				return (CSSTableLayout2) parentLayout;
-			} else if (parentLayout instanceof CSSTRGroupLayout) {
-				return ((CSSTRGroupLayout) parentLayout)
-						.getTableLayoutContext();
-			}
-		}
-
-		return null;
-	}
-
-	/**
-	 * @return the group layout or null
-	 */
-	public CSSTRGroupLayout getTRGroupLayout() {
-		IFigure parent = getCSSFigure().getParent();
-		if (parent != null) {
-			LayoutManager parentLayout = parent.getLayoutManager();
-			if (parentLayout instanceof CSSTRGroupLayout) {
-				return ((CSSTRGroupLayout) parentLayout);
-			}
-		}
-
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout#postValidate()
-	 */
-	public void postValidate() {
-		CSSTableLayout2 tableLayout = getTableLayoutContext();
-		if (tableLayout == null) {
-			// we are not in table? treat as block.
-			super.postValidate();
-		} else {
-			Rectangle r = getTRRect(tableLayout, getTRGroupLayout());
-			if (r != null) {
-				_blockBox.setXYWidthHeight(r);
-				getCSSFigure().setBounds(r);
-				List list = getCSSFigure().getChildren();
-				for (int i = 0; i < list.size(); i++) {
-					((FlowFigure) list.get(i)).postValidate();
-				}
-			} else {
-				super.postValidate();
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout#endBlock()
-	 */
-	protected void endBlock() {
-		if (this.getTableLayoutContext() == null) {
-			super.endBlock();
-		} else {
-			layoutLines();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout#useLocalCoordinates()
-	 */
-	public boolean useLocalCoordinates() {
-		return this.getTableLayoutContext() == null;
-	}
-
-	private Rectangle getTRRect(CSSTableLayout2 tableLayout,
-			CSSTRGroupLayout groupLayout) {
-		TableRowInfo rowinfo = tableLayout.getRowInfo(this.getCSSFigure());
-		int rowIndex = rowinfo.getRowIndex();
-		int y = (rowIndex + 1) * tableLayout.getVSpacing();
-		for (int k = 0; k < rowIndex; k++) {
-			y += tableLayout.getRowHeights()[k];
-		}
-		if (tableLayout.getCaptionInfo() != null
-				&& "top".equalsIgnoreCase(tableLayout.getCaptionInfo().getAlign())) //$NON-NLS-1$
-		{
-			y += tableLayout.getCaptionSize().height;
-		}
-
-		int height = tableLayout.getRowHeights()[rowIndex];
-		//ICSSFigure figure = rowinfo.getFigure();
-		return new Rectangle(tableLayout.getRowX(), y, tableLayout
-				.getRowWidth(), height);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSLayout#handlingBorderForBlock()
-	 */
-	public boolean handlingBorderForBlock() {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTableCaptionLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTableCaptionLayout.java
deleted file mode 100644
index 3d42a50..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTableCaptionLayout.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout.table;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.LayoutManager;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class CSSTableCaptionLayout extends CachedTableCellLayout {
-	private CSSTableLayout2 _tableLayout;
-
-	private TableCaptionInfo _caption;
-
-	/**
-	 * @param cssfigure
-	 */
-	public CSSTableCaptionLayout(CSSFigure cssfigure) {
-		super(cssfigure);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#invalidate()
-	 */
-	public void invalidate() {
-		super.invalidate();
-
-		_tableLayout = null;
-		_caption = null;
-	}
-
-	public Rectangle getCellRect() {
-		int x = 0;
-
-		int[] rowHeights = _tableLayout.getRowHeights();
-		int vspacing = _tableLayout.getVSpacing();
-		int y = vspacing;
-		if (_caption != null && "bottom".equalsIgnoreCase(_caption.getAlign())) //$NON-NLS-1$
-		{
-			for (int row = 0; row < rowHeights.length; row++) {
-				y += rowHeights[row];
-				y += vspacing;
-			}
-		}
-
-		int height = 0;
-		height = _tableLayout.getCaptionSize().height;
-		int width = _tableLayout.getCaptionSize().width;
-		Rectangle rect = new Rectangle(x, y, width, height);
-		return rect;
-	}
-
-	/**
-	 * the parent figure of TRGroup should be table figure. If so, return the
-	 * corresponding table layout.
-	 * 
-	 * @return the css table layout context or null if none.
-	 */ 
-	public CSSTableLayout2 getTableLayoutContext() {
-		IFigure parent = getCSSFigure().getParent();
-		if (parent != null) {
-			LayoutManager parentLayout = parent.getLayoutManager();
-			if (parentLayout instanceof CSSTableLayout2) {
-				return (CSSTableLayout2) parentLayout;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @return true if the table has a caption
-	 */
-	public boolean initializeTableInfo() {
-		_caption = null;
-		_tableLayout = getTableLayoutContext();
-		if (_tableLayout != null) {
-			_caption = _tableLayout.getCaptionInfo();
-			return _caption != null;
-		}
-		return false;
-	}
-
-	/**
-	 * @return the table layout
-	 */
-	public CSSTableLayout2 getTableLayout() {
-		return _tableLayout;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSLayout#isCalculatingMaxWidth()
-	 */
-	public boolean isCalculatingMaxWidth() {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTableCellLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTableCellLayout.java
deleted file mode 100644
index 1eb62e8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTableCellLayout.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout.table;
-
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.LayoutManager;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.FlowBox;
-import org.eclipse.jst.pagedesigner.css2.layout.LineBox;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.property.VerticalAlignMeta;
-
-/**
- * This layout is for those thigns that it's parent will decide its size. Such
- * as table cell.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class CSSTableCellLayout extends CachedTableCellLayout {
-	private CSSTableLayout2 _tableLayout;
-
-	private TableRowInfo _rowinfo;
-
-	private TableCellInfo _cellinfo;
-
-	/**
-	 * @param cssfigure
-	 */
-	public CSSTableCellLayout(CSSFigure cssfigure) {
-		super(cssfigure);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.FlowFigureLayout#invalidate()
-	 */
-	public void invalidate() {
-		super.invalidate();
-
-		_tableLayout = null;
-		_rowinfo = null;
-		_cellinfo = null;
-	}
-
-	protected void endBlock() {
-		if (isTable()) {
-			verticalLayoutLines();
-			layoutLines();
-		} else {
-			super.endBlock();
-		}
-	}
-
-	/**
-	 * process the vertical layout lines
-	 */
-	protected void verticalLayoutLines() {
-		List lines = _blockBox.getFragments();
-
-		String verticalStyle = getVerticalAlign();
-		int linesHeight = 0;
-
-		if (lines != null && !lines.isEmpty()) {
-			FlowBox bottomBox = ((FlowBox) lines.get(lines.size() - 1));
-			FlowBox topBox = ((FlowBox) lines.get(0));
-			linesHeight = bottomBox.getY() + bottomBox.getHeight() - topBox.getY();
-		}
-		int movement = 0;
-		if (VerticalAlignMeta.BOTTOM.equals(verticalStyle)) {
-			movement = _blockBox.getHeight() - linesHeight
-					- _blockBox.getBorderPaddingHeight() / 2;
-		} else if (VerticalAlignMeta.TOP.equals(verticalStyle)) {
-			movement = 0;
-		}
-		// else if (VerticalAlignMeta.BASELINE.equals(verticalStyle))
-		// {
-		// movement = _blockBox.getHeight() - linesHeight;
-		// }
-		else // if (VerticalAlignMeta.MIDDLE.equals(verticalStyle))
-		{
-			movement = (_blockBox.getHeight() - linesHeight - _blockBox
-					.getBorderPaddingHeight()) / 2;
-		}
-		// VerticalAlignMeta.TOP, ICSSPropertyID.VAL_AUTO and others
-		// else
-		// {
-		// movement = 0;
-		// }
-		if (lines != null) {
-			for (int i = 0, n = lines.size(); i < n; i++) {
-				if (lines.get(i) instanceof LineBox) {
-					LineBox lineBox = (LineBox) lines.get(i);
-					int LineMovement = Math.max(lineBox.getMarginInsets()
-							.getHeight(), movement);
-					lineBox.setY(lineBox.getY() + LineMovement
-							- lineBox.getMarginInsets().getHeight());
-				}
-			}
-		}
-	}
-
-	private String getVerticalAlign() {
-		ICSSStyle style = getCSSStyle();
-		if (style != null) {
-			return style.getStyleProperty(ICSSPropertyID.ATTR_VERTICAL_ALIGN)
-					.toString();
-		}
-		return VerticalAlignMeta.MIDDLE;
-	}
-
-	public Rectangle getCellRect() {
-		int columnIndex = _cellinfo.getColumnIndex();
-		int rowIndex = _cellinfo.getRowIndex();
-		int[] columnWidths = _tableLayout.getColumnWidths();
-		int hspacing = _tableLayout.getHSpacing();
-		int x = hspacing;
-		for (int col = 0; col < columnIndex; col++) {
-			x += columnWidths[col];
-			x += hspacing;
-		}
-
-		int[] rowHeights = _tableLayout.getRowHeights();
-		int vspacing = _tableLayout.getVSpacing();
-		int y = vspacing;
-		for (int row = 0; row < rowIndex; row++) {
-			y += rowHeights[row];
-			y += vspacing;
-		}
-		if (_tableLayout.getCaptionInfo() != null
-				&& "top".equalsIgnoreCase(_tableLayout.getCaptionInfo().getAlign())) //$NON-NLS-1$
-		{
-			y += _tableLayout.getCaptionSize().height;
-		}
-
-		int width = _tableLayout.getCellWidth(_cellinfo, columnWidths);
-		int height = _tableLayout.getCellHeight(_cellinfo, rowHeights);
-
-		Rectangle rect = new Rectangle(x, y, width, height);
-		return rect;
-	}
-
-	/**
-	 * the parent figure of TRGroup should be table figure. If so, return the
-	 * corresponding table layout.
-	 * 
-	 * @return the table layout context
-	 */
-	public CSSTableLayout2 getTableLayoutContext() {
-		IFigure parent = getCSSFigure().getParent();
-		if (parent != null) {
-			LayoutManager parentLayout = parent.getLayoutManager();
-			if (parentLayout instanceof CSSTRLayout) {
-				return ((CSSTRLayout) parentLayout).getTableLayoutContext();
-			}
-		}
-
-		return null;
-	}
-
-	/**
-	 * @return true if the table layout has cell info
-	 */
-	public boolean initializeTableInfo() {
-		_rowinfo = null;
-		_cellinfo = null;
-		_tableLayout = getTableLayoutContext();
-		if (_tableLayout != null) {
-			_rowinfo = _tableLayout.getRowInfo((CSSFigure) this.getCSSFigure()
-					.getParent());
-			if (_rowinfo != null) {
-				_cellinfo = _rowinfo.getCellInfo(this.getCSSFigure());
-				if (_cellinfo != null) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @return the table layout or nul if none
-	 */
-	public CSSTableLayout2 getTableLayout() {
-		return _tableLayout;
-	}
-
-	/**
-	 * @return the table cell info or null
-	 */
-	public TableCellInfo getTableCellInfo() {
-		return _cellinfo;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTableLayout2.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTableLayout2.java
deleted file mode 100644
index 3a9fa0d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CSSTableLayout2.java
+++ /dev/null
@@ -1,633 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout.table;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.ICSSPainter;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo;
-import org.eclipse.swt.SWT;
-
-/**
- * see also http://www.w3.org/TR/REC-CSS2/tables.html
- * 
- * @author mengbo
- * @version 1.5
- */
-public class CSSTableLayout2 extends CSSBlockFlowLayout implements ICSSPainter {
-	static Logger _log = PDPlugin.getLogger(CSSTableLayout2.class);
-
-	int _hspacing;
-
-	int _vspacing;
-
-	int[] _columnWidths;
-
-	int[] _rowHeights;
-
-	Dimension _captionSize;
-
-	// _tableInfo will be initialized in preLayout
-	TableInfo _tableInfo;
-
-	private int _internalTableWidth;
-
-	private int _internalTableHeight;
-
-	private int _rowx;
-
-	private int _rowwidth;
-
-	/**
-	 * @param flowfigure
-	 */
-	public CSSTableLayout2(CSSFigure flowfigure) {
-		super(flowfigure);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout#preLayout()
-	 */
-	protected void preLayout() {
-		// super.preLayout will setup the block box.
-		super.preLayout();
-
-		ICSSStyle style = this.getCSSStyle();
-
-		_hspacing = _vspacing = 3; // default value
-
-		if (style != null) {
-			Object borderspacing = style
-					.getStyleProperty(ICSSPropertyID.ATTR_BORDER_SPACING);
-			if (borderspacing instanceof int[]) {
-				int[] intvalues = (int[]) borderspacing;
-				_hspacing = intvalues[0];
-				_vspacing = intvalues[1];
-			} else {
-				ITagEditInfo info = (ITagEditInfo) style
-						.getAdapter(ITagEditInfo.class);
-				if (info != null && info.needTableDecorator()) {
-					// default decorating value. to make things look more
-					// separated.
-					if (_hspacing < 5) {
-						_hspacing = 5;
-					}
-					if (_vspacing < 5) {
-						_vspacing = 5;
-					}
-				}
-			}
-		}
-
-		// TODO: support caption
-		_tableInfo = new TableInfo(getCSSFigure());
-
-		// construct the table structure.
-		_tableInfo.constructTable();
-
-		// calculate the user specified width/height for table and cells.
-		// contentWidth is the user specified content width. If <= 0 means no
-		// user
-		// specification.
-		int contentWidth = this._blockBox.getContentWidth();
-		int availableWidth = this._blockBox.getRecommendedContentWidth();
-		int contentHeight = this._blockBox.getContentHeight();
-
-		_tableInfo.calculateWidth(contentWidth, availableWidth);
-		_tableInfo.calculateHeight(contentHeight);
-
-		int columnCount = _tableInfo.getColumnCount();
-
-		int columnMinWidths[] = new int[columnCount];
-		int columnMaxWidths[] = new int[columnCount];
-
-		// For each column, determine a maximum and minimum column width from
-		// the cells that span only that column. The minimum is that required by
-		// the cell with the largest minimum cell width (or the column 'width',
-		// whichever is larger). The maximum is that required by the cell with
-		// the
-		// largest maximum cell width (or the column 'width', whichever is
-		// larger).
-		List cells = _tableInfo.getCells();
-		for (int i = 0, size = cells.size(); i < size; i++) {
-			TableCellInfo cellinfo = (TableCellInfo) cells.get(i);
-			if (cellinfo.getColSpan() == 1) {
-				int column = cellinfo.getColumnIndex();
-				Dimension mincw = cellinfo.getMinCWDimension();
-				Dimension maxcw = cellinfo.getMaxCWDimension();
-				if (maxcw.width < mincw.width) {
-					maxcw.width = mincw.width;
-				}
-				if (mincw.width > columnMinWidths[column]) {
-					columnMinWidths[column] = mincw.width;
-				}
-				if (maxcw.width > columnMaxWidths[column]) {
-					columnMaxWidths[column] = maxcw.width;
-				}
-			}
-		}
-		// For caption, determine a maximum and minimum width from it.
-		int captionWidth = 0;
-		if (_tableInfo.getCaption() != null) {
-			captionWidth = _tableInfo.getCaption().getDimension().width;
-		}
-
-		// For each cell that spans more than one column, increase the
-		// minimum widths of the columns it spans so that together, they
-		// are at least as wide as the cell. Do the same for the maximum
-		// widths. If possible, widen all spanned columns by approximately
-		// the same amount.
-		for (int i = 0, size = cells.size(); i < size; i++) {
-			TableCellInfo cellinfo = (TableCellInfo) cells.get(i);
-			int colspan = cellinfo.getColSpan();
-			if (colspan > 1) {
-				int column = cellinfo.getColumnIndex();
-				Dimension mincw = cellinfo.getMinCWDimension();
-				Dimension maxcw = cellinfo.getMaxCWDimension();
-
-				adjustWidth(column, colspan, mincw.width, columnMinWidths);
-				adjustWidth(column, colspan, maxcw.width, columnMaxWidths);
-			}
-		}
-
-		int sigmaMinWidth = 0;
-		int sigmaMaxWidth = 0;
-		for (int i = 0; i < columnMinWidths.length; i++) {
-			sigmaMinWidth += columnMinWidths[i];
-			if (columnMaxWidths[i] == Integer.MAX_VALUE) {
-				sigmaMaxWidth = Integer.MAX_VALUE;
-			} else if (sigmaMaxWidth != Integer.MAX_VALUE) {
-				sigmaMaxWidth += columnMaxWidths[i];
-				if (sigmaMaxWidth < 0) {
-					sigmaMaxWidth = Integer.MAX_VALUE;
-				}
-			}
-		}
-		int spacingall = (columnMinWidths.length + 1) * _hspacing;
-		sigmaMinWidth += spacingall;
-		if (sigmaMaxWidth != Integer.MAX_VALUE) {
-			sigmaMaxWidth += spacingall;
-			if (sigmaMaxWidth < 0) {
-				sigmaMaxWidth = Integer.MAX_VALUE;
-			}
-		}
-
-		int tableWidth = _tableInfo.getTableWidth();
-		if (tableWidth > 0) {
-			// If the 'table' or 'inline-table' element's 'width' property has a
-			// specified value (W) other than 'auto', the property's computed
-			// value
-			// is the greater of W and the minimum width required by all the
-			// columns
-			// plus cell spacing or borders (MIN). If W is greater than MIN, the
-			// extra
-			// width should be distributed over the columns.
-			int maxMin = Math.max(captionWidth, sigmaMinWidth);
-			if (maxMin >= tableWidth) {
-				tableWidth = maxMin;
-			}
-			distribute(tableWidth - sigmaMinWidth, columnMinWidths,
-					columnMaxWidths);
-		} else {
-			// If the 'table' or 'inline-table' element has 'width: auto', the
-			// computed
-			// table width is the greater of the table's containing block width
-			// and MIN.
-			// However, if the maximum width required by the columns plus cell
-			// spacing or
-			// borders (MAX) is less than that of the containing block, use MAX.
-			// int availableWidth = this.getCurrentLine().getAvailableWidth();
-			int maxMin = Math.max(captionWidth, sigmaMaxWidth);
-			if (maxMin <= availableWidth) {
-				// TODO: if _tableInfo.hasWidthPercentage, then we need take
-				// that into consideration
-				// to distribute the column width. Left to next version.
-				tableWidth = maxMin;
-				// columnMinWidths = columnMaxWidths;
-			} else {
-				tableWidth = availableWidth;
-			}
-			distribute(tableWidth - sigmaMinWidth, columnMinWidths,
-					columnMaxWidths);
-		}
-
-		// now columnMinWidths contains width for each column
-		_columnWidths = columnMinWidths;
-
-		// ok, we have finished calculating column width.
-		// next we need to find out row heights.
-		_rowHeights = new int[_tableInfo.getRowCount()];
-
-		// first find out those TR that has height settings and use them.
-		List rows = _tableInfo.getRows();
-		for (int i = 0, size = rows.size(); i < size && i < _rowHeights.length; i++) {
-			TableRowInfo rowInfo = (TableRowInfo) rows.get(i);
-			if (rowInfo.getSpecifiedRowHeight() > 0) {
-				_rowHeights[i] = rowInfo.getSpecifiedRowHeight();
-			}
-		}
-
-		// First the cells don't span multiple rows.
-		cells = _tableInfo.getCells();
-		for (int i = 0, size = cells.size(); i < size; i++) {
-			TableCellInfo cellinfo = (TableCellInfo) cells.get(i);
-			IFigure figure = cellinfo.getFigure();
-			int rowspan = cellinfo.getRowSpan();
-			if (rowspan == 1) {
-				int cellWidth = getCellWidth(cellinfo, _columnWidths);
-				Dimension d = figure.getPreferredSize(cellWidth, cellinfo
-						.getHeight());
-				if (d.height > _rowHeights[cellinfo.getRowIndex()]) {
-					_rowHeights[cellinfo.getRowIndex()] = d.height;
-				}
-			}
-		}
-
-		// Next those cells span multiple rows.
-		cells = _tableInfo.getCells();
-		for (int i = 0, size = cells.size(); i < size; i++) {
-			TableCellInfo cellinfo = (TableCellInfo) cells.get(i);
-			IFigure figure = cellinfo.getFigure();
-			int rowspan = cellinfo.getRowSpan();
-			if (rowspan > 1) {
-				int cellWidth = getCellWidth(cellinfo, _columnWidths);
-				Dimension d = figure.getPreferredSize(cellWidth, cellinfo
-						.getHeight());
-				if (d.height > getCellHeight(cellinfo, _rowHeights)) {
-					adjustHeight(cellinfo.getRowIndex(), rowspan, d.height,
-							_rowHeights);
-				}
-			}
-		}
-
-		// Next we may need distribute height.
-		int sigmaHeight = (_tableInfo.getRowCount() + 1) * _vspacing;
-		for (int i = 0; i < _rowHeights.length; i++) {
-			sigmaHeight += _rowHeights[i];
-		}
-		if (sigmaHeight < contentHeight) {
-			distributeHeights(contentHeight - sigmaHeight, _rowHeights);
-		}
-
-		// now we have calculated the width and height of all cells.
-		// FIXME: border?
-		Insets insets = (style == null ? new Insets() : style.getBorderInsets()
-				.getAdded(style.getPaddingInsets()));
-		_internalTableWidth = (_tableInfo.getColumnCount() + 1) * _hspacing;
-		for (int i = 0; i < _columnWidths.length; i++) {
-			_internalTableWidth += _columnWidths[i];
-		}
-		int minWidth = getLengthValue(style, ICSSPropertyID.ATTR_MIN_WIDTH);
-		_internalTableWidth = _internalTableWidth > minWidth ? _internalTableWidth
-				: minWidth;
-
-		_blockBox.setWidth(_internalTableWidth + insets.getWidth());
-		_internalTableHeight = (_tableInfo.getRowCount() + 1) * _vspacing;
-		for (int i = 0; i < _rowHeights.length; i++) {
-			_internalTableHeight += _rowHeights[i];
-		}
-		int minHeight = getLengthValue(style, ICSSPropertyID.ATTR_MIN_HEIGHT);
-		_internalTableHeight = _internalTableHeight > minHeight ? _internalTableHeight
-				: minHeight;
-
-		int captionHeight = 0;
-		if (_tableInfo.getCaption() != null) {
-			_captionSize = _tableInfo.getCaption().getFigure().getPreferredSize(
-					_internalTableWidth, SWT.DEFAULT);
-			captionHeight = _captionSize.height;
-		} else {
-			_captionSize = null;
-		}
-		_internalTableHeight += captionHeight;
-
-		_blockBox.setHeight(_internalTableHeight + insets.getHeight());
-
-		_rowwidth = _internalTableWidth - 2 * _hspacing;
-		_rowx = _hspacing; // XXX: table border width left?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout#endBlock()
-	 */
-	protected void endBlock() {
-		_blockBox.setWidth(_internalTableWidth
-				+ _blockBox.getBorderPaddingWidth());
-		_blockBox.setHeight(_internalTableHeight
-				+ _blockBox.getBorderPaddingHeight());
-		super.endBlock();
-	}
-
-	//
-	// /**
-	// * when some of the column has percentage width, and sigmaMax smaller than
-	// container,
-	// * @param containerWidth
-	// * @param columnMinWidths
-	// * @param columnMaxWidths
-	// * @return
-	// */
-	// private int distribute2(int containerWidth, int[] columnMinWidths, int[]
-	// columnMaxWidths)
-	// {
-	//        
-	// }
-	//    
-	/**
-	 * Distribute the additional width to columnMinWidths, using max width as a
-	 * possible reference on how to distribute.
-	 * 
-	 * @param toDistribute
-	 * @param columnMinWidths
-	 * @param columnMaxWidths
-	 */
-	private void distribute(int toDistribute, int[] columnMinWidths,
-			int[] columnMaxWidths) {
-		if (toDistribute <= 0)
-			return;
-		if (columnMinWidths.length == 0)
-			return;
-
-		int[] delta = new int[columnMinWidths.length];
-		int sigmaDelta = 0;
-		for (int i = 0; i < columnMinWidths.length && toDistribute > 0; i++) {
-			if (_tableInfo.getWidthSpecified()[i]) {
-				delta[i] = 0;
-			} else {
-				delta[i] = columnMaxWidths[i] - columnMinWidths[i];
-				if (delta[i] <= 0) {
-					delta[i] = 0;
-				}
-				sigmaDelta += delta[i];
-			}
-		}
-		if (sigmaDelta == 0) {
-			// should not happen, but anyway, distribute all to the last column
-			// columnMinWidths[columnMinWidths.length-1] += toDistribute;
-			averageDeltaToCell(columnMinWidths, toDistribute);
-		} else {
-			int left = toDistribute;
-			for (int i = 0; i < columnMinWidths.length - 1; i++) {
-				if (delta[i] > 0) {
-					int add = delta[i] * toDistribute / sigmaDelta;
-					left -= add;
-					columnMinWidths[i] += add;
-				}
-			}
-			columnMinWidths[columnMinWidths.length - 1] += left;
-		}
-	}
-
-	private void averageDeltaToCell(int[] columnMinWidths, int toDistribute) {
-
-		if (toDistribute <= 0) {
-			return;
-		}
-		ArrayList list = new ArrayList();
-		for (int i = 0; i < columnMinWidths.length; i++) {
-			if (!_tableInfo.getWidthSpecified()[i]) {
-				list.add(new Integer(i));
-			}
-		}
-		if (list.size() == 0) {
-			for (int i = 0; i < columnMinWidths.length; i++) {
-				list.add(new Integer(i));
-			}
-		}
-		int padding = toDistribute / list.size();
-		int left = toDistribute % list.size();
-		for (int i = 0, n = list.size(); i < n; i++) {
-			columnMinWidths[((Integer) list.get(i)).intValue()] += padding;
-		}
-		if (left > 0) {
-			for (int i = 0; i < left; i++) {
-				columnMinWidths[((Integer) list.get(i)).intValue()] += 1;
-			}
-		}
-	}
-
-	/**
-	 * @param i
-	 * @param heights
-	 */
-	private void distributeHeights(int toDistribute, int[] heights) {
-		if (heights.length == 0)
-			return;
-		int eachDelta = toDistribute / heights.length;
-		for (int i = 0; i < heights.length - 1; i++) {
-			heights[i] += eachDelta;
-		}
-		heights[heights.length - 1] += toDistribute - (heights.length - 1)
-				* eachDelta;
-	}
-
-	/**
-	 * @param cellinfo
-	 * @param heights
-	 * @return the cell height
-	 */
-	public int getCellHeight(TableCellInfo cellinfo, int[] heights) {
-		int rowIndex = cellinfo.getRowIndex();
-		int rowspan = cellinfo.getRowSpan();
-		int h = 0;
-		for (int i = 0; i < rowspan; i++) {
-			h += heights[rowIndex + i];
-		}
-		h += (rowspan - 1) * _vspacing;
-		return h;
-	}
-
-	/**
-	 * @param cellinfo
-	 * @param widths
-	 * @return the cell width
-	 */
-	public int getCellWidth(TableCellInfo cellinfo, int[] widths) {
-		int columnIndex = cellinfo.getColumnIndex();
-		int colspan = cellinfo.getColSpan();
-		int w = 0;
-		for (int i = 0; i < colspan; i++) {
-			w += widths[columnIndex + i];
-		}
-		w += (colspan - 1) * _hspacing;
-		return w;
-	}
-
-	/**
-	 * @param column
-	 *            the start column
-	 * @param colspan
-	 *            number of columns
-	 * @param width
-	 *            desired width
-	 * @param columnWidths
-	 *            current columns widths. After the adjust, need make sure the
-	 *            columnWidths to be bigger than desired width
-	 */
-	private void adjustWidth(int column, int colspan, int width,
-			int[] columnWidths) {
-		adjustSpan(column, colspan, width, columnWidths, _hspacing);
-	}
-
-	/**
-	 * @see #adjustWidth(int, int, int, int[])
-	 */
-	private void adjustHeight(int rowIndex, int rowspan, int height,
-			int[] heights) {
-		adjustSpan(rowIndex, rowspan, height, heights, _vspacing);
-	}
-
-	static private void adjustSpan(int column, int colspan, int width,
-			int[] columnWidths, int spacing) {
-		int spanwidth = 0;
-		for (int i = 0; i < colspan; i++) {
-			spanwidth += columnWidths[column + i];
-		}
-		// XXX: vspacing here?
-		spanwidth += (colspan - 1) * spacing;
-
-		if (spanwidth >= width) {
-			return;
-		}
-        int delta = width - spanwidth;
-        int deltaeach = delta / colspan;
-        for (int i = 0; i < colspan - 1; i++) {
-        	columnWidths[column + i] += deltaeach;
-        }
-        columnWidths[column + colspan - 1] += (delta - (colspan - 1)
-        		* deltaeach);
-	}
-
-	/**
-	 * @return the row heights
-	 */
-	public int[] getRowHeights() {
-		return _rowHeights;
-	}
-
-	/**
-	 * @return the column widths
-	 */
-	public int[] getColumnWidths() {
-		return _columnWidths;
-	}
-
-	/**
-	 * @return the vertical spacing value
-	 */
-	public int getVSpacing() {
-		return _vspacing;
-	}
-
-	/**
-	 * @return the horizontal spacing value
-	 */
-	public int getHSpacing() {
-		return _hspacing;
-	}
-
-	/**
-	 * @param figure
-	 * @return the table row info for the figure
-	 */
-	public TableRowInfo getRowInfo(CSSFigure figure) {
-		return _tableInfo.findRowInfo(figure);
-	}
-
-	/**
-	 * @return the table caption info
-	 */
-	public TableCaptionInfo getCaptionInfo() {
-		return _tableInfo.getCaption();
-	}
-
-	/**
-	 * @param figure
-	 * @return the table row group info for the figure
-	 */
-	public TableRowGroupInfo getGroupInfo(CSSFigure figure) {
-		return _tableInfo.findGroupInfo(figure);
-	}
-
-	/**
-	 * @return the row's x
-	 */
-	public int getRowX() {
-		return _rowx;
-	}
-
-	/**
-	 * @return the row's width
-	 */
-	public int getRowWidth() {
-		return _rowwidth;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout#shouldExpand()
-	 */
-	public boolean shouldExpand() {
-		return false;
-	}
-
-	/**
-	 * @return the rendered dimensions of the table caption
-	 */
-	public Dimension getCaptionSize() {
-		return _captionSize;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.ICSSPainter#paintFigure(org.eclipse.draw2d.Graphics)
-	 */
-	public void paintFigure(Graphics g) {
-		ICSSStyle style = this.getCSSStyle();
-		if (style != null) {
-			ITagEditInfo info = (ITagEditInfo) style
-					.getAdapter(ITagEditInfo.class);
-			if (info != null && info.needTableDecorator()) {
-				List cells = _tableInfo.getCells();
-				for (int i = 0, size = cells.size(); i < size; i++) {
-					TableCellInfo cellInfo = (TableCellInfo) cells.get(i);
-					IFigure cellfigure = cellInfo.getFigure();
-					Rectangle rect = cellfigure.getBounds().getCopy();
-					rect = rect.expand(1, 1);
-					g.setLineStyle(Graphics.LINE_SOLID);
-					g.setLineWidth(1);
-					g.setForegroundColor(ColorConstants.lightGray);
-					g.drawRectangle(rect);
-				}
-			}
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CachedTableCellLayout.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CachedTableCellLayout.java
deleted file mode 100644
index 24e2be8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/CachedTableCellLayout.java
+++ /dev/null
@@ -1,263 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout.table;
-
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.layout.BoxUtil;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.FlowFigure;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public abstract class CachedTableCellLayout extends CSSBlockFlowLayout 
-{
-	private Dimension _pageSize = new Dimension();
-
-	private boolean _calculatingSize = false;
-
-	private int _pageSizeCacheKeys[] = new int[4];
-
-	private Dimension _pageSizeCacheValues[] = new Dimension[4];
-
-	private int _recommendedWidth;
-
-	private Dimension _cacheMaxWidthSize = null;
-
-	private boolean _isTable;
-
-	/**
-	 * @param cssfigure
-	 */
-	public CachedTableCellLayout(CSSFigure cssfigure) {
-		super(cssfigure);
-	}
-
-	/**
-	 * when figure revalidated, means some child or itself get changed somehow,
-	 * so clear the cache information here.
-	 */
-	public void figureRevalidate() {
-		super.figureRevalidate();
-		_pageSizeCacheKeys = new int[4];
-		_pageSizeCacheValues = new Dimension[4];
-		_pageSize = new Dimension();
-		_recommendedWidth = 0;
-		_cacheMaxWidthSize = null;
-		_isTable = false;
-	}
-
-	/**
-	 * TODO: This method is not being called.
-	 */
-	public void postValidate() {
-		if (_isTable) {
-			if (_calculatingSize) {
-				_pageSize.width = _blockBox.getWidth();
-				_pageSize.height = _blockBox.getHeight();
-			} else {
-				if (_isTable) {
-					Rectangle rect = getCellRect();
-					_blockBox.setXYWidthHeight(rect);
-					this.getCSSFigure().setBounds(rect);
-				}
-			}
-			List list = getCSSFigure().getChildren();
-			for (int i = 0, n = list.size(); i < n; i++) {
-				((FlowFigure) list.get(i)).postValidate();
-			}
-		} else {
-			super.postValidate();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.layout.CSSBlockFlowLayout#preLayout()
-	 */
-	protected void preLayout() {
-		_isTable = initializeTableInfo();
-		if (_isTable) {
-			if (!_calculatingSize) {
-				// XXX: I don't know why need to call setValid(false) here, if I
-				// don't call
-				// it, the layout will be wrong.
-				getCSSFigure().setValid(false);
-			}
-		}
-		super.preLayout();
-	}
-
-	/**
-	 * @return the cell rectangle
-	 */
-	protected abstract Rectangle getCellRect();
-
-	/**
-	 * @return true if initialized
-	 */
-	protected abstract boolean initializeTableInfo();
-
-	protected void setupBlock() {
-		if (_isTable) {
-			// Remove all current Fragments
-			_blockBox.clear();
-
-			if (_calculatingSize) {
-				// we are not in the real layout
-				// Setup the one fragment for this Block with the correct X and
-				// available width
-				int recommendedWidth = getRecommendedWidth();
-				_blockBox.setRecommendedWidth(recommendedWidth);
-
-				if (recommendedWidth > 0
-						&& recommendedWidth != Integer.MAX_VALUE) {
-					_blockBox.setWidth(recommendedWidth);
-				}
-			} else {
-				Rectangle rect = getCellRect();
-				_blockBox.setWidth(rect.width);
-				_blockBox.setRecommendedWidth(rect.width);
-				_blockBox.setHeight(rect.height);
-				_blockBox.setRecommendedHeight(rect.height);
-			}
-
-			BoxUtil.setupBorderPaddingMargin(_blockBox, getCSSStyle());
-		} else {
-			super.setupBlock();
-		}
-	}
-
-	/**
-	 * @see org.eclipse.draw2d.Figure#getPreferredSize(int, int)
-	 */
-	public Dimension getPreferredSize(IFigure container, int width, int h) {
-		if (this.isCalculatingMaxWidth()) {
-			return getMaxContentWidthSize(container, width, h);
-		}
-		try {
-			_calculatingSize = true;
-			// if (width >= 0)
-			// {
-			// width = Math.max(0, width - container.getInsets().getWidth());
-			// }
-
-			for (int i = 0; i < 4; i++) {
-				if (_pageSizeCacheKeys[i] == width
-						&& _pageSizeCacheValues[i] != null) {
-					if (h > _pageSizeCacheValues[i].height) {
-						return new Dimension(_pageSizeCacheValues[i].width, h);
-					}
-					return _pageSizeCacheValues[i];
-				}
-			}
-
-			_pageSizeCacheKeys[3] = _pageSizeCacheKeys[2];
-			_pageSizeCacheKeys[2] = _pageSizeCacheKeys[1];
-			_pageSizeCacheKeys[1] = _pageSizeCacheKeys[0];
-			_pageSizeCacheKeys[0] = width;
-
-			_pageSizeCacheValues[3] = _pageSizeCacheValues[2];
-			_pageSizeCacheValues[2] = _pageSizeCacheValues[1];
-			_pageSizeCacheValues[1] = _pageSizeCacheValues[0];
-
-			// Flowpage must temporarily layout to determine its preferred size
-			int oldWidth = getRecommendedWidth();
-			setRecommendedWidth(width);
-			((CSSFigure) container).setValid(false);
-			container.validate();
-			((CSSFigure) container).postValidate();
-			_pageSizeCacheValues[0] = new Dimension(_pageSize);
-
-			if (width != oldWidth) {
-				setRecommendedWidth(oldWidth);
-				// container.getUpdateManager().addInvalidFigure(container);
-			}
-			if (h > _pageSizeCacheValues[0].height) {
-				return new Dimension(_pageSizeCacheValues[0].width, h);
-			}
-            return _pageSizeCacheValues[0];
-		} finally {
-			_calculatingSize = false;
-		}
-	}
-
-	private int getRecommendedWidth() {
-		return _recommendedWidth;
-	}
-
-	private void setRecommendedWidth(int width) {
-		if (_recommendedWidth == width) {
-			return;
-		}
-		_recommendedWidth = width;
-	}
-
-	/**
-	 * @param container
-	 * @param width
-	 * @param height
-	 * @return max width size
-	 */
-	public Dimension getMaxContentWidthSize(IFigure container, int width,
-			int height) {
-		try {
-			_calculatingSize = true;
-
-			if (this._cacheMaxWidthSize == null) {
-				boolean b = getCalcuatingMaxWidth();
-				setCalculatingMaxWidth(true);
-
-				// Flowpage must temporarily layout to determine its preferred
-				// size
-				int oldWidth = getRecommendedWidth();
-				if (width <= 0) {
-					setRecommendedWidth(Integer.MAX_VALUE);
-				} else {
-					setRecommendedWidth(width);
-				}
-				((CSSFigure) container).setValid(false);
-				container.validate();
-
-				((CSSFigure) container).postValidate();
-				_cacheMaxWidthSize = new Dimension(_pageSize);
-				if (height > _pageSize.height) {
-					_cacheMaxWidthSize.height = height;
-				}
-
-				if (0 != oldWidth) {
-					setRecommendedWidth(oldWidth);
-					// container.getUpdateManager().addInvalidFigure(container);
-				}
-
-				setCalculatingMaxWidth(b);
-			}
-			return _cacheMaxWidthSize;
-		} finally {
-			_calculatingSize = false;
-		}
-	}
-
-	/**
-	 * @return Returns the _isTable.
-	 */
-	protected boolean isTable() {
-		return _isTable;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableCaptionInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableCaptionInfo.java
deleted file mode 100644
index 010cbc5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableCaptionInfo.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout.table;
-
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.ICSSFigure;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.swt.SWT;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableCaptionInfo extends TableItemInfo {
-	String _align;
-
-	/**
-	 * @param figure
-	 */
-	public TableCaptionInfo(ICSSFigure figure) {
-		super(figure);
-		ICSSStyle style = figure.getCSSStyle();
-		if (style != null) {
-			_align = style.getStyleProperty(
-					ICSSPropertyID.ATTR_HORIZONTAL_ALIGN).toString();
-		}
-	}
-
-	/**
-	 * @param width 
-	 * @param height 
-	 * @return the preferred dimension of the figure
-	 */
-	public Dimension getDimension(int width, int height) {
-		return getFigure().getPreferredSize(width, height);
-	}
-
-	/**
-	 * @return getDimension(width, height)
-	 */
-	public Dimension getDimension() {
-		return getDimension(SWT.DEFAULT, SWT.DEFAULT);
-	}
-
-	/**
-	 * @return Returns the align.
-	 */
-	public String getAlign() {
-		// TODO:We do not support left/right align of caption currently. so we
-		// treat them as top.
-		if ("bottom".equalsIgnoreCase(_align)) //$NON-NLS-1$
-		{
-			return _align;
-		}
-        return "top"; //$NON-NLS-1$
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableCellInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableCellInfo.java
deleted file mode 100644
index 286462a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableCellInfo.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout.table;
-
-import org.eclipse.draw2d.LayoutManager;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.ICSSFigure;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-import org.eclipse.jst.pagedesigner.utils.IntFlexArray;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableCellInfo extends TableItemInfo {
-	int _rowSpan = 1;
-
-	int _colSpan = 1;
-
-	int _colIndex;
-
-	int _rowIndex;
-
-	int _cellWidth = 0;
-
-	int _cellHeight = 0;
-
-	/**
-	 * @param childfigure
-	 */
-	public TableCellInfo(ICSSFigure childfigure) {
-		super(childfigure);
-	}
-
-	/**
-	 * @return column span
-	 */
-	public int getColSpan() {
-		return _colSpan;
-	}
-
-	/**
-	 * @return row span
-	 */
-	public int getRowSpan() {
-		return _rowSpan;
-	}
-
-	/**
-	 * @return the row index
-	 */
-	public int getRowIndex() {
-		return _rowIndex;
-	}
-
-	/**
-	 * @return the column index
-	 */
-	public int getColumnIndex() {
-		return _colIndex;
-	}
-
-	/**
-	 * @return the minimum cell dimensions
-	 */
-	public Dimension getMinCWDimension() {
-		return getFigure().getPreferredSize(_cellWidth, _cellHeight);
-	}
-
-	/**
-	 * @return the max cell dimensions
-	 */
-	public Dimension getMaxCWDimension() {
-		ICSSFigure figure = getFigure();
-		LayoutManager layout = figure.getLayoutManager();
-		if (layout instanceof CSSTableCellLayout) {
-			Dimension d = ((CSSTableCellLayout) layout).getMaxContentWidthSize(
-					figure, _cellWidth, _cellHeight);
-			return d;
-		}
-
-        // should not happen
-        return getMinCWDimension();
-	}
-
-	/**
-	 * @param context
-	 */
-	public void calculateCellInfo(TableInfoContext context) {
-		ICSSStyle style = this.getStyle();
-		_rowSpan = style.getRowSpan();
-		_colSpan = style.getColSpan();
-
-		// FIXME: we don't support rowspan and colspan to be 0.
-		// by spec, 0 means span from current col/row to end.
-		if (_rowSpan <= 0) {
-			_rowSpan = 1;
-		}
-		if (_colSpan <= 0) {
-			_colSpan = 1;
-		}
-
-		_rowIndex = context.getCurrentRow();
-
-		IntFlexArray array = context.getIntFlexArray();
-		int currentCol = context.getCurrentCol();
-
-		// find a cell that is not occupied by cells in previous rows.
-		while (array.getAt(currentCol) > 0) {
-			currentCol++;
-		}
-
-		// ok, now array.getAt(currentCol) == 0
-		_colIndex = currentCol;
-
-		for (int i = 0; i < _colSpan; i++, currentCol++) {
-			array.setAt(currentCol, _rowSpan);
-		}
-		context.setCurrentCol(currentCol);
-	}
-
-	/**
-	 * @param tableInfo 
-	 * @param tablewidth
-	 *            table width
-	 */
-	public void calculateWidth(TableInfo tableInfo, int tablewidth) {
-		ICSSStyle style = this.getFigure().getCSSStyle();
-		if (style == null) {
-			_cellWidth = -1;
-		} else {
-			Object width = style.getStyleProperty(ICSSPropertyID.ATTR_WIDTH);
-			Length recommendedWidth = (width instanceof Length) ? (Length) width
-					: null;
-
-			int rw = 0;
-			if (recommendedWidth == null || recommendedWidth.getValue() <= 0) {
-				rw = 0;
-			} else {
-				if (recommendedWidth.isPercentage()) {
-					// percentage width is used for remaining width
-					// distribution, so not used here.
-					int colspan = this.getColSpan();
-					for (int i = 0; i < colspan; i++) {
-						tableInfo.setWidthPercentage(this.getColumnIndex() + i,
-								recommendedWidth.getValue() / colspan);
-					}
-				} else {
-					rw = recommendedWidth.getValue();
-					if (!style.isSizeIncludeBorderPadding()) {
-						rw += style.getBorderInsets().getWidth()
-								+ style.getPaddingInsets().getWidth();
-					}
-					if (this.getColSpan() == 1) {
-						tableInfo.getWidthSpecified()[this.getColumnIndex()] = true;
-					}
-				}
-
-			}
-			_cellWidth = rw;
-		}
-
-	}
-
-	/**
-	 * @param tableInfo 
-	 * @param tableheight 
-	 */
-	public void calculateHeight(TableInfo tableInfo, int tableheight) {
-		ICSSStyle style = this.getFigure().getCSSStyle();
-		if (style == null) {
-			_cellHeight = -1;
-		} else {
-			Object height = style.getStyleProperty(ICSSPropertyID.ATTR_HEIGHT);
-			Length recommendedHeight = (height instanceof Length) ? (Length) height
-					: null;
-
-			int rh = 0;
-			if (recommendedHeight == null || recommendedHeight.getValue() <= 0) {
-				rh = 0;
-			} else {
-				if (recommendedHeight.isPercentage()) {
-					int rowspan = this.getRowSpan();
-					for (int i = 0; i < rowspan; i++) {
-						tableInfo.setHeightPercentage(this.getRowIndex() + i,
-								recommendedHeight.getValue() / rowspan);
-					}
-				} else {
-					rh = recommendedHeight.getValue();
-				}
-				if (!style.isSizeIncludeBorderPadding()) {
-					rh += style.getBorderInsets().getHeight()
-							+ style.getPaddingInsets().getHeight();
-				}
-			}
-			_cellHeight = rh;
-		}
-
-	}
-
-	/**
-	 * @return the height
-	 */
-	public int getHeight() {
-		return _cellHeight;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableInfo.java
deleted file mode 100644
index 06e135c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableInfo.java
+++ /dev/null
@@ -1,379 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout.table;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.ICSSFigure;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class TableInfo extends TableItemInfo {
-	private List _tableHeaderGroups = new ArrayList();
-
-	private List _tableTRandTRGs = new ArrayList();
-
-	private List _tableFooterGroups = new ArrayList();
-
-	private TableCaptionInfo _caption;
-
-	private int _columnCount;
-
-	private int _rowCount;
-
-	private List _cells = null;
-
-	private List _rows = null;
-
-	private int _tableWidth; // calculated table width, valid after calling to
-
-	// calculateTableWidth
-
-	private int _tableHeight;
-
-	private int[] _widthPercentage;
-
-	private int[] _heightPercentage;
-
-	private boolean[] _widthSpecified;
-
-	/**
-	 * @param figure
-	 */
-	public TableInfo(ICSSFigure figure) {
-		super(figure);
-	}
-
-
-	/**
-	 * @return the column count
-	 */
-	public int getColumnCount() {
-		return _columnCount;
-	}
-
-	/**
-	 * @return the row count
-	 */
-	public int getRowCount() {
-		return _rowCount;
-	}
-
-	final TableCaptionInfo getCaption() {
-        return _caption;
-    }
-
-
-    /**
-     * @return width specified
-     */
-    final boolean[] getWidthSpecified() {
-        return _widthSpecified;
-    }
-
-
-    void constructTable() {
-		List child = getFigure().getChildren();
-		for (int i = 0, size = child.size(); i < size; i++) {
-			IFigure childfigure = (IFigure) child.get(i);
-			if (childfigure instanceof ICSSFigure) {
-				ICSSStyle style = ((ICSSFigure) childfigure).getCSSStyle();
-				if (style != null) {
-					String display = style.getDisplay();
-					if ("table-caption".equalsIgnoreCase(display)) //$NON-NLS-1$
-					{
-						_caption = new TableCaptionInfo(
-								(ICSSFigure) childfigure);
-					} else if ("table-row".equalsIgnoreCase(display)) //$NON-NLS-1$
-					{
-						TableRowInfo rowInfo = new TableRowInfo(
-								(ICSSFigure) childfigure);
-						_tableTRandTRGs.add(rowInfo);
-					} else if ("table-row-group".equalsIgnoreCase(display)) //$NON-NLS-1$
-					{
-						TableRowGroupInfo groupInfo = new TableRowGroupInfo(
-								(ICSSFigure) childfigure);
-						_tableTRandTRGs.add(groupInfo);
-					} else if ("table-header-group".equalsIgnoreCase(display)) //$NON-NLS-1$
-					{
-						TableRowGroupInfo groupInfo = new TableRowGroupInfo(
-								(ICSSFigure) childfigure);
-						_tableHeaderGroups.add(groupInfo);
-					} else if ("table-footer-group".equalsIgnoreCase(display)) //$NON-NLS-1$
-					{
-						TableRowGroupInfo groupInfo = new TableRowGroupInfo(
-								(ICSSFigure) childfigure);
-						_tableFooterGroups.add(groupInfo);
-					} else {
-						// something unexpected inside table
-					}
-				} else {
-					// something unexpected inside table
-				}
-			} else {
-				// something unexpected inside table
-			}
-		}
-
-		TableInfoContext context = new TableInfoContext();
-		// now we have the rows ordered, need to calculate row details now.
-		for (int i = 0, size = _tableHeaderGroups.size(); i < size; i++) {
-			TableRowGroupInfo groupInfo = (TableRowGroupInfo) _tableHeaderGroups
-					.get(i);
-			groupInfo.calculateRowGroup(context);
-		}
-		for (int i = 0, size = _tableTRandTRGs.size(); i < size; i++) {
-			Object obj = _tableTRandTRGs.get(i);
-			if (obj instanceof TableRowGroupInfo) {
-				TableRowGroupInfo groupInfo = (TableRowGroupInfo) obj;
-				groupInfo.calculateRowGroup(context);
-			} else {
-				TableRowInfo rowInfo = (TableRowInfo) obj;
-				rowInfo.calculateRow(context);
-			}
-		}
-		for (int i = 0, size = _tableFooterGroups.size(); i < size; i++) {
-			TableRowGroupInfo groupInfo = (TableRowGroupInfo) _tableFooterGroups
-					.get(i);
-			groupInfo.calculateRowGroup(context);
-		}
-		context.finishTable();
-
-		_columnCount = context.getColumnCount();
-		_rowCount = context.getRowCount();
-
-		this._widthPercentage = new int[_columnCount];
-		this._heightPercentage = new int[_rowCount];
-
-		this._widthSpecified = new boolean[_columnCount];
-		for (int i = 0; i < _columnCount; i++) {
-			this._widthSpecified[i] = false;
-		}
-	}
-
-	/**
-	 * @param columnIndex
-	 * @param percentageValue
-	 */
-	void setWidthPercentage(int columnIndex, int percentageValue) {
-		if (percentageValue > this._widthPercentage[columnIndex]) {
-			this._widthPercentage[columnIndex] = percentageValue;
-		}
-	}
-
-	void setHeightPercentage(int rowIndex, int percentageValue) {
-		if (percentageValue > this._heightPercentage[rowIndex]) {
-			this._heightPercentage[rowIndex] = percentageValue;
-		}
-	}
-
-	/**
-	 * width percentage will be used to calculate remaining width distribution.
-	 * 
-	 * @return the width percentages
-	 */
-	public int[] getWidthPercentages() {
-		return this._widthPercentage;
-	}
-
-	int[] getHeightPercentages() {
-		return this._heightPercentage;
-	}
-
-	List getRows() {
-		if (_rows == null) {
-			this._rows = new ArrayList();
-
-			for (int i = 0, size = _tableHeaderGroups.size(); i < size; i++) {
-				TableRowGroupInfo groupInfo = (TableRowGroupInfo) _tableHeaderGroups
-						.get(i);
-				_rows.addAll(groupInfo.getRowList());
-			}
-			for (int i = 0, size = _tableTRandTRGs.size(); i < size; i++) {
-				Object obj = _tableTRandTRGs.get(i);
-				if (obj instanceof TableRowGroupInfo) {
-					TableRowGroupInfo groupInfo = (TableRowGroupInfo) obj;
-					_rows.addAll(groupInfo.getRowList());
-				} else {
-					TableRowInfo rowInfo = (TableRowInfo) obj;
-					_rows.add(rowInfo);
-				}
-			}
-			for (int i = 0, size = _tableFooterGroups.size(); i < size; i++) {
-				TableRowGroupInfo groupInfo = (TableRowGroupInfo) _tableFooterGroups
-						.get(i);
-				_rows.addAll(groupInfo.getRowList());
-			}
-		}
-		return _rows;
-	}
-
-	List getCells() {
-		if (_cells == null) {
-			_cells = new ArrayList();
-
-			for (int i = 0, size = _tableHeaderGroups.size(); i < size; i++) {
-				TableRowGroupInfo groupInfo = (TableRowGroupInfo) _tableHeaderGroups
-						.get(i);
-				groupInfo.getCells(_cells);
-			}
-			for (int i = 0, size = _tableTRandTRGs.size(); i < size; i++) {
-				Object obj = _tableTRandTRGs.get(i);
-				if (obj instanceof TableRowGroupInfo) {
-					TableRowGroupInfo groupInfo = (TableRowGroupInfo) obj;
-					groupInfo.getCells(_cells);
-				} else {
-					TableRowInfo rowInfo = (TableRowInfo) obj;
-					rowInfo.getCells(_cells);
-				}
-			}
-			for (int i = 0, size = _tableFooterGroups.size(); i < size; i++) {
-				TableRowGroupInfo groupInfo = (TableRowGroupInfo) _tableFooterGroups
-						.get(i);
-				groupInfo.getCells(_cells);
-			}
-		}
-		return _cells;
-	}
-
-	/**
-	 * @param contentWidth
-	 *            if the width specification is percentage, then will use
-	 *            container width.
-	 * @param availableWidth 
-	 */
-	public void calculateWidth(int contentWidth, int availableWidth) {
-		_tableWidth = contentWidth;
-		//_availableWidth = availableWidth;
-
-		// next calculate cell width
-		List cells = getCells();
-		for (int i = 0, size = cells.size(); i < size; i++) {
-			TableCellInfo cellinfo = (TableCellInfo) cells.get(i);
-			cellinfo.calculateWidth(this, _tableWidth);
-		}
-	}
-
-	void calculateHeight(int contentHeight) {
-		_tableHeight = contentHeight;
-
-		List rows = getRows();
-		for (int i = 0, size = rows.size(); i < size; i++) {
-			TableRowInfo rowinfo = (TableRowInfo) rows.get(i);
-			rowinfo.calculateHeight(this, _tableHeight);
-		}
-
-		// next calculate cell width
-		List cells = getCells();
-		for (int i = 0, size = cells.size(); i < size; i++) {
-			TableCellInfo cellinfo = (TableCellInfo) cells.get(i);
-			cellinfo.calculateHeight(this, _tableHeight);
-		}
-	}
-
-	/**
-	 * @return table width
-	 */
-	public int getTableWidth() {
-		return _tableWidth;
-	}
-
-	/**
-	 * @param figure
-	 * @return find the group info
-	 */
-	public TableRowGroupInfo findGroupInfo(CSSFigure figure) {
-		for (int i = 0, size = _tableHeaderGroups.size(); i < size; i++) {
-			TableRowGroupInfo groupInfo = (TableRowGroupInfo) _tableHeaderGroups
-					.get(i);
-			if (figure == groupInfo.getFigure()) {
-				return groupInfo;
-			}
-		}
-		for (int i = 0, size = _tableTRandTRGs.size(); i < size; i++) {
-			Object obj = _tableTRandTRGs.get(i);
-			if (obj instanceof TableRowGroupInfo) {
-				TableRowGroupInfo groupInfo = (TableRowGroupInfo) obj;
-				if (figure == groupInfo.getFigure()) {
-					return groupInfo;
-				}
-
-			}
-		}
-		for (int i = 0, size = _tableFooterGroups.size(); i < size; i++) {
-			TableRowGroupInfo groupInfo = (TableRowGroupInfo) _tableFooterGroups
-					.get(i);
-			if (figure == groupInfo.getFigure()) {
-				return groupInfo;
-			}
-		}
-		return null; // should not happen.
-	}
-
-	/**
-	 * @param figure
- 	 * @return the row info
-	 */
-	public TableRowInfo findRowInfo(CSSFigure figure) {
-		for (int i = 0, size = _tableHeaderGroups.size(); i < size; i++) {
-			TableRowGroupInfo groupInfo = (TableRowGroupInfo) _tableHeaderGroups
-					.get(i);
-			TableRowInfo rowinfo = groupInfo.findRowInfo(figure);
-			if (rowinfo != null) {
-				return rowinfo;
-			}
-		}
-		for (int i = 0, size = _tableTRandTRGs.size(); i < size; i++) {
-			Object obj = _tableTRandTRGs.get(i);
-			if (obj instanceof TableRowGroupInfo) {
-				TableRowGroupInfo groupInfo = (TableRowGroupInfo) obj;
-				TableRowInfo rowinfo = groupInfo.findRowInfo(figure);
-				if (rowinfo != null) {
-					return rowinfo;
-				}
-			} else if (obj instanceof TableRowInfo) {
-				TableRowInfo info = (TableRowInfo) obj;
-				if (figure == info.getFigure()) {
-					return info;
-				}
-			}
-		}
-		for (int i = 0, size = _tableFooterGroups.size(); i < size; i++) {
-			TableRowGroupInfo groupInfo = (TableRowGroupInfo) _tableFooterGroups
-					.get(i);
-			TableRowInfo rowinfo = groupInfo.findRowInfo(figure);
-			if (rowinfo != null) {
-				return rowinfo;
-			}
-		}
-		return null; // should not happen.
-	}
-
-	/**
-	 * 
-	 * @return the width percentage
-	 */
-	public boolean hasWidthPercentage() {
-		for (int i = 0; i < this._widthPercentage.length; i++) {
-			if (this._widthPercentage[i] > 0) {
-				return true;
-			}
-		}
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableInfoContext.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableInfoContext.java
deleted file mode 100644
index f28d3e0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableInfoContext.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout.table;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.utils.IntFlexArray;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class TableInfoContext {
-	static Logger _log = PDPlugin.getLogger(TableInfoContext.class);
-
-	int _currentCol = 0;
-
-	int _currentRow = 0;
-
-	IntFlexArray _array = new IntFlexArray();
-
-	int _colCount = 0;
-
-	int _rowCount = 0;
-
-	/**
-	 * 
-	 */
-	public TableInfoContext() {
-        // do nothing
-	}
-
-	/**
-	 * @return the flex array
-	 */
-	public IntFlexArray getIntFlexArray() {
-		return _array;
-	}
-
-	/**
-	 * @return the current column
-	 */
-	public int getCurrentCol() {
-		return _currentCol;
-	}
-
-	/**
-	 * @param currentcol
-	 */
-	public void setCurrentCol(int currentcol) {
-		_currentCol = currentcol;
-	}
-
-	/**
-	 * @return the current row
-	 */
-	public int getCurrentRow() {
-		return _currentRow;
-	}
-
-	/**
-	 * @return the column count
-	 */
-	public int getColumnCount() {
-		return _colCount;
-	}
-
-	/**
-	 * 
-	 */
-	public void finishRow() {
-		if (_currentCol > _colCount) {
-			_colCount = _currentCol;
-		}
-		_currentCol = 0;
-		_currentRow++;
-		for (int i = 0; i < _colCount; i++) {
-			if (_array.getAt(i) > 0) {
-				_array.setAt(i, _array.getAt(i) - 1);
-			}
-		}
-	}
-
-	/**
-	 * 
-	 */
-	public void finishTable() {
-		// do some checking here.
-		int additionalRow = 0;
-		for (int i = 0; i < _colCount; i++) {
-			if (_array.getAt(i) > additionalRow) {
-				additionalRow = _array.getAt(i);
-			}
-		}
-		_rowCount = _currentRow + additionalRow;
-	}
-
-	/**
-	 * 
-	 */
-	public void finishRowGroup() {
-        // TODO: does nothing; only called in one places
-	}
-
-	/**
-	 * @return the row count
-	 */
-	public int getRowCount() {
-		return _rowCount;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableItemInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableItemInfo.java
deleted file mode 100644
index 9f39064..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableItemInfo.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout.table;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.ICSSFigure;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class TableItemInfo 
-{
-	private ICSSFigure _figure;
-
-	/**
-	 * @param figure 
-	 */
-	public TableItemInfo(ICSSFigure figure) {
-		_figure = figure;
-	}
-
-	/**
-	 * @return the figure
-	 */
-	public ICSSFigure getFigure() {
-		return _figure;
-	}
-
-	/**
-	 * @return the style
-	 */
-	public ICSSStyle getStyle() {
-		return _figure.getCSSStyle();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableRowGroupInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableRowGroupInfo.java
deleted file mode 100644
index 8ab83ff..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableRowGroupInfo.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout.table;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.ICSSFigure;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class TableRowGroupInfo extends TableItemInfo {
-	List _rowList = new ArrayList();
-
-	private int _rowIndex;
-
-	private int _rowCount;
-
-	/**
-	 * @param figure
-	 */
-	public TableRowGroupInfo(ICSSFigure figure) {
-		super(figure);
-	}
-
-	List getRowList() {
-		return _rowList;
-	}
-
-	int getRowIndex() {
-		return _rowIndex;
-	}
-
-	int getRowCount() {
-		return this._rowCount;
-	}
-
-	/**
-	 * @param context
-	 */
-	public void calculateRowGroup(TableInfoContext context) {
-		this._rowIndex = context.getCurrentRow();
-		List children = getFigure().getChildren();
-		for (int i = 0, size = children.size(); i < size; i++) {
-			IFigure childfigure = (IFigure) children.get(i);
-			if (childfigure instanceof ICSSFigure) {
-				ICSSStyle childstyle = ((ICSSFigure) childfigure).getCSSStyle();
-				if (childstyle != null
-						&& "table-row"
-								.equalsIgnoreCase(childstyle.getDisplay())) {
-					TableRowInfo rowInfo = new TableRowInfo(
-							(ICSSFigure) childfigure);
-					_rowList.add(rowInfo);
-					rowInfo.calculateRow(context);
-				} else {
-					// skip
-				}
-			} else {
-				// skip
-			}
-		}
-		context.finishRowGroup();
-		this._rowCount = context.getCurrentRow() - this._rowIndex;
-	}
-
-	/**
-	 * @param _cells
-	 */
-	public void getCells(List _cells) {
-		for (int i = 0, size = _rowList.size(); i < size; i++) {
-			TableRowInfo rowInfo = (TableRowInfo) _rowList.get(i);
-			rowInfo.getCells(_cells);
-		}
-	}
-
-	/**
-	 * @param figure
-	 * @return the table row info
-	 */
-	public TableRowInfo findRowInfo(CSSFigure figure) {
-		for (int i = 0, size = _rowList.size(); i < size; i++) {
-			TableRowInfo rowInfo = (TableRowInfo) _rowList.get(i);
-			if (figure == rowInfo.getFigure()) {
-				return rowInfo;
-			}
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableRowInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableRowInfo.java
deleted file mode 100644
index 75544e2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/layout/table/TableRowInfo.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.layout.table;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.ICSSFigure;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class TableRowInfo extends TableItemInfo {
-	List _cells = new ArrayList();
-
-	int _rowIndex;
-
-	private int _rowHeight;
-
-	/**
-	 * @param figure
-	 */
-	public TableRowInfo(ICSSFigure figure) {
-		super(figure);
-	}
-
-	List getCells() {
-		return _cells;
-	}
-
-	int getRowIndex() {
-		return _rowIndex;
-	}
-
-	int getSpecifiedRowHeight() {
-		return _rowHeight;
-	}
-
-	/**
-	 * @param context
-	 */
-	public void calculateRow(TableInfoContext context) {
-		this._rowIndex = context.getCurrentRow();
-
-		List children = getFigure().getChildren();
-		for (int i = 0, size = children.size(); i < size; i++) {
-			IFigure childfigure = (IFigure) children.get(i);
-			if (childfigure instanceof ICSSFigure) {
-				ICSSStyle childstyle = ((ICSSFigure) childfigure).getCSSStyle();
-				if (childstyle != null) {
-					String display = childstyle.getDisplay();
-					if ("table-cell".equalsIgnoreCase(display)) {
-						TableCellInfo cellInfo = new TableCellInfo(
-								(ICSSFigure) childfigure);
-						cellInfo.calculateCellInfo(context);
-						_cells.add(cellInfo);
-					} else {
-						// skip
-					}
-				}
-			} else {
-				// skip
-			}
-		}
-		// ok, we have finished a row
-		context.finishRow();
-	}
-
-	/**
-	 * @param cells
-	 */
-	public void getCells(List cells) {
-		cells.addAll(this._cells);
-	}
-
-	/**
-	 * @param figure
-	 * @return the table cell info
-	 */
-	public TableCellInfo getCellInfo(CSSFigure figure) {
-		for (int i = 0, size = _cells.size(); i < size; i++) {
-			TableCellInfo cellinfo = (TableCellInfo) _cells.get(i);
-			if (cellinfo.getFigure() == figure) {
-				return cellinfo;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param info
-	 * @param tableHeight
-	 */
-	public void calculateHeight(TableInfo info, int tableHeight) {
-		ICSSStyle style = this.getFigure().getCSSStyle();
-		if (style == null) {
-			this._rowHeight = -1;
-		} else {
-			Object height = style.getStyleProperty(ICSSPropertyID.ATTR_HEIGHT);
-			Length recommendedHeight = (height instanceof Length) ? (Length) height
-					: null;
-
-			int rh = 0;
-			if (recommendedHeight == null || recommendedHeight.getValue() <= 0) {
-				rh = 0;
-			} else {
-				if (recommendedHeight.isPercentage()) {
-					// not supported.
-				} else {
-					rh = recommendedHeight.getValue();
-				}
-				if (rh > 0 && !style.isSizeIncludeBorderPadding()) {
-					rh += style.getBorderInsets().getHeight()
-							+ style.getPaddingInsets().getHeight();
-				}
-			}
-			this._rowHeight = rh;
-		}
-
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/CSSHtmlListStyleData.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/CSSHtmlListStyleData.java
deleted file mode 100644
index 01465cd..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/CSSHtmlListStyleData.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.list;
-
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @author mengbo
- */
-public class CSSHtmlListStyleData {
-	/**
-	 * Image
-	 */
-	public final static int LIST_T_IMAGE = 0;
-
-	/**
-	 * Disc
-	 */
-	public final static int LIST_T_DISC = 1;
-
-	/**
-	 * Circle
-	 */
-	public final static int LIST_T_CIRCLE = 2;
-
-	/**
-	 * Square
-	 */
-	public final static int LIST_T_SQUARE = 3;
-
-	/**
-	 * Decimal
-	 */
-	public final static int LIST_T_DECIMAL = 0x11;
-
-	/**
-	 * Decimial w/ leading zero
-	 */
-	public final static int LIST_T_DECIMAL_LEADING_ZERO = 0x12;
-
-	/**
-	 * Lower alpha
-	 */
-	public final static int LIST_T_LOWER_ALPHA = 0x13;
-
-	/**
-	 * Lower Roman
-	 */
-	public final static int LIST_T_LOWER_ROMAN = 0x14;
-
-	/**
-	 * Upper alpha
-	 */
-	public final static int LIST_T_UPPER_ALPHA = 0x15;
-
-	/**
-	 * Upper Roman
-	 */
-	public final static int LIST_T_UPPER_ROMAN = 0x16;
-
-	//private CSSMarkerStyleData _markerStyleData;
-
-	private Image _markerImage;
-
-	private int _type;
-
-	/**
-	 * @return if is a default picture type
-	 */
-	public boolean isDefaultPicture() {
-		return (_type & 0xf) != 0;
-	}
-
-	private String getResolvedURL() {
-		//String textValue = _markerStyleData.getTextContent();
-		// TODO: when I found this, resolver was not being set and would either
-        // have thrown NPE or returned "".. so I've "improved it :)
-        //URIResolver resolver = null;// FIXME: this is not implemented yet.
-		// DesignerPropertyTool.getModel().getResolver();
-		//if (textValue != null && textValue.length() > 0) {
-		//	return resolver.getLocationByURI(textValue);
-		//}
-		return "";
-	}
-
-	/**
-	 * @return Returns the markerImage.
-	 */
-	public Image getMarkerImage() {
-		if (!this.isImage()) {
-			return null;
-		}
-		if (_markerImage == null) {
-			String uri = this.getResolvedURL();
-			_markerImage = new Image(null, uri);
-		}
-		return _markerImage;
-	}
-
-	/**
-	 * @return Returns the type.
-	 */
-	public int getType() {
-		return _type;
-	}
-
-	/**
-	 * @param type
-	 */
-	public void setType(String type) {
-
-		this._type = toTypeInt(type);
-	}
-
-	/**
-	 * @param index 
-	 * @return Returns the markerString.
-	 */
-	public String getTextValue(int index) {
-		if (!this.isText()) {
-			return null;
-		}
-		// ICounter counter = CounterFactory.getInstance().getCounter(_type);
-		return "";
-
-	}
-
-	/**
-	 * @return true if is a text type
-	 */
-	public boolean isText() {
-		return (_type & 0xf0) != 0;
-	}
-
-	/**
-	 * @return true if is an image type
-	 */
-	public boolean isImage() {
-		return (_type == LIST_T_IMAGE);
-	}
-
-	/**
-	 * @param type
-	 * @return convert the 'type' String to one of LIST_T_*
-	 */
-	public static int toTypeInt(String type) {
-		if (type.equalsIgnoreCase(ICSSPropertyID.VAL_DECIMAL)) {
-			return LIST_T_DECIMAL;
-		} else if (type
-				.equalsIgnoreCase(ICSSPropertyID.VAL_DECIMAL_LEADING_ZERO)) {
-			return LIST_T_DECIMAL_LEADING_ZERO;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_DISC)) {
-			return LIST_T_DISC;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_CIRCLE)) {
-			return LIST_T_CIRCLE;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_SQUARE)) {
-			return LIST_T_SQUARE;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_IMAGE)) {
-			return LIST_T_IMAGE;
-		}
-
-		return 0;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/CSSMarkerStyleData.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/CSSMarkerStyleData.java
deleted file mode 100644
index 0383b52..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/CSSMarkerStyleData.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.list;
-
-import java.util.Vector;
-
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-
-/**
- * @author mengbo
- */
-public class CSSMarkerStyleData {
-	private Vector _content;
-
-	private String _textContent;
-
-	private int _Offset;
-
-	private boolean _isOutside;
-
-	/**
-	 * @return Returns the isBefore.
-	 */
-	public boolean isOutside() {
-		return _isOutside;
-	}
-
-	/**
-	 * @param position
-	 *            The isBefore to set.
-	 */
-	public void setPosition(String position) {
-		if (position == ICSSPropertyID.VAL_INSIDE) {
-			_isOutside = false;
-		} else if (position == ICSSPropertyID.VAL_OUTSIDE) {
-			_isOutside = true;
-		}
-	}
-
-	/**
-	 * @return Returns the _Offset.
-	 */
-	public int getOffset() {
-		return _Offset;
-	}
-
-	/**
-	 * @param offset
-	 *            The _Offset to set.
-	 */
-	public void setOffset(int offset) {
-		_Offset = offset;
-	}
-
-	/**
-	 * @return Returns the _textValue.
-	 */
-	public String getTextContent() {
-		return _textContent;
-	}
-
-	/**
-	 * @param value
-	 *            The _textValue to set.
-	 */
-	public void setTextContent(String value) {
-		_textContent = value;
-	}
-
-	/**
-	 * @return the next element.  removes it from the content vector.  Returns
-	 * null if the content is empty
-	 */
-	public Object getNextElement() {
-		if (_content == null || _content.size() == 0) {
-			return null;
-		}
-		return _content.remove(0);
-	}
-
-	/**
-	 * @param content
-	 */
-	public void setContent(Vector content) {
-		_content = content;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/ContentObject.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/ContentObject.java
deleted file mode 100644
index ad32149..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/ContentObject.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.list;
-
-/**
- * A simple template objec, when we resole content in detail, we will create
- * more complicated object reference structure.
- * 
- * @author mengbo
- */
-public class ContentObject {
-	private ICounterValueGenerator _counter;
-
-	/**
-	 * @return Returns the _counter.
-	 */
-	public ICounterValueGenerator getCounter() {
-		return _counter;
-	}
-
-	/**
-	 * @param counter
-	 *            The _counter to set.
-	 */
-	public void setCounter(ICounterValueGenerator counter) {
-		this._counter = counter;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/CounterHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/CounterHelper.java
deleted file mode 100644
index b6913d7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/CounterHelper.java
+++ /dev/null
@@ -1,280 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.list;
-
-import java.util.HashMap;
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSPrimitiveValue;
-import org.w3c.dom.css.CSSPrimitiveValue;
-
-/**
- * @author mengbo
- */
-public final class CounterHelper {
-	/**
-	 * Image
-	 */
-	public final static int LIST_T_IMAGE = 0;
-
-	/**
-	 * Disc
-	 */
-	public final static int LIST_T_DISC = 1;
-
-	/**
-	 * Circle
-	 */
-	public final static int LIST_T_CIRCLE = 2;
-
-	/**
-	 * Square
-	 */
-	public final static int LIST_T_SQUARE = 3;
-
-	/**
-	 * Decimal
-	 */
-	public final static int LIST_T_DECIMAL = 0x11;
-
-	/**
-	 * Leading-zero decimal
-	 */
-	public final static int LIST_T_DECIMAL_LEADING_ZERO = 0x12;
-
-	/**
-	 * Lower alpha
-	 */
-	public final static int LIST_T_LOWER_ALPHA = 0x13;
-
-	/**
-	 * Lower roman
-	 */
-	public final static int LIST_T_LOWER_ROMAN = 0x14;
-
-	/**
-	 * Upper alpha
-	 */
-	public final static int LIST_T_UPPER_ALPHA = 0x15;
-
-	/**
-	 * Upper roman
-	 */
-	public final static int LIST_T_UPPER_ROMAN = 0x16;
-
-	/**
-	 * Lower greek
-	 */
-	public final static int LIST_T_LOWER_GREEK = 0x21;
-
-	/**
-	 * Armenian
-	 */
-	public final static int LIST_T_ARMENIAN = 0x22;
-
-	/**
-	 * Georgian
-	 */
-	public final static int LIST_T_GEORGIAN = 0x23;
-
-	/**
-	 * None
-	 */
-	public final static int LIST_T_NONE = 0x24;
-	/**
-	 * @param style
-	 * @param counters
-	 */
-	public static void processCounterReset(ICSSStyle style, HashMap counters) {
-		Assert.isTrue(style != null && counters != null);
-		// counter-reset will create new one.
-		Object counterResets = style
-				.getStyleProperty(ICSSPropertyID.ATTR_COUNTER_RESET);
-		if ((counterResets) != null
-				&& counterResets != ICSSPropertyMeta.NOT_SPECIFIED) {
-			if (counterResets instanceof List) {
-				List crList = (List) counterResets;
-				for (int i = 0, n = crList.size(); i < n; i++) {
-					ResetObject rObject = (ResetObject) crList.get(i);
-					String name = rObject.getCounterName();
-					Object counter = null;
-					if (counters.size() > 0 && counters.containsKey(name)) {
-						// Already resolved
-						counter = counters.get(name);
-					}
-					if (counter != null) {
-						if (rObject.getInitial() != null) {
-							((ICounterValueGenerator) counter)
-									.resetCount(rObject.getInitial().intValue());
-						} else {
-							counter = ((ICounterValueGenerator) counter)
-									.resetCount();
-						}
-						counters.put(((ICounterValueGenerator) counter)
-								.getIdentifier(), counter);
-					} else {
-						// create new one
-						Object listStyle = style
-								.getStyleProperty(ICSSPropertyID.ATTR_LIST_STYLE_TYPE);
-						if (listStyle instanceof String) {
-							counter = new CounterValueGenerator(name,
-									(String) listStyle, null, style);
-							if (rObject.getInitial() != null) {
-								((ICounterValueGenerator) counter)
-										.resetCount(rObject.getInitial()
-												.intValue());
-							} else {
-								counter = ((ICounterValueGenerator) counter)
-										.resetCount();
-							}
-						}
-						counters.put(((ICounterValueGenerator) counter)
-								.getIdentifier(), counter);
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * @param style
-	 */
-	public static void processCounterIncrement(ICSSStyle style) {
-		Object counterIncrements = style
-				.getStyleProperty(ICSSPropertyID.ATTR_COUNTER_INCREMENT);
-		if (counterIncrements != null
-				&& counterIncrements != ICSSPropertyMeta.NOT_SPECIFIED) {
-			if (counterIncrements instanceof List) {
-				List crList = (List) counterIncrements;
-				for (int i = 0, n = crList.size(); i < n; i++) {
-					IncrementObject rObject = (IncrementObject) crList.get(i);
-					String name = rObject.getCounterName();
-					Object counter = null;
-					counter = style.findCounter(name, true);
-					if (counter != null) {
-						if (HTMLListInfoHelper.getValueInt(style) == null) {
-							if (rObject.getIncrement() != null) {
-								((ICounterValueGenerator) counter)
-										.increase(rObject.getIncrement()
-												.intValue());
-							} else {
-								((ICounterValueGenerator) counter).increase();
-							}
-						} else {
-							((ICounterValueGenerator) counter)
-									.setCount(HTMLListInfoHelper
-											.getValueInt(style));
-						}
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * @param style
-	 * @return true if the style is a text style
-	 */
-	public static boolean isText(ICSSStyle style) {
-		String display = style.getDisplay();
-		Object styleType = style
-				.getStyleProperty(ICSSPropertyID.ATTR_LIST_STYLE_TYPE);
-		return (display
-				.equalsIgnoreCase(ICSSPropertyID.VAL_LIST_ITEM) //
-				&& styleType instanceof String //
-		&& !CounterValueGenerator.NON_STRING_TYPES.contains(styleType));
-	}
-
-	/**
-	 * @param style
-	 * @return the type of the style.  One of the LIST_T_* values, or -1 if the
-	 * style is unknown
-	 */
-	public static int getType(ICSSStyle style) {
-		Object type = style
-				.getStyleProperty(ICSSPropertyID.ATTR_LIST_STYLE_TYPE);
-		if (type instanceof String) {
-			return toTypeInt((String) type);
-		}
-        return -1;
-	}
-
-	/**
-	 * @param type
-	 * @return the type enumeration for the  type string
-	 */
-	public static int toTypeInt(String type) {
-
-		if (type.equalsIgnoreCase(ICSSPropertyID.VAL_DECIMAL)) {
-			return LIST_T_DECIMAL;
-		} else if (type
-				.equalsIgnoreCase(ICSSPropertyID.VAL_DECIMAL_LEADING_ZERO)) {
-			return LIST_T_DECIMAL_LEADING_ZERO;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_DISC)) {
-			return LIST_T_DISC;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_CIRCLE)) {
-			return LIST_T_CIRCLE;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_SQUARE)) {
-			return LIST_T_SQUARE;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_IMAGE)) {
-			return LIST_T_IMAGE;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_UPPER_LATIN)) {
-			return LIST_T_UPPER_ALPHA;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_UPPER_ALPHA)) {
-			return LIST_T_UPPER_ALPHA;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_LOWER_LATIN)) {
-			return LIST_T_LOWER_ALPHA;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_LOWER_ALPHA)) {
-			return LIST_T_LOWER_ALPHA;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_UPPER_ROMAN)) {
-			return LIST_T_UPPER_ROMAN;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_LOWER_ROMAN)) {
-			return LIST_T_LOWER_ROMAN;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_LOWER_GREEK)) {
-			return LIST_T_LOWER_GREEK;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_ARMENIAN)) {
-			return LIST_T_ARMENIAN;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_GEORGIAN)) {
-			return LIST_T_GEORGIAN;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_NONE)) {
-			return LIST_T_NONE;
-		}
-		return 0;
-	}
-
-	/**
-	 * @param cssValue
-	 * @return true if the cssValue is an IDENT
-	 */
-	public static boolean isIdentifier(Object cssValue) {
-		return (cssValue instanceof ICSSPrimitiveValue)
-				&& ((ICSSPrimitiveValue) cssValue).getPrimitiveType() == CSSPrimitiveValue.CSS_IDENT;
-	}
-
-	/**
-	 * @param cssValue
-	 * @return true if the css value is a number
-	 */
-	public static boolean isNumber(Object cssValue) {
-		return cssValue instanceof ICSSPrimitiveValue
-				&& ((ICSSPrimitiveValue) cssValue).getPrimitiveType() == ICSSPrimitiveValue.CSS_INTEGER;
-	}
-	
-	private  CounterHelper()
-	{
-	    //  util class; no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/CounterValueGenerator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/CounterValueGenerator.java
deleted file mode 100644
index a05bb7b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/CounterValueGenerator.java
+++ /dev/null
@@ -1,446 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.list;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta;
-
-/**
- * The counter is used to generate automatic conters and numbering for list
- * item. XXX: what do we deal with psedo? and we need to refer to web tools
- * content to consult for style content.
- * 
- * @author mengbo
- */
-public class CounterValueGenerator implements ICounterValueGenerator {
-	private final static int DEFAULT_INITIAL_VALUE = 0;
-
-	private static final Set STRING_TYPES = new HashSet();
-
-	static final Set NON_STRING_TYPES = new HashSet();
-	static {
-		NON_STRING_TYPES.add("disc");
-		NON_STRING_TYPES.add("circle");
-		NON_STRING_TYPES.add("square");
-		STRING_TYPES.add("decimal");
-		STRING_TYPES.add("decimal-leading-zero");
-		STRING_TYPES.add("lower-roman");
-		STRING_TYPES.add("upper-roman");
-		STRING_TYPES.add("lower-greek");
-		STRING_TYPES.add("lower-alpha");
-		STRING_TYPES.add("lower-latin");
-		STRING_TYPES.add("upper-alpha");
-		STRING_TYPES.add("upper-latin");
-		STRING_TYPES.add("hebrew");
-		STRING_TYPES.add("armenian");
-		STRING_TYPES.add("georgian");
-		STRING_TYPES.add("cjk-ideographic");
-		STRING_TYPES.add("hiragana");
-		STRING_TYPES.add("katakana");
-		STRING_TYPES.add("hiragana-iroha");
-		STRING_TYPES.add("katakana-iroha");
-	}
-
-	private final static int DEFAULT_INCREMENT = 1;
-
-	private boolean _first = true;
-
-	private Integer _initial;
-
-	private List _visitors;
-
-	private int _count;
-
-	private String _identifier;
-
-	private String _styleType;
-
-	private String _seperator;
-
-	private ICSSStyle _style;
-
-	/**
-	 * @param identifier
-	 * @param styleType
-	 * @param seperator
-	 * @param style
-	 */
-	public CounterValueGenerator(String identifier, String styleType,
-			String seperator, ICSSStyle style) {
-		_identifier = identifier;
-		_styleType = styleType;
-		_seperator = seperator;
-		_style = style;
-		if (HTMLListInfoHelper.getStartInt(style) != null) {
-			_count = HTMLListInfoHelper.getStartInt(style).intValue();
-		} else {
-			_count = DEFAULT_INITIAL_VALUE;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.w3c.dom.css.Counter#getIdentifier()
-	 */
-	public String getIdentifier() {
-		return _identifier;
-	}
-
-	/**
-	 * @return the style  type 
-	 * @see org.w3c.dom.css.Counter#getListStyle()
-	 */
-	public String getListStyle() {
-		return _styleType;
-	}
-
-	/**
-	 * @return the separator
-	 * 
-	 * @see org.w3c.dom.css.Counter#getSeparator()
-	 */
-	public String getSeparator() {
-		return _seperator;
-	}
-
-	// /**
-	// * @return Returns the type.
-	// */
-	// public String getType()
-	// {
-	// return _styleType;
-	// }
-
-	// /**
-	// * @return Returns the markerString.
-	// */
-	// public String getTextValue()
-	// {
-	// Assert.isTrue(this.isText());
-	// _index = getDeclaredIndex();
-	// Node container = findParentComtainer();
-	// if (container == null)
-	// {
-	// // what condition?
-	// return "";
-	// }
-	// String exp = "";
-	// int startIndex = getStartIndex(container);
-	// int maxLength = calculateMaxlength(container, 0) + startIndex - 1;
-	// Assert.isTrue(maxLength > 0);
-	// if (_index == -1)
-	// {
-	// // no declared value
-	// calculateIndex(container);
-	// Assert.isTrue(_index > -1);
-	// exp = Integer.toString(_index + startIndex);
-	// }
-	// else
-	// {
-	// exp = Integer.toString(_index);
-	// }
-	// if (getType() == CounterHelper.LIST_T_DECIMAL)
-	// {
-	// exp = appendSuffix(exp, Integer.toString(maxLength).length() -
-	// exp.length());
-	// }
-	// else if (getType() == CounterHelper.LIST_T_DECIMAL_LEADING_ZERO)
-	// {
-	// exp = addPrefix(exp, maxLength - exp.length());
-	// }
-	// return exp + ".";
-	//
-	// }
-
-	// private String addPrefix(String exp, int length)
-	// {
-	// while (length > 0)
-	// {
-	// exp = "0" + exp;
-	// length--;
-	// }
-	// return exp;
-	// }
-	//
-	// private String appendSuffix(String exp, int length)
-	// {
-	// while (length > 0)
-	// {
-	// exp = exp + " ";
-	// length--;
-	// }
-	// return exp;
-	// }
-
-	// private boolean calculateIndex(Node node)
-	// {
-	// if (node == _node)
-	// {
-	// _index++;
-	// return true;
-	// }
-	// String name = node.getNodeName();
-	// if (name != null && name.equalsIgnoreCase("li"))
-	// {
-	// _index++;
-	// }
-	// if (!node.hasChildNodes())
-	// {
-	// return false;
-	// }
-	// node = node.getFirstChild();
-	// while (node != null)
-	// {
-	// name = node.getNodeName();
-	// if (name != null && !(name.equalsIgnoreCase("ul") ||
-	// name.equalsIgnoreCase("ol")))
-	// {
-	// if (calculateIndex(node))
-	// {
-	// return true;
-	// }
-	// }
-	// node = node.getNextSibling();
-	// }
-	// return false;
-	// }
-
-	// This method may be refered for the zero-leading calculation.
-	// private int calculateMaxlength(Node node, int index)
-	// {
-	// String name = node.getNodeName();
-	// if (name != null && name.equalsIgnoreCase("li"))
-	// {
-	// index++;
-	// }
-	// if (!node.hasChildNodes())
-	// {
-	// return index;
-	// }
-	// node = node.getFirstChild();
-	// while (node != null)
-	// {
-	// name = node.getNodeName();
-	// if (name != null && !(name.equalsIgnoreCase("ul") ||
-	// name.equalsIgnoreCase("ol")))
-	// {
-	// index = calculateMaxlength(node, index);
-	// }
-	// node = node.getNextSibling();
-	// }
-	// return index;
-	// }
-	//
-
-	// private int getStartIndex(Node container)
-	// {
-	// String value = ((Element) container).getAttribute("start");
-	// try
-	// {
-	// int index = Integer.parseInt(value);
-	// if (index < 0)
-	// {
-	// return 1;
-	// }
-	// return index;
-	// }
-	// catch (Exception e)
-	// {
-	// return 1;
-	// }
-	// }
-
-	// private boolean isStringTyped(ICSSStyle style)
-	// {
-	// style.getStyleProperty("list-style-type");
-	// return true;
-	// }
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#clone()
-	 */
-	protected Object clone() throws CloneNotSupportedException {
-		CounterValueGenerator newInstance = new CounterValueGenerator(
-				_identifier, _styleType, _seperator, _style);
-		return newInstance;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.list.Counter2#increase()
-	 */
-	public void increase(int increment) {
-		if (!_first || HTMLListInfoHelper.getStartInt(_style) == null) {
-			_count += increment;
-		}
-		_first = false;
-	}
-
-	public void increase() {
-		increase(DEFAULT_INCREMENT);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.list.Counter2#setCount()
-	 */
-	public ICounterValueGenerator resetCount() {
-		try {
-			ICounterValueGenerator counter = (ICounterValueGenerator) this
-					.clone();
-			_initial = null;
-			_count = HTMLListInfoHelper.getStartInt(_style) != null ? HTMLListInfoHelper
-					.getStartInt(_style).intValue()
-					: DEFAULT_INITIAL_VALUE;
-			return counter;
-		} catch (CloneNotSupportedException e) {
-			return null;
-		}
-	}
-
-	/**
-	 * @return Returns the _initial.
-	 */
-	public int getInitial() {
-		if (HTMLListInfoHelper.getStartInt(_style) != null) {
-			return HTMLListInfoHelper.getStartInt(_style).intValue();
-		}
-        return _initial != null ? _initial.intValue()
-        		: DEFAULT_INITIAL_VALUE;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.list.Counter2#setCount()
-	 */
-	public ICounterValueGenerator resetCount(int initial) {
-		try {
-			CounterValueGenerator counter = (CounterValueGenerator) this
-					.clone();
-			_initial = new Integer(initial);
-			_count = initial;
-			return counter;
-		} catch (CloneNotSupportedException e) {
-			return null;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.list.ICounterValueGenerator#setCount(org.eclipse.jst.pagedesigner.css2.list.HTMLListInfo)
-	 */
-	public void setCount(Integer value) {
-		if (value != null) {
-			_count = value.intValue();
-			_first = false;
-		}
-	}
-
-	// /**
-	// * The clients of this counter need to regist them.
-	// *
-	// * @see
-	// org.eclipse.jst.pagedesigner.css2.list.Counter2#regist(java.lang.Object)
-	// */
-	// public void regist(Object caller)
-	// {
-	// Assert.isTrue(caller instanceof ICSSStyle);
-	// if (_visitors == null)
-	// {
-	// _visitors = new LinkedList();
-	// }
-	// if (!_visitors.contains(caller))
-	// {
-	// _visitors.add(caller);
-	// }
-	// }
-	//
-	// /**
-	// * (non-Javadoc)
-	// *
-	// * @see
-	// org.eclipse.jst.pagedesigner.css2.list.Counter2#unregist(java.lang.Object)
-	// */
-	// public void unregist(Object caller)
-	// {
-	// if (_visitors.contains(caller))
-	// {
-	// _visitors.remove(caller);
-	// }
-	// }
-
-	/**
-	 * Return the int value.
-	 * 
-	 * @author mengbo
-	 */
-	public int getCurrentCount() {
-		return _count;
-	}
-
-	/**
-	 * Currently we recalculate the count, to enhance the performance, we may
-	 * use _count, but this requires delicate synchronization when the
-	 * calculation is looped.
-	 */
-	public Integer getCount(Object oCaller) {
-		Assert.isTrue(oCaller instanceof ICSSStyle && _visitors != null
-				&& _visitors.size() > 0);
-		ICSSStyle caller = (ICSSStyle) oCaller;
-		if (!_visitors.contains(caller)) {
-			return null;
-		}
-		int result = getInitial();
-
-		for (int i = 0, n = _visitors.size(); i < n; i++) {
-			ICSSStyle style = (ICSSStyle) _visitors.get(i);
-			// get the count;
-			Object counterIncrements = style
-					.getStyleProperty(ICSSPropertyID.ATTR_COUNTER_INCREMENT);
-			if (counterIncrements != null
-					&& counterIncrements != ICSSPropertyMeta.NOT_SPECIFIED) {
-				if (counterIncrements instanceof List) {
-					List crList = (List) counterIncrements;
-					for (int j = 0, nn = crList.size(); j < nn; j++) {
-						IncrementObject rObject = (IncrementObject) crList
-								.get(j);
-						String name = rObject.getCounterName();
-						if (getIdentifier().equalsIgnoreCase(name)) {
-							if (rObject.getIncrement() != null) {
-								result += rObject.getIncrement().intValue();
-							} else {
-								result += DEFAULT_INCREMENT;
-							}
-						}
-					}
-				}
-			}
-			if (style == caller) {
-				return new Integer(result);
-			}
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/HTMLListInfoHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/HTMLListInfoHelper.java
deleted file mode 100644
index c352f96..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/HTMLListInfoHelper.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.list;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.style.AbstractStyle;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * Resolve the attrbites 'start' on 'ol' and 'value' on 'li'.
- * 
- * @author mengbo
- */
-/*package*/ final class HTMLListInfoHelper {
-	/**
-	 * @return Returns the start.
-	 */
-	private static String getStart(ICSSStyle _style) {
-		if (_style instanceof AbstractStyle) {
-			Element element = ((AbstractStyle) _style).getElement();
-			Node parent = null;
-			if ((parent = EditModelQuery.getParent(IHTMLConstants.TAG_OL,
-					element, true)) != null) {
-				return ((Element) parent)
-						.getAttribute(IHTMLConstants.ATTR_START);
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param style
-	 * @return the start int
-	 */
-	public static Integer getStartInt(ICSSStyle style) {
-		try {
-			return new Integer(getStart(style));
-		} catch (Exception e) {
-			return null;
-		}
-	}
-
-	/**
-	 * @return Returns the value.
-	 */
-	private static String getValue(ICSSStyle _style) {
-		if (_style instanceof AbstractStyle) {
-			Element element = ((AbstractStyle) _style).getElement();
-			if (element != null) {
-				return element.getAttribute(IHTMLConstants.ATTR_VALUE);
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param style
-	 * @return the Integer value or null if not parsable
-	 */
-	public static Integer getValueInt(ICSSStyle style) {
-		try {
-			return Integer.valueOf(getValue(style));
-		} catch (NumberFormatException ex) {
-			return null;
-		}
-	}
-	
-	private HTMLListInfoHelper()
-	{
-	    // no external instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/ICounterValueGenerator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/ICounterValueGenerator.java
deleted file mode 100644
index 67d0197..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/ICounterValueGenerator.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.list;
-
-/**
- * @author mengbo
- */
-public interface ICounterValueGenerator {
-	/**
-	 * @return the identifier
-	 */
-	public String getIdentifier();
-
-	/**
-	 * @param initial
-	 * @return the reset count
-	 */
-	public ICounterValueGenerator resetCount(int initial);
-
-	/**
-	 * @return the generator
-	 */
-	public ICounterValueGenerator resetCount();
-
-	/**
-	 * Set the counter based on value.
-	 * @param value 
-	 */
-	public void setCount(Integer value);
-
-	// public void regist(Object caller);
-	// public void unregist(Object caller);
-
-	/**
-	 * Increase counter based on declared increment number
-	 * @param increment 
-	 */
-	public void increase(int increment);
-
-	/**
-	 * Increase counter with default increment number(1)
-	 */
-	public void increase();
-
-	/**
-	 * @param caller
-	 * @return the count
-	 */
-	public Integer getCount(Object caller);
-
-	/**
-	 * @return the current count
-	 */
-	public int getCurrentCount();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/IIndexConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/IIndexConverter.java
deleted file mode 100644
index 5e220a1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/IIndexConverter.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.list;
-
-/**
- * @author mengbo
- */
-public interface IIndexConverter {
-	/**
-	 * @param index
-	 * @return the string at index
-	 */
-	String getString(int index);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/IncrementObject.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/IncrementObject.java
deleted file mode 100644
index 71c9140..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/IncrementObject.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.list;
-
-/**
- * @author mengbo
- */
-public class IncrementObject {
-	private String _counterName;
-
-	private Integer _increment;
-
-	/**
-	 * @param name
-	 * @param increment
-	 */
-	public IncrementObject(String name, Integer increment) {
-		_counterName = name;
-		_increment = increment;
-	}
-
-	/**
-	 * @return Returns the _counterName.
-	 */
-	public String getCounterName() {
-		return _counterName;
-	}
-
-	/**
-	 * @param name
-	 *            The _counterName to set.
-	 */
-	public void setCounterName(String name) {
-		_counterName = name;
-	}
-
-	/**
-	 * @return Returns the _increment.
-	 */
-	public Integer getIncrement() {
-		return _increment;
-	}
-
-	/**
-	 * @param _increment
-	 *            The _increment to set.
-	 */
-	public void setIncrement(Integer _increment) {
-		this._increment = _increment;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/ListStyleUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/ListStyleUtil.java
deleted file mode 100644
index ccab58f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/ListStyleUtil.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.list;
-
-/**
- * @author mengbo
- */
-/*package*/ final class ListStyleUtil {
-	/**
-	 * @param type
-	 * @param index
-	 * @return the type as a string
-	 */
-	public static String convertTypeToString(int type, int index) {
-		if (type == CSSHtmlListStyleData.LIST_T_LOWER_ROMAN
-				|| type == CSSHtmlListStyleData.LIST_T_UPPER_ROMAN) {
-			// TODO: to implement roman.
-			// return decimalToRoman(index);
-		} else if (type == CSSHtmlListStyleData.LIST_T_DECIMAL
-				|| type == CSSHtmlListStyleData.LIST_T_DECIMAL_LEADING_ZERO) {
-			return Integer.toString(index);
-		}
-		return null;
-	}
-
-	private ListStyleUtil()
-	{
-	    // no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/ResetObject.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/ResetObject.java
deleted file mode 100644
index 0cc1138..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/list/ResetObject.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.list;
-
-/**
- * @author mengbo
- */
-public class ResetObject {
-	private String _counterName;
-
-	private Integer _initial;
-
-	/**
-	 * @param name
-	 * @param initial
-	 */
-	public ResetObject(String name, Integer initial) {
-		_counterName = name;
-		_initial = initial;
-	}
-
-	/**
-	 * @return Returns the _counterName.
-	 */
-	public String getCounterName() {
-		return _counterName;
-	}
-
-	/**
-	 * @param name
-	 *            The _counterName to set.
-	 */
-	public void setCounterName(String name) {
-		_counterName = name;
-	}
-
-	/**
-	 * @return Returns the _increment.
-	 */
-	public Integer getInitial() {
-		return _initial;
-	}
-
-	/**
-	 * @param _initial
-	 *            The _increment to set.
-	 */
-	public void setInitial(Integer _initial) {
-		this._initial = _initial;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/CounterFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/CounterFactory.java
deleted file mode 100644
index 32dec84..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/CounterFactory.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.marker;
-
-import org.eclipse.jst.pagedesigner.css2.list.CSSHtmlListStyleData;
-
-/**
- * @author mengbo
- */
-public class CounterFactory {
-	private static DecimalCounter _decimalCounterInstance;
-
-	private static RomanCounter _romanCounterInstance;
-
-	private static CounterFactory _instance;
-
-	/**
-	 * @return the factory singelton
-	 */
-	public static CounterFactory getInstance() {
-		if (_instance == null) {
-			_instance = new CounterFactory();
-		}
-		return _instance;
-	}
-
-	/**
-	 * @param type
-	 * @return the counter for type
-	 */
-	public ICounter getCounter(int type) {
-		switch (type) {
-		case CSSHtmlListStyleData.LIST_T_DECIMAL:
-		case CSSHtmlListStyleData.LIST_T_DECIMAL_LEADING_ZERO:
-			if (_decimalCounterInstance == null) {
-				_decimalCounterInstance = new DecimalCounter();
-			}
-			return _decimalCounterInstance;
-		case CSSHtmlListStyleData.LIST_T_LOWER_ROMAN:
-		case CSSHtmlListStyleData.LIST_T_UPPER_ROMAN:
-			if (_romanCounterInstance == null) {
-				_romanCounterInstance = new RomanCounter();
-			}
-			return _romanCounterInstance;
-		default:
-			return null;
-
-		}
-	}
-	
-	private CounterFactory()
-	{
-	    // singleton, no external instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/CounterUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/CounterUtil.java
deleted file mode 100644
index 4864dd3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/CounterUtil.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.marker;
-
-import org.eclipse.jst.pagedesigner.css2.list.CounterHelper;
-
-/**
- * @author mengbo
- */
-public final class CounterUtil {
-	/**
-	 * @param count
-	 * @param type
-	 * @return the converter count
-	 */
-	public static String convertCount(int count, int type) {
-		// XXX: currently we only support style that IE supported.for type that
-		// does not
-		// support we return an empty String.
-		StringBuffer buffer = new StringBuffer();
-		switch (type) {
-		case CounterHelper.LIST_T_DECIMAL:
-			buffer.append(count);
-			buffer.append('.');
-			break;
-		case CounterHelper.LIST_T_UPPER_ALPHA:
-		case CounterHelper.LIST_T_LOWER_ALPHA:
-			char charA = 'a';
-			if (type == CounterHelper.LIST_T_UPPER_ALPHA) {
-				charA = 'A';
-			}
-			int index = count;
-			while (index > 0 && index > 26) {
-				buffer.append((char) (charA + (index / 26) - 1));
-				index = index % 26;
-			}
-			buffer.append((char) (charA + (index - 1)));
-			buffer.append(".");
-			break;
-		case CounterHelper.LIST_T_UPPER_ROMAN:
-		case CounterHelper.LIST_T_LOWER_ROMAN:
-			String string = new RomanCounter().getString(count);
-			if (type == CounterHelper.LIST_T_LOWER_ROMAN) {
-				buffer.append(string.toLowerCase());
-			} else {
-				buffer.append(string);
-			}
-			buffer.append(".");
-			break;
-		case CounterHelper.LIST_T_ARMENIAN:
-			break;
-		case CounterHelper.LIST_T_DECIMAL_LEADING_ZERO:
-			break;
-		case CounterHelper.LIST_T_LOWER_GREEK:
-			break;
-		case CounterHelper.LIST_T_GEORGIAN:
-			break;
-		default:
-			break;
-		}
-		return buffer.toString();
-	}
-	
-	private CounterUtil()
-	{
-	    // no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/DecimalCounter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/DecimalCounter.java
deleted file mode 100644
index ddce690..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/DecimalCounter.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.marker;
-
-import org.eclipse.jst.pagedesigner.css2.list.CSSHtmlListStyleData;
-
-/**
- * @author mengbo
- */
-/*package*/ class DecimalCounter extends EnumerableCounter 
-{
-	
-    DecimalCounter() 
-    {
-	    // do nothing; only nee
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.list.EnumerableCounter#getString(int)
-	 */
-	public String getNextString(int index, int type) {
-		//String result;
-		switch (type) {
-		case CSSHtmlListStyleData.LIST_T_DECIMAL:
-			return Integer.toString(index);
-
-		case CSSHtmlListStyleData.LIST_T_DECIMAL_LEADING_ZERO:
-			StringBuffer sb = new StringBuffer();
-			int count = 1;
-			for (int i = sb.length(); i < count; i++) {
-				sb.append('0');
-			}
-			sb.append(Integer.toString(index));
-			return sb.toString();
-		default:
-			return null;
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/EnumerableCounter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/EnumerableCounter.java
deleted file mode 100644
index 3dfbef8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/EnumerableCounter.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.marker;
-
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- */
-public abstract class EnumerableCounter implements ICounter {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.list.ICounter#getNextObject(org.w3c.dom.Element,
-	 *      java.lang.String)
-	 */
-	public final Object getNextObject(Element element, int type) {
-		int index = calculateIndex(element);
-		return getNextString(index, type);
-	}
-
-	/**
-	 * @param element
-	 * @return the index of the element in its parent
-	 */
-	public final int calculateIndex(Element element) {
-		final String tag = element.getLocalName();
-		final Node parent = element.getParentNode();
-		final NodeList children = parent.getChildNodes();
-		int index = 1;
-		for (int i = 0; i < children.getLength(); i++) {
-			final Node child = children.item(i);
-			if (child == element) {
-				break;
-			}
-			if (child.getLocalName().equalsIgnoreCase(tag)) {
-				index++;
-			}
-		}
-		return index;
-	}
-
-	/**
-	 * @param index
-	 * @param type
-	 * @return the string for the next index
-	 */
-	public abstract String getNextString(int index, int type);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/ICounter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/ICounter.java
deleted file mode 100644
index cc06af3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/ICounter.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.marker;
-
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public interface ICounter {
-	/**
-	 * @param element
-	 * @param type
-	 * @return the next object for element, type
-	 */
-	public Object getNextObject(Element element, int type);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/RomanCounter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/RomanCounter.java
deleted file mode 100644
index 52e4626..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/marker/RomanCounter.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.marker;
-
-import org.eclipse.jst.pagedesigner.css2.list.CSSHtmlListStyleData;
-
-/**
- * @author mengbo
- */
-/*package*/ class RomanCounter extends EnumerableCounter {
-	RomanCounter() 
-	{
-	    // do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.list.EnumerableCounter#getString(int,
-	 *      boolean)
-	 */
-	public String getNextString(int index, int type) {
-		switch (type) {
-		case CSSHtmlListStyleData.LIST_T_LOWER_ROMAN:
-			return getString(index).toLowerCase();
-		case CSSHtmlListStyleData.LIST_T_UPPER_ROMAN:
-			return getString(index);
-		default:
-			return null;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.list.NumberCounter#getString(int)
-	 */
-	/*package*/ String getString(int index) {
-		// FIXME: Need to enhance more.
-		StringBuffer roman = new StringBuffer();
-		int a, b, c, d;
-		a = (index / 1000) * 1000;
-		b = ((index / 100) % 10) * 100;
-		c = ((index / 10) % 10) * 10;
-		d = ((index / 1) % 10) * 1;
-
-		if (a == 1000)
-			roman.append("M");
-		else if (a == 2000)
-			roman.append("MM");
-		else if (a == 3000)
-			roman.append("MMM");
-
-		if (b == 100)
-			roman.append("C");
-		else if (b == 200)
-			roman.append("CC");
-		else if (b == 300)
-			roman.append("CCC");
-		else if (b == 400)
-			roman.append("CD");
-		else if (b == 500)
-			roman.append("D");
-		else if (b == 600)
-			roman.append("DC");
-		else if (b == 700)
-			roman.append("DCC");
-		else if (b == 800)
-			roman.append("DCCC");
-		else if (b == 900)
-			roman.append("CM");
-
-		if (c == 10)
-			roman.append("X");
-		else if (c == 20)
-			roman.append("XX");
-		else if (c == 30)
-			roman.append("XXX");
-		else if (c == 40)
-			roman.append("XL");
-		else if (c == 50)
-			roman.append("L");
-		else if (c == 60)
-			roman.append("LX");
-		else if (c == 70)
-			roman.append("LXX");
-		else if (c == 80)
-			roman.append("LXXX");
-		else if (c == 90)
-			roman.append("XC");
-
-		if (d == 1)
-			roman.append("I");
-		else if (d == 2)
-			roman.append("II");
-		else if (d == 3)
-			roman.append("III");
-		else if (d == 4)
-			roman.append("IV");
-		else if (d == 5)
-			roman.append("V");
-		else if (d == 6)
-			roman.append("VI");
-		else if (d == 7)
-			roman.append("VII");
-		else if (d == 8)
-			roman.append("VIII");
-		else if (d == 9)
-			roman.append("IX");
-
-		return roman.toString();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BackgroundColorMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BackgroundColorMeta.java
deleted file mode 100644
index f738c47..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BackgroundColorMeta.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.color.CSSColorManager;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * @author mengbo
- */
-public class BackgroundColorMeta extends CSSPropertyMeta {
-	private static final String[] _keywords = new String[] { ICSSPropertyID.VAL_TRANSPARENT };
-
-	/**
-	 */
-	public BackgroundColorMeta() {
-		super(false, ICSSPropertyID.VAL_TRANSPARENT);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.property.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		String text = value.getCssText();
-		Object result = CSSColorManager.getInstance().getColor(text);
-		if (result != null) {
-			return result;
-		}
-        return getInitialValue(propertyName, style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return _keywords;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		Object result;
-		String colorAttr = null;
-		if (ICSSPropertyID.ATTR_BACKGROUND_COLOR.equalsIgnoreCase(propertyName)) {
-			colorAttr = DOMUtil.getAttributeIgnoreCase(element,
-					ICSSPropertyID.ATTR_BGCOLOR);
-		}
-		if (colorAttr != null && colorAttr.trim().length() != 0) {
-			colorAttr = colorAttr.trim();
-			result = CSSColorManager.getInstance().getColor(colorAttr);
-			return result;
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderCollapseMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderCollapseMeta.java
deleted file mode 100644
index f2cbe1d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderCollapseMeta.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-/**
- * @author mengbo
- */
-public class BorderCollapseMeta extends CSSPropertyMeta {
-	static String[] keywords = new String[] { ICSSPropertyID.VAL_COLLAPSE,
-			ICSSPropertyID.VAL_SEPARATE };
-
-	/**
-	 */
-	public BorderCollapseMeta() {
-		// XXX: the spec says COLLAPSE is initial value, but seemed that IE
-		// is using separate as default
-		super(true, ICSSPropertyID.VAL_SEPARATE);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return keywords;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderColorMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderColorMeta.java
deleted file mode 100644
index d493a71..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderColorMeta.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.color.CSSColorManager;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * @author mengbo
- */
-public class BorderColorMeta extends CSSPropertyMeta {
-
-	private static final String[] _keywords = new String[] { ICSSPropertyID.VAL_TRANSPARENT };
-
-	/**
-	 */
-	public BorderColorMeta() {
-		super(false, ICSSPropertyID.VAL_TRANSPARENT);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.property.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		String text = value.getCssText();
-		Object result = CSSColorManager.getInstance().getColor(text);
-		if (result != null) {
-			return result;
-		}
-        return getInitialValue(propertyName, style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return _keywords;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		Object result;
-		String colorAttr = null;
-		if (IHTMLConstants.TAG_HR.equalsIgnoreCase(htmltag)) {
-			colorAttr = DOMUtil.getAttributeIgnoreCase(element,
-					ICSSPropertyID.ATTR_COLOR);
-		} else if (ICSSPropertyID.ATTR_BACKGROUND_COLOR
-				.equalsIgnoreCase(propertyName)) {
-			colorAttr = DOMUtil.getAttributeIgnoreCase(element,
-					ICSSPropertyID.ATTR_BGCOLOR);
-		}
-		if (colorAttr != null && colorAttr.trim().length() != 0) {
-			colorAttr = colorAttr.trim();
-			result = CSSColorManager.getInstance().getColor(colorAttr);
-			return result;
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderSpacingMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderSpacingMeta.java
deleted file mode 100644
index 22313c3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderSpacingMeta.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.css.CSSValue;
-import org.w3c.dom.css.CSSValueList;
-
-/**
- * The value will always be of type int[2]
- * 
- * @author mengbo
- */
-public class BorderSpacingMeta extends CSSPropertyMeta {
-	private static final int[] INITIAL_SPACING = new int[] { 3, 3 };
-
-	/**
-	 */
-	public BorderSpacingMeta() {
-		// the specification says "border-spacing" is inherited. But seemed
-		// browse is not treating it as inherited. So we treat is as not
-		// inherited.
-		super(false, INITIAL_SPACING);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return EMPTY_KEYWORDS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.style.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		if (value == null || value.getCssValueType() == CSSValue.CSS_CUSTOM) {
-			return INITIAL_SPACING;
-		}
-		if (value.getCssValueType() == CSSValue.CSS_PRIMITIVE_VALUE) {
-			int intvalue = toIntValue(value.getCssText(), style);
-			if (intvalue >= 0) {
-				return new int[] { intvalue, intvalue };
-			}
-            return INITIAL_SPACING;
-		} else if (value.getCssValueType() == CSSValue.CSS_VALUE_LIST) {
-			CSSValueList list = (CSSValueList) value;
-			if (list.getLength() >= 2) {
-				int i1 = toIntValue(list.item(0).getCssText(), style);
-				int i2 = toIntValue(list.item(1).getCssText(), style);
-				if (i1 < 0) {
-					i1 = 0;
-				}
-				if (i2 < 0) {
-					i2 = 0;
-				}
-				return new int[] { i1, i2 };
-			}
-            return INITIAL_SPACING;
-		} else {
-			return INITIAL_SPACING;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		if (IHTMLConstants.TAG_TABLE.equalsIgnoreCase(htmltag)) {
-			String spacing = DOMUtil.getAttributeIgnoreCase(element,
-					IHTMLConstants.ATTR_CELLSPACING);
-			if (spacing != null) {
-				int intvalue = toIntValue(spacing, style);
-				if (intvalue >= 0) {
-					return new int[] { intvalue, intvalue };
-				}
-			}
-		}
-
-		return super.calculateHTMLAttributeOverride(element, htmltag,
-				propertyName, style);
-	}
-
-	/**
-	 * @param valuetext
-	 * @param style
-	 * @return the integer value for value text
-	 */
-	protected int toIntValue(String valuetext, ICSSStyle style) {
-		Object length = LengthMeta.toLength(valuetext, style, PERCENTAGE_NONE,
-				style.getCSSFont());
-		if (length instanceof Length && !((Length) length).isPercentage()) {
-			return ((Length) length).getValue();
-		}
-        return Integer.MIN_VALUE;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderStyleMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderStyleMeta.java
deleted file mode 100644
index bae4612..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderStyleMeta.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class BorderStyleMeta extends CSSPropertyMeta {
-	static final String[] KEYWORDS = new String[] { ICSSPropertyID.VAL_NONE,
-			ICSSPropertyID.VAL_HIDDEN, ICSSPropertyID.VAL_DOTTED,
-			ICSSPropertyID.VAL_DASHED, ICSSPropertyID.VAL_SOLID,
-			ICSSPropertyID.VAL_DOUBLE, ICSSPropertyID.VAL_GROOVE,
-			ICSSPropertyID.VAL_RIDGE, ICSSPropertyID.VAL_INSET,
-			ICSSPropertyID.VAL_OUTSET };
-
-	/**
-	 */
-	public BorderStyleMeta() {
-		super(false, ICSSPropertyID.VAL_NONE);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		if (IHTMLConstants.TAG_TABLE.equalsIgnoreCase(htmltag)) {
-			return calculateTableOverride(element, propertyName);
-		} else if (IHTMLConstants.TAG_TD.equalsIgnoreCase(htmltag)
-				|| IHTMLConstants.TAG_TH.equalsIgnoreCase(htmltag)) {
-			return calculateTDOverride(element, propertyName, style);
-		} else if (IHTMLConstants.TAG_IMG.equalsIgnoreCase(htmltag)) {
-			String border = DOMUtil.getAttributeIgnoreCase(element,
-					IHTMLConstants.ATTR_BORDER);
-			if (border != null) {
-				return ICSSPropertyID.VAL_SOLID;
-			}
-		}
-		return super.calculateHTMLAttributeOverride(element, htmltag,
-				propertyName, style);
-	}
-
-	/**
-	 * @param element
-	 * @param propertyName
-	 * @return
-	 */
-	private Object calculateTDOverride(Element element, String propertyName,
-			ICSSStyle style) {
-		// if element is empty, and "empty-cells" property is hide, then we
-		// don't display border.
-		Object obj = style.getStyleProperty(ICSSPropertyID.ATTR_EMPTY_CELLS);
-		if (EmptyCellsMeta.HIDE.equals(obj) && TableUtil.isEmptyCell(element)) {
-			return ICSSPropertyID.VAL_NONE;
-		}
-
-		// find containing table first
-		Node parent = element;
-		Element tableEle = null;
-		while ((parent = parent.getParentNode()) != null
-				&& parent instanceof Element) {
-			if (((Element) parent).getTagName().equalsIgnoreCase(
-					IHTMLConstants.TAG_TABLE)) {
-				tableEle = (Element) parent;
-				break;
-			}
-
-		}
-		if (tableEle != null) {
-			String rules = DOMUtil.getAttributeIgnoreCase(tableEle,
-					IHTMLConstants.ATTR_RULES);
-			String borderstr = DOMUtil.getAttributeIgnoreCase(tableEle,
-					IHTMLConstants.ATTR_BORDER);
-			if (rules == null || rules.length() == 0) {
-				if (borderstr == null || "0".equals(borderstr.trim())) {
-					return ICSSPropertyID.VAL_NONE;
-				}
-                return ICSSPropertyID.VAL_TDBORDERSTYLE;
-			}
-            // ok, we got a value for rules
-            if (TableUtil.matchRules(extractEdge(propertyName), rules)) {
-            	return ICSSPropertyID.VAL_TDBORDERSTYLE;
-            }
-            return ICSSPropertyID.VAL_NONE;
-		}
-        return null;
-	}
-
-	/**
-	 * @param element
-	 * @param propertyName
-	 * @return
-	 */
-	private Object calculateTableOverride(Element element, String propertyName) {
-		String frame = DOMUtil.getAttributeIgnoreCase(element,
-				IHTMLConstants.ATTR_FRAME);
-		String borderstr = DOMUtil.getAttributeIgnoreCase(element,
-				IHTMLConstants.ATTR_BORDER);
-		// border="0" implies frame="void"
-		if ("0".equals(borderstr)) {
-			return ICSSPropertyID.VAL_NONE;
-		}
-		if (frame == null || frame.length() == 0) {
-			if (borderstr == null) {
-				return ICSSPropertyID.VAL_NONE;
-			} else if (borderstr.trim().length() == 0) {
-				frame = IHTMLConstants.ATTR_BORDER;
-			} else {
-				try {
-					Integer.parseInt(borderstr);
-					frame = IHTMLConstants.ATTR_BORDER;
-				} catch (Exception ex) {
-					frame = borderstr;
-				}
-			}
-		}
-		// ok, we got a value for frame.
-		if (TableUtil.matchFrame(extractEdge(propertyName), frame)) {
-			return ICSSPropertyID.VAL_OUTSET;
-		}
-        return ICSSPropertyID.VAL_NONE;
-	}
-
-	static String extractEdge(String propertyName) {
-		if (ICSSPropertyID.ATTR_BORDER_BOTTOM_STYLE
-				.equalsIgnoreCase(propertyName)) {
-			return "bottom";
-		} else if (ICSSPropertyID.ATTR_BORDER_LEFT_STYLE
-				.equalsIgnoreCase(propertyName)) {
-			return "left";
-		} else if (ICSSPropertyID.ATTR_BORDER_RIGHT_STYLE
-				.equalsIgnoreCase(propertyName)) {
-			return "right";
-		} else {
-			return "top";
-		}
-	}
-
-	/**
-	 * @param propertyName
-	 * @return true if property name is a border style
-	 */
-	public static boolean isBorderStyle(String propertyName) {
-		return ICSSPropertyID.ATTR_BORDER_BOTTOM_STYLE
-				.equalsIgnoreCase(propertyName)
-				|| ICSSPropertyID.ATTR_BORDER_LEFT_STYLE
-						.equalsIgnoreCase(propertyName)
-				|| ICSSPropertyID.ATTR_BORDER_RIGHT_STYLE
-						.equalsIgnoreCase(propertyName)
-				|| ICSSPropertyID.ATTR_BORDER_TOP_STYLE
-						.equalsIgnoreCase(propertyName);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderWidthMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderWidthMeta.java
deleted file mode 100644
index 4a2d68c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/BorderWidthMeta.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * 
- * @author mengbo
- */
-// FIXME: when the border-style is none, how should we treat border-width?
-public class BorderWidthMeta extends LengthMeta {
-
-	private static final Length LENGTH_4 = new Length(4, false);
-
-	static final String[] KEYWORDS = new String[] { ICSSPropertyID.VAL_AUTO,
-			ICSSPropertyID.VAL_THIN, ICSSPropertyID.VAL_MEDIUM,
-			ICSSPropertyID.VAL_THICK };
-
-	/**
-	 */
-	public BorderWidthMeta() {
-		super(false, LENGTH_4); // medium length.
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.LengthMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getPercentageType()
-	 */
-	public int getPercentageType() {
-		return PERCENTAGE_NONE;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.LengthMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.style.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		// Computed value: absolute length; '0' if the border style is 'none' or
-		// 'hidden'
-		Object stylevalue = style.getStyleProperty("border-"
-				+ extractEdge(propertyName) + "-style");
-		if (ICSSPropertyID.VAL_NONE.equals(stylevalue)
-				|| ICSSPropertyID.VAL_HIDDEN.equals(stylevalue)) {
-			return Length.LENGTH_0;
-		}
-
-		Object obj = super.calculateCSSValueResult(value, propertyName, style);
-		if (ICSSPropertyID.VAL_THIN.equals(obj)) {
-			return Length.LENGTH_1;
-		} else if (ICSSPropertyID.VAL_MEDIUM.equals(obj)) {
-			return Length.LENGTH_3;
-		} else if (ICSSPropertyID.VAL_THICK.equals(obj)) {
-			return Length.LENGTH_8;
-		}
-		return obj;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		if ("table".equalsIgnoreCase(htmltag)) {
-			return calculateTableOverride(element, propertyName);
-		} else if ("td".equalsIgnoreCase(htmltag)
-				|| "th".equalsIgnoreCase(htmltag)) {
-			return calculateTDOverride(element, propertyName);
-		} else if ("img".equalsIgnoreCase(htmltag)) {
-			String border = DOMUtil.getAttributeIgnoreCase(element, "border");// ICSSPropertyID.ATTR_BORDERSIZE);
-			if (border != null) {
-				try {
-					return new Length(Integer.parseInt(border), false);
-				} catch (Exception ex) {
-					// Integer processing, no need to report.
-				}
-			}
-		}
-
-		return super.calculateHTMLAttributeOverride(element, htmltag,
-				propertyName, style);
-	}
-
-	/**
-	 * @param element
-	 * @param propertyName
-	 * @return
-	 */
-	private Object calculateTDOverride(Element element, String propertyName) {
-		// find containing table first
-		Node parent = element;
-		Element tableEle = null;
-		while ((parent = parent.getParentNode()) != null
-				&& parent instanceof Element) {
-			if (((Element) parent).getTagName().equalsIgnoreCase("table")) {
-				tableEle = (Element) parent;
-				break;
-			}
-
-		}
-		if (tableEle != null) {
-			String rules = DOMUtil.getAttributeIgnoreCase(tableEle, "rules");
-			String borderstr = DOMUtil.getAttributeIgnoreCase(tableEle,
-					"border");
-			if (rules == null || rules.length() == 0) {
-				if (borderstr == null || "0".equals(borderstr.trim())) {
-					return null;
-				}
-                return Length.LENGTH_1;
-			}
-            // ok, we got a value for rules
-            if (TableUtil.matchRules(extractEdge(propertyName), rules)) {
-            	return Length.LENGTH_1;
-            }
-            return Length.LENGTH_0;
-		}
-        return Length.LENGTH_0;
-	}
-
-	/**
-	 * @param element
-	 * @param propertyName
-	 * @return
-	 */
-	private Object calculateTableOverride(Element element, String propertyName) {
-		String frame = DOMUtil.getAttributeIgnoreCase(element, "frame");
-		String borderstr = DOMUtil.getAttributeIgnoreCase(element, "border");
-		// border="0" implies frame="void"
-		if ("0".equals(borderstr)) {
-			return Length.LENGTH_0;
-		}
-		if (frame == null || frame.length() == 0) {
-			if (borderstr == null) {
-				return null;
-			} else if (borderstr.trim().length() == 0) {
-				return Length.LENGTH_1;
-			} else {
-				try {
-					return new Length(Integer.parseInt(borderstr), false);
-				} catch (Exception ex) {
-					frame = borderstr;
-				}
-			}
-		}
-		// ok, we got a value for frame.
-		if (TableUtil.matchFrame(extractEdge(propertyName), frame)) {
-			if (borderstr != null) {
-				try {
-					return new Length(Integer.parseInt(borderstr), false);
-				} catch (Exception ex) {
-					// ignore. pass through to return length_1
-				}
-			}
-			return Length.LENGTH_1;
-		}
-        return Length.LENGTH_0;
-	}
-
-	static String extractEdge(String propertyName) {
-		if (ICSSPropertyID.ATTR_BORDER_BOTTOM_WIDTH
-				.equalsIgnoreCase(propertyName)) {
-			return "bottom";
-		} else if (ICSSPropertyID.ATTR_BORDER_LEFT_WIDTH
-				.equalsIgnoreCase(propertyName)) {
-			return "left";
-		} else if (ICSSPropertyID.ATTR_BORDER_RIGHT_WIDTH
-				.equalsIgnoreCase(propertyName)) {
-			return "right";
-		} else {
-			return "top";
-		}
-	}
-
-	/**
-	 * @param propertyName
-	 * @return true if property name is a border width
-	 */
-	public static boolean isBorderWidth(String propertyName) {
-		return ICSSPropertyID.ATTR_BORDER_BOTTOM_WIDTH
-				.equalsIgnoreCase(propertyName)
-				|| ICSSPropertyID.ATTR_BORDER_LEFT_WIDTH
-						.equalsIgnoreCase(propertyName)
-				|| ICSSPropertyID.ATTR_BORDER_RIGHT_WIDTH
-						.equalsIgnoreCase(propertyName)
-				|| ICSSPropertyID.ATTR_BORDER_TOP_WIDTH
-						.equalsIgnoreCase(propertyName);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getInitialValue(java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object getInitialValue(String propertyName, ICSSStyle style) {
-		// Computed value: absolute length; '0' if the border style is 'none' or
-		// 'hidden'
-		Object stylevalue = style.getStyleProperty("border-"
-				+ extractEdge(propertyName) + "-style");
-		if (ICSSPropertyID.VAL_NONE.equals(stylevalue)
-				|| ICSSPropertyID.VAL_HIDDEN.equals(stylevalue)) {
-			return Length.LENGTH_0;
-		}
-		return super.getInitialValue(propertyName, style);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/CSSMetaRegistry.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/CSSMetaRegistry.java
deleted file mode 100644
index 670f3dd..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/CSSMetaRegistry.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * @author mengbo
- */
-public class CSSMetaRegistry {
-	Map _map = new HashMap();
-
-	private static CSSMetaRegistry _instance;
-
-	private CSSMetaRegistry() {
-		initialize();
-	}
-
-	/**
-	 * class initiallizer
-	 */
-	private void initialize() {
-		_map.put(ICSSPropertyID.ATTR_DISPLAY, new DisplayMeta());
-		_map.put(ICSSPropertyID.ATTR_TEXTALIGN, new TextAlignMeta());
-		_map.put(ICSSPropertyID.ATTR_HORIZONTAL_ALIGN,
-				new HorizontalAlignMeta());
-		_map.put(ICSSPropertyID.ATTR_TEXTDECORATION, new TextDecorationMeta());
-		_map.put(ICSSPropertyID.ATTR_WHITESPACE, new WhiteSpaceMeta());
-		_map.put(ICSSPropertyID.ATTR_WIDTH, new WidthMeta());
-		_map.put(ICSSPropertyID.ATTR_MIN_WIDTH, new WidthMeta());
-		_map.put(ICSSPropertyID.ATTR_HEIGHT, new HeightMeta());
-		_map.put(ICSSPropertyID.ATTR_MIN_HEIGHT, new HeightMeta());
-
-		_map.put(ICSSPropertyID.ATTR_BORDER_LEFT_WIDTH, new BorderWidthMeta());
-		_map.put(ICSSPropertyID.ATTR_BORDER_RIGHT_WIDTH, new BorderWidthMeta());
-		_map
-				.put(ICSSPropertyID.ATTR_BORDER_BOTTOM_WIDTH,
-						new BorderWidthMeta());
-		_map.put(ICSSPropertyID.ATTR_BORDER_TOP_WIDTH, new BorderWidthMeta());
-
-		_map.put(ICSSPropertyID.ATTR_BORDER_LEFT_STYLE, new BorderStyleMeta());
-		_map.put(ICSSPropertyID.ATTR_BORDER_RIGHT_STYLE, new BorderStyleMeta());
-		_map
-				.put(ICSSPropertyID.ATTR_BORDER_BOTTOM_STYLE,
-						new BorderStyleMeta());
-		_map.put(ICSSPropertyID.ATTR_BORDER_TOP_STYLE, new BorderStyleMeta());
-
-		_map.put(ICSSPropertyID.ATTR_BORDER_LEFT_COLOR, new BorderColorMeta());
-		_map.put(ICSSPropertyID.ATTR_BORDER_RIGHT_COLOR, new BorderColorMeta());
-		_map
-				.put(ICSSPropertyID.ATTR_BORDER_BOTTOM_COLOR,
-						new BorderColorMeta());
-		_map.put(ICSSPropertyID.ATTR_BORDER_TOP_COLOR, new BorderColorMeta());
-
-		_map.put(ICSSPropertyID.ATTR_PADDING_LEFT, new PaddingWidthMeta());
-		_map.put(ICSSPropertyID.ATTR_PADDING_RIGHT, new PaddingWidthMeta());
-		_map.put(ICSSPropertyID.ATTR_PADDING_BOTTOM, new PaddingWidthMeta());
-		_map.put(ICSSPropertyID.ATTR_PADDING_TOP, new PaddingWidthMeta());
-
-		_map.put(ICSSPropertyID.ATTR_MARGIN_LEFT, new MarginWidthMeta());
-		_map.put(ICSSPropertyID.ATTR_MARGIN_RIGHT, new MarginWidthMeta());
-		_map.put(ICSSPropertyID.ATTR_MARGIN_BOTTOM, new MarginWidthMeta());
-		_map.put(ICSSPropertyID.ATTR_MARGIN_TOP, new MarginWidthMeta());
-
-		_map.put(ICSSPropertyID.ATTR_FONT_FAMILY, new FontFamilyMeta());
-		_map.put(ICSSPropertyID.ATTR_FONT_SIZE, new FontSizeMeta());
-		_map.put(ICSSPropertyID.ATTR_FONT_STYLE, new FontStyleMeta());
-		_map.put(ICSSPropertyID.ATTR_FONT_WEIGHT, new FontWeightMeta());
-
-		_map.put(ICSSPropertyID.ATTR_BACKGROUND_COLOR,
-				new BackgroundColorMeta());
-		_map.put(ICSSPropertyID.ATTR_COLOR, new ColorPropertyMeta());
-		_map.put(ICSSPropertyID.ATTR_TEXTCOLOR, new ColorPropertyMeta());
-
-		_map.put(ICSSPropertyID.ATTR_BORDER_COLLAPSE, new BorderCollapseMeta());
-		_map.put(ICSSPropertyID.ATTR_BORDER_SPACING, new BorderSpacingMeta());
-
-		_map.put(ICSSPropertyID.ATTR_LIST_STYLE_TYPE, new ListStyleTypeMeta());
-		_map
-				.put(ICSSPropertyID.ATTR_LIST_STYLE_IMAGE,
-						new ListStyleImageMeta());
-		_map.put(ICSSPropertyID.ATTR_LIST_STYLE_POSITION,
-				new ListStylePositionMeta());
-		_map.put(ICSSPropertyID.ATTR_COUNTER_RESET, new CounterResetMeta());
-		_map.put(ICSSPropertyID.ATTR_COUNTER_INCREMENT,
-				new CounterIncrementMeta());
-
-		_map.put(ICSSPropertyID.ATTR_TOP, new PositionOffsetMeta());
-		_map.put(ICSSPropertyID.ATTR_RIGHT, new PositionOffsetMeta());
-		_map.put(ICSSPropertyID.ATTR_BOTTOM, new PositionOffsetMeta());
-		_map.put(ICSSPropertyID.ATTR_LEFT, new PositionOffsetMeta());
-		_map.put(ICSSPropertyID.ATTR_POSITION, new PositionMeta());
-
-		_map.put(ICSSPropertyID.ATTR_EMPTY_CELLS, new EmptyCellsMeta());
-		_map.put(ICSSPropertyID.ATTR_VISIBILITY, new VisibilityMeta());
-		_map.put(ICSSPropertyID.ATTR_VERTICAL_ALIGN, new VerticalAlignMeta());
-
-		_map.put(ICSSPropertyID.ATTR_OVERFLOW, new OverflowMeta());
-	}
-
-	/**
-	 * @param property
-	 * @return the meta
-	 */
-	public ICSSPropertyMeta getMeta(String property) {
-		return (ICSSPropertyMeta) _map.get(property);
-	}
-
-	/**
-	 * @return the singleton instance
-	 */
-	public static final CSSMetaRegistry getInstance() {
-		if (_instance == null) {
-			_instance = new CSSMetaRegistry();
-		}
-		return _instance;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/CSSPropertyMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/CSSPropertyMeta.java
deleted file mode 100644
index ad426a4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/CSSPropertyMeta.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.w3c.dom.Element;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * @author mengbo
- */
-public abstract class CSSPropertyMeta implements ICSSPropertyMeta {
-	static final String[] EMPTY_KEYWORDS = new String[0];
-
-	boolean _inherited;
-
-	Object _initialValue;
-
-	/**
-	 * @param inherit
-	 * @param initvalue
-	 */
-	public CSSPropertyMeta(boolean inherit, Object initvalue) {
-		this._inherited = inherit;
-		this._initialValue = initvalue;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#isInherited()
-	 */
-	public boolean isInherited() {
-		return _inherited;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#getHTMLElementInitialValue(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String)
-	 */
-	public Object getHTMLElementInitialValue(Element element, String htmltag,
-			String propertyName) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#getInitialValue()
-	 */
-	public Object getInitialValue(String propertyName, ICSSStyle style) {
-		return _initialValue;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#getPercentageType()
-	 */
-	public int getPercentageType() {
-		return PERCENTAGE_NONE;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		// child class should override this method!!!
-		return null;
-	}
-
-	/**
-	 * for many properties, they have a set of keyword property values.
-	 * 
-	 * @return the keyword values
-	 */
-	protected abstract String[] getKeywordValues();
-
-	/**
-	 * @param value
-	 * @return null if is not a keyword.
-	 */
-	protected String checkKeywordValues(String value) {
-		if (value == null)
-			return null;
-		String[] keywords = getKeywordValues();
-		if (keywords != null) {
-			for (int i = 0; i < keywords.length; i++) {
-				if (keywords[i].equalsIgnoreCase(value)) {
-					return keywords[i];
-				}
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.property.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		String s = checkKeywordValues(value.getCssText());
-		if (s != null) {
-			return s;
-		}
-        return this.getInitialValue(propertyName, style);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ColorPropertyMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ColorPropertyMeta.java
deleted file mode 100644
index 8562288..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ColorPropertyMeta.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import java.util.Arrays;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.color.CSSColorManager;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * "color" will be in this type
- * 
- * @author mengbo
- */
-public class ColorPropertyMeta extends CSSPropertyMeta {
-	private static final Object DEFAULT_COLOR = ColorConstants.black;
-
-	private static final String[] KEYWORDS = new String[] {};
-
-	private final static String[] NOTSUPPORT_TAG = { IHTMLConstants.TAG_H1,
-			IHTMLConstants.TAG_H2, IHTMLConstants.TAG_H3,
-			IHTMLConstants.TAG_H4, IHTMLConstants.TAG_H5, IHTMLConstants.TAG_H6 };
-
-	/**
-	 */
-	public ColorPropertyMeta() {
-		super(true, DEFAULT_COLOR);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.property.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-
-		String text = value.getCssText();
-		Object result = CSSColorManager.getInstance().getColor(text);
-		if (result != null) {
-			return result;
-		}
-        return this.getInitialValue(propertyName, style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		if (Arrays.asList(NOTSUPPORT_TAG).contains(htmltag.toLowerCase())) {
-			return null;
-		}
-		Object result;
-		String colorAttr = null;
-		// There are some conditions need to be dealt with hyperlink and text
-		// properties.
-		if (ICSSPropertyID.ATTR_COLOR.equalsIgnoreCase(propertyName)) {
-			colorAttr = DOMUtil.getAttributeIgnoreCase(element,
-					ICSSPropertyID.ATTR_COLOR);
-			if (colorAttr == null
-					&& element.getLocalName().equalsIgnoreCase(
-							IHTMLConstants.TAG_BODY)) {
-				colorAttr = DOMUtil.getAttributeIgnoreCase(element,
-						ICSSPropertyID.ATTR_TEXT);
-			}
-		}
-		if (colorAttr != null) {
-			colorAttr = colorAttr.trim();
-			result = CSSColorManager.getInstance().getColor(colorAttr);
-			return result;
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ContentMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ContentMeta.java
deleted file mode 100644
index 0b190e9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ContentMeta.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-/**
- * @author mengbo
- */
-public class ContentMeta extends CSSPropertyMeta {
-	/**
-	 */
-	public ContentMeta() {
-		// why inherit this??
-		super(false, null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/CounterIncrementMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/CounterIncrementMeta.java
deleted file mode 100644
index 660c822..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/CounterIncrementMeta.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.list.CounterHelper;
-import org.eclipse.jst.pagedesigner.css2.list.IncrementObject;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSNode;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSPrimitiveValue;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * For CounterIncrementMeta, the valid value could be the following: 1. NULL 2.
- * NOT_SPECIFIED 3. a List of IncrementObject.
- * 
- * @author mengbo
- */
-public class CounterIncrementMeta extends CSSPropertyMeta {
-	/**
-	 * 
-	 */
-	public CounterIncrementMeta() {
-		super(false, null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.style.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		return getCounter(value);
-	}
-
-	/**
-	 * @param value
-	 * @return the counter
-	 */
-	public List getCounter(CSSValue value) {
-		if (value == null) {
-			return null;
-		}
-		List result = new ArrayList();
-		IncrementObject incrementObject = null;
-		String identifier = null;
-		Integer increment = null;
-		ICSSNode cssValue = (ICSSNode) value;
-		while (cssValue != null) {
-			// find next idetifier.
-			while (cssValue != null && !CounterHelper.isIdentifier(cssValue)) {
-				cssValue = cssValue.getNextSibling();
-			}
-			if (cssValue == null) {
-				return null;
-			}
-            // identifier:
-            identifier = ((ICSSPrimitiveValue) value).getStringValue();
-            cssValue = cssValue.getNextSibling();
-            // value:
-            if (CounterHelper.isNumber(cssValue)) {
-            	increment = new Integer((int) ((ICSSPrimitiveValue) value)
-            			.getFloatValue(ICSSPrimitiveValue.CSS_INTEGER));
-            }
-
-			if (identifier != null) {
-				incrementObject = new IncrementObject(identifier, increment);
-				result.add(incrementObject);
-			}
-		}
-		return result;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/CounterResetMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/CounterResetMeta.java
deleted file mode 100644
index ac51249..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/CounterResetMeta.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.list.CounterHelper;
-import org.eclipse.jst.pagedesigner.css2.list.ResetObject;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSNode;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSPrimitiveValue;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * @author mengbo
- */
-public class CounterResetMeta extends CSSPropertyMeta {
-	/**
-	 * 
-	 */
-	public CounterResetMeta() {
-		super(false, null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.style.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		return getCounter(value);
-	}
-
-	/**
-	 * @param value
-	 * @return the counter
-	 */
-	public List getCounter(CSSValue value) {
-		if (value == null) {
-			return null;
-		}
-		List result = new ArrayList();
-		ResetObject resetObject = null;
-		String identifier = null;
-		Integer initial = null;
-		ICSSNode cssValue = (ICSSNode) value;
-		while (cssValue != null) {
-			// find next idetifier.
-			while (cssValue != null && !CounterHelper.isIdentifier(cssValue)) {
-				cssValue = cssValue.getNextSibling();
-			}
-			if (cssValue == null) {
-				return null;
-			}
-            // identifier:
-            identifier = ((ICSSPrimitiveValue) value).getStringValue();
-            cssValue = cssValue.getNextSibling();
-            // value:
-            if (CounterHelper.isNumber(cssValue)) {
-            	initial = new Integer((int) ((ICSSPrimitiveValue) value)
-            			.getFloatValue(ICSSPrimitiveValue.CSS_INTEGER));
-            }
-
-			if (identifier != null) {
-				resetObject = new ResetObject(identifier, initial);
-				result.add(resetObject);
-			}
-		}
-		return result;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/DisplayMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/DisplayMeta.java
deleted file mode 100644
index 8997129..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/DisplayMeta.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * @author mengbo
- */
-public class DisplayMeta extends CSSPropertyMeta {
-	static final String[] KEYWORDS = new String[] { ICSSPropertyID.VAL_INLINE,
-			ICSSPropertyID.VAL_BLOCK, ICSSPropertyID.VAL_INLINE_BLOCK,
-			ICSSPropertyID.VAL_LIST_ITEM, ICSSPropertyID.VAL_RUN_IN,
-			ICSSPropertyID.VAL_COMPACT, ICSSPropertyID.VAL_MARKER,
-			ICSSPropertyID.VAL_TABLE, ICSSPropertyID.VAL_INLINE_TABLE,
-			ICSSPropertyID.VAL_TABLE_ROW_GROUP,
-			ICSSPropertyID.VAL_TABLE_HEADER_GROUP,
-			ICSSPropertyID.VAL_TABLE_FOOTER_GROUP,
-			ICSSPropertyID.VAL_TABLE_ROW,
-			ICSSPropertyID.VAL_TABLE_COLUMN_GROUP,
-			ICSSPropertyID.VAL_TABLE_COLUMN, ICSSPropertyID.VAL_TABLE_CELL,
-			ICSSPropertyID.VAL_TABLE_CAPTION, ICSSPropertyID.VAL_NONE };
-
-	/**
-	 */
-	public DisplayMeta() {
-		super(false, ICSSPropertyID.VAL_INLINE);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.property.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		String text = value.getCssText();
-		if (text == null)
-			return ICSSPropertyID.VAL_INLINE;
-		String key = this.checkKeywordValues(text);
-		if (key != null)
-			return key;
-        return ICSSPropertyID.VAL_INLINE;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/EmptyCellsMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/EmptyCellsMeta.java
deleted file mode 100644
index b2d5654..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/EmptyCellsMeta.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class EmptyCellsMeta extends CSSPropertyMeta {
-	private static final String SHOW = "show";
-
-	static final String HIDE = "hide";
-
-	private static final String[] _keywords = new String[] { SHOW, HIDE };
-
-	/**
-	 */
-	public EmptyCellsMeta() {
-		// FIXME: on CSS spec, initial value should be "show".
-		// but seemed IE's default is hide.
-		super(true, HIDE);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return _keywords;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FloatInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FloatInfo.java
deleted file mode 100644
index 6758aa3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FloatInfo.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSPrimitiveValue;
-import org.w3c.dom.css.CSSPrimitiveValue;
-
-/**
- * copied from wtp's internal code.
- * 
- * @author mengbo
- */
-public final class FloatInfo {
-	/**
-	 * @param text 
-	 */
-	public FloatInfo(String text) {
-		parse(text);
-	}
-
-	/**
-	 * 
-	 */
-	void parse(String text) {
-		StringBuffer bufValue = new StringBuffer();
-		StringBuffer bufIdent = new StringBuffer();
-		boolean bNum = true;
-		int len = text.length();
-		for (int i = 0; i < len; i++) {
-			char c = text.charAt(i);
-			if (bNum) {
-				if ('0' <= c && c <= '9' || c == '.' || c == '+' || c == '-') {
-					bufValue.append(c);
-				} else {
-					bufIdent.append(c);
-					bNum = false;
-				}
-			} else {
-				bufIdent.append(c);
-			}
-		}
-		String valueStr = bufValue.toString();
-		_value = Float.valueOf(valueStr).floatValue();
-		_identifier = bufIdent.toString();
-		_type = getFloatValueType(valueStr, _identifier);
-	}
-
-	/**
-	 * @return the value
-	 * 
-	 */
-	public float getValue() {
-		return _value;
-	}
-
-	/**
-	 * 
-	 */
-	String getIdentifier() {
-		return _identifier;
-	}
-
-	/**
-	 * @return the value type
-	 */
-	public short getValueType() {
-		return _type;
-	}
-
-	/**
-	 * 
-	 */
-	static short getFloatValueType(String value, String ident) {
-		ident = ident.toLowerCase();
-		short valueType;
-		if (ident.length() == 0) {
-			if (0 <= value.indexOf('.')) {
-				valueType = CSSPrimitiveValue.CSS_NUMBER;
-			} else {
-				valueType = ICSSPrimitiveValue.CSS_INTEGER;
-			}
-		} else if (ident.equals("%")) {
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_PERCENTAGE;
-		} else if (ident.equalsIgnoreCase("em")) {
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_EMS;
-		} else if (ident.equalsIgnoreCase("ex")) {
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_EXS;
-		} else if (ident.equalsIgnoreCase("px")) {
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_PX;
-		} else if (ident.equalsIgnoreCase("cm")) {
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_CM;
-		} else if (ident.equalsIgnoreCase("mm")) {
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_MM;
-		} else if (ident.equalsIgnoreCase("in")) {
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_IN;
-		} else if (ident.equalsIgnoreCase("pt")) {
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_PT;
-		} else if (ident.equalsIgnoreCase("pc")) {
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_PC;
-		} else if (ident.equalsIgnoreCase("deg")) {
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_DEG;
-		} else if (ident.equalsIgnoreCase("rad")) {
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_RAD;
-		} else if (ident.equalsIgnoreCase("grad")) {
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_GRAD;
-		} else if (ident.equalsIgnoreCase("ms")) {
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_MS;
-		} else if (ident.equalsIgnoreCase("s")) {
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_S;
-		} else if (ident.equalsIgnoreCase("hz")) {
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_HZ;
-		} else if (ident.equalsIgnoreCase("khz")) {
-			//$NON-NLS-1$
-			valueType = CSSPrimitiveValue.CSS_KHZ;
-		} else {
-			valueType = CSSPrimitiveValue.CSS_DIMENSION;
-		}
-		return valueType;
-	}
-
-	private float _value = 0.0f;
-
-	private String _identifier = null;
-
-	private short _type = CSSPrimitiveValue.CSS_UNKNOWN;
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FontFamilyMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FontFamilyMeta.java
deleted file mode 100644
index c54b41d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FontFamilyMeta.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.StringTokenizer;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.widgets.Display;
-import org.w3c.dom.Element;
-import org.w3c.dom.css.CSSValue;
-import org.w3c.dom.css.CSSValueList;
-
-/**
- * @author mengbo
- */
-public class FontFamilyMeta extends CSSPropertyMeta {
-	/**
-	 * the default font name
-	 */
-	public static final String DEFAULT_FONT = "Times New Roman";
-
-	private static FontData[] _FontData;
-
-	private static FontData[] getFontData() {
-		if (_FontData == null) {
-			ArrayList list = new ArrayList();
-			list.addAll(Arrays.asList(Display.getCurrent().getFontList(null,
-					false)));
-			list.addAll(Arrays.asList(Display.getCurrent().getFontList(null,
-					true)));
-			_FontData = (FontData[]) list.toArray(new FontData[list.size()]);
-		}
-		return _FontData;
-	}
-
-	/**
-	 */
-	public FontFamilyMeta() {
-		super(true, DEFAULT_FONT);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.style.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		if (value.getCssValueType() == CSSValue.CSS_VALUE_LIST) {
-			CSSValueList valueList = (CSSValueList) value;
-			for (int i = 0, count = valueList.getLength(); i < count; i++) {
-				String name = valueList.item(i).getCssText();
-				name = trimPadding(name);
-				if (isSupportedFont(name)) {
-					return name;
-				}
-			}
-		}
-		return trimPadding(value.getCssText());
-	}
-
-	private String trimPadding(String name) {
-		String value = name;
-		if (value != null) {
-			value = value.replaceAll("\"", "");
-			value = value.replaceAll("'", "");
-		}
-		return value;
-	}
-
-	private boolean isSupportedFont(String name) {
-		FontData[] fontData = getFontData();
-		for (int i = 0; i < fontData.length; i++) {
-			if (fontData[i].getName().equalsIgnoreCase(name)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		if ("FONT".equalsIgnoreCase(htmltag)
-				|| "BASEFONT".equalsIgnoreCase(htmltag)) {
-			String face = DOMUtil.getAttributeIgnoreCase(element, "face");
-			if (face != null) {
-				String[] names = getFontNameList(face);
-				for (int i = 0; i < names.length; i++) {
-					if (isSupportedFont(names[i])) {
-						return names[i];
-					}
-				}
-			} else {
-				return null;
-			}
-		}
-		return null;
-	}
-
-	private String[] getFontNameList(String face) {
-		StringTokenizer tokenizer = new StringTokenizer(face, ",");
-		String[] names = new String[tokenizer.countTokens()];
-		for (int i = 0; i < names.length; i++) {
-			names[i] = trimPadding(tokenizer.nextToken());
-		}
-		return names;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FontSizeMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FontSizeMeta.java
deleted file mode 100644
index 498e52a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FontSizeMeta.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.font.ICSSFont;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * The result value should be Length object only.
- * 
- * @author mengbo
- */
-// XXX: in the future, we may add "unit" into Length, the one unit will be
-// "MEDIUM"
-// and specific for font. Means the relative size to MEDIUM. Then it is possible
-// for
-// the caller to decide the actual font size based on the style specific MEDIUM
-// size.
-public class FontSizeMeta extends LengthMeta {
-	private static final String[] KEYWORDS = { ICSSPropertyID.VAL_XX_SMALL,
-			ICSSPropertyID.VAL_X_SMALL, ICSSPropertyID.VAL_SMALL,
-			ICSSPropertyID.VAL_MEDIUM, ICSSPropertyID.VAL_LARGE,
-			ICSSPropertyID.VAL_X_LARGE, ICSSPropertyID.VAL_XX_LARGE,
-			ICSSPropertyID.VAL_LARGER, ICSSPropertyID.VAL_SMALLER };
-
-	/**
-	 * font size
-	 */
-	public static final double MEDIUM_VAL_INT = 16;
-
-	private static final double SCALING_FACTOR = 1.2;
-
-	private static final double FACTORS[] = { 0.6, 0.89, 1, 1.2, 1.5, 2.0, 3.0 };
-
-	// The scaling factors in IE is different from CSS definition. Here we
-	// follow IE.
-	private static final double CSS_ABSOLUTE_FACTORS[] = { 0.63, 0.82, 1, 1.12,
-			1.5, 2.0, 3.0 };
-
-	private static final int MIN_SIZE_FOR_SMALLER = 1;
-
-	private static final int MIN_SIZE_FOR_LARGER = 9;
-
-	/**
-	 * Default constructor
-	 */
-	public FontSizeMeta() {
-		super(true, new Length((int) MEDIUM_VAL_INT, false));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.LengthMeta#getBaseFont(org.eclipse.jst.pagedesigner.css2.property.AbstractStyle)
-	 */
-	protected ICSSFont getBaseFont(ICSSStyle style) {
-		return style.getParentStyle().getCSSFont();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getPercentageType()
-	 */
-	public int getPercentageType() {
-		return PERCENTAGE_FONT;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.LengthMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.style.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		Object obj = super.calculateCSSValueResult(value, propertyName, style);
-		if (obj instanceof Length) {
-			return obj;
-		}
-		// otherwise, it is keyword.
-		return convertKeyword(obj, style);
-	}
-
-	/**
-	 * @param fontsizeobj
-	 * @param style
-	 * @return the length
-	 */
-	protected Length convertKeyword(Object fontsizeobj, ICSSStyle style) {
-		int fontsize;
-		int parentfontsize = style.getParentStyle().getCSSFont().getFontSize();
-		if (fontsizeobj instanceof Length) {
-			fontsize = ((Length) fontsizeobj).getValue();
-		} else if (ICSSPropertyID.VAL_XX_SMALL.equals(fontsizeobj)) {
-			fontsize = (int) (MEDIUM_VAL_INT * CSS_ABSOLUTE_FACTORS[0]);
-		} else if (ICSSPropertyID.VAL_X_SMALL.equals(fontsizeobj)) {
-			fontsize = (int) (MEDIUM_VAL_INT * CSS_ABSOLUTE_FACTORS[1]);
-		} else if (ICSSPropertyID.VAL_SMALL.equals(fontsizeobj)) {
-			fontsize = (int) (MEDIUM_VAL_INT * CSS_ABSOLUTE_FACTORS[2]);
-		} else if (ICSSPropertyID.VAL_MEDIUM.equals(fontsizeobj)) {
-			fontsize = (int) Math.round(MEDIUM_VAL_INT
-					* CSS_ABSOLUTE_FACTORS[3]);
-		} else if (ICSSPropertyID.VAL_LARGE.equals(fontsizeobj)) {
-			fontsize = (int) (MEDIUM_VAL_INT * CSS_ABSOLUTE_FACTORS[4]);
-		} else if (ICSSPropertyID.VAL_X_LARGE.equals(fontsizeobj)) {
-			fontsize = (int) (MEDIUM_VAL_INT * CSS_ABSOLUTE_FACTORS[5]);
-		} else if (ICSSPropertyID.VAL_XX_LARGE.equals(fontsizeobj)) {
-			fontsize = (int) (MEDIUM_VAL_INT * CSS_ABSOLUTE_FACTORS[6]);
-		} else if (ICSSPropertyID.VAL_SMALLER.equals(fontsizeobj)) {
-			fontsize = (int) (parentfontsize / SCALING_FACTOR);
-			if (fontsize < MIN_SIZE_FOR_SMALLER) {
-				fontsize = MIN_SIZE_FOR_SMALLER;
-			}
-		} else if (ICSSPropertyID.VAL_LARGER.equals(fontsizeobj)) {
-			fontsize = (int) (parentfontsize * SCALING_FACTOR);
-			if (fontsize < MIN_SIZE_FOR_LARGER) {
-				fontsize = MIN_SIZE_FOR_LARGER;
-			}
-		} else {
-			fontsize = parentfontsize;
-		}
-
-		return new Length(fontsize, false);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		if (IHTMLConstants.TAG_FONT.equalsIgnoreCase(htmltag)
-				|| ICSSPropertyID.ATTR_BASEFONT.equalsIgnoreCase(htmltag)) {
-			String size = DOMUtil.getAttributeIgnoreCase(element,
-					ICSSPropertyID.ATTR_SIZE);
-			if (size != null) {
-				size = size.trim();
-				try {
-					int fontSize = 0;
-					if (size.startsWith("+")) //$NON-NLS-1$
-					{
-						fontSize = Integer.parseInt(size.substring(1)) + 3;
-					} else if (size.startsWith("-")) //$NON-NLS-1$
-					{
-						fontSize = 3 - Integer.parseInt(size.substring(1));
-					} else {
-						fontSize = Integer.parseInt(size);
-					}
-					if (fontSize < 1) {
-						fontSize = 1;
-					}
-					if (fontSize > 7) {
-						fontSize = 7;
-					}
-					return new Length((int) (Math.round(FACTORS[fontSize - 1]
-							* MEDIUM_VAL_INT)), false);
-				} catch (Exception ex) {
-					// Error in tag font attr calculating.
-					// _log.error("Error.FontSizeMeta.0", ex); //$NON-NLS-1$
-					return null;
-				}
-			}
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FontStyleMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FontStyleMeta.java
deleted file mode 100644
index 7d46ab2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FontStyleMeta.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-/**
- * @author mengbo
- */
-public class FontStyleMeta extends CSSPropertyMeta {
-	static final String[] KEYWORDS = new String[] { ICSSPropertyID.VAL_NORMAL,
-			ICSSPropertyID.VAL_ITALIC, ICSSPropertyID.VAL_OBLIQUE };
-
-	/**
-	 * Default constructor
-	 */
-	public FontStyleMeta() {
-		super(true, ICSSPropertyID.VAL_NORMAL);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FontWeightMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FontWeightMeta.java
deleted file mode 100644
index 3b333e9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/FontWeightMeta.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * The result value will always be integer, range 100-900 This class has already
- * translate things like "normal", "bold", "bolder", "lighter" into integer
- * value.
- * 
- * @author mengbo
- */
-public class FontWeightMeta extends CSSPropertyMeta {
-
-	/**
-	 * normal weight value
-	 */
-	public static final Integer NORMAL_WEIGHT = new Integer(400);
-
-	private static final Integer BOLD_WEIGHT = new Integer(700);
-
-	private static final String[] KEYWORDS = new String[] { ICSSPropertyID.VAL_NORMAL,
-			ICSSPropertyID.VAL_BOLD, ICSSPropertyID.VAL_BOLDER,
-			ICSSPropertyID.VAL_LIGHTER };
-
-
-	/**
-	 * Default constructor
-	 */
-	public FontWeightMeta() {
-		super(true, NORMAL_WEIGHT);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.style.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		String text = value.getCssText();
-		String result = checkKeywordValues(text);
-		if (result == null) {
-			try {
-				int i = Integer.parseInt(text);
-				if (i < 100) {
-					i = 100;
-				}
-				if (i > 900) {
-					i = 900;
-				}
-				return new Integer(i);
-			} catch (Exception ex) {
-				// Error in integer processing
-				return NORMAL_WEIGHT;
-			}
-		} else if (ICSSPropertyID.VAL_NORMAL.equals(result)) {
-			return NORMAL_WEIGHT;
-		} else if (ICSSPropertyID.VAL_BOLD.equals(result)) {
-			return BOLD_WEIGHT;
-		} else if (ICSSPropertyID.VAL_BOLDER.equals(result)) {
-			// int i = style.getParentStyle().getCSSFont().getWeight() + 100;
-			// if (i < 100)
-			// i = 100;
-			// if (i > 900)
-			// i = 900;
-			// return new Integer(i);
-			return BOLD_WEIGHT;
-		} else if (ICSSPropertyID.VAL_LIGHTER.equals(result)) {
-			int i = style.getParentStyle().getCSSFont().getWeight() - 100;
-			if (i < 100) {
-				i = 100;
-			}
-			if (i > 900) {
-				i = 900;
-			}
-			return new Integer(i);
-		}
-		return NORMAL_WEIGHT;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/HeightMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/HeightMeta.java
deleted file mode 100644
index 13860d3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/HeightMeta.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class HeightMeta extends LengthMeta {
-	/**
-	 * Default constructor
-	 */
-	public HeightMeta() {
-		super(false, ICSSPropertyID.VAL_AUTO);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		if (!"input".equalsIgnoreCase(htmltag)) //$NON-NLS-1$
-		{
-			String attributeName = ICSSPropertyID.ATTR_HEIGHT;
-			if ("hr".equalsIgnoreCase(htmltag)) {
-				attributeName = ICSSPropertyID.ATTR_SIZE;
-			}
-
-			String height = DOMUtil.getAttributeIgnoreCase(element,
-					attributeName);
-			if (height != null) {
-				return LengthMeta.toLength(height, style, this
-						.getPercentageType(), getBaseFont(style));
-			}
-		}
-		return super.calculateHTMLAttributeOverride(element, htmltag,
-				propertyName, style);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/HorizontalAlignMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/HorizontalAlignMeta.java
deleted file mode 100644
index 6dd075c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/HorizontalAlignMeta.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import java.util.Arrays;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class HorizontalAlignMeta extends CSSPropertyMeta {
-	static final String[] KEYWORDS = new String[] { ICSSPropertyID.VAL_LEFT,
-			"bottom", "top", //$NON-NLS-1$ //$NON-NLS-2$
-			ICSSPropertyID.VAL_RIGHT, ICSSPropertyID.VAL_CENTER,
-			ICSSPropertyID.VAL_JUSTIFY };
-
-	private static final String[] HOR_SLIGN_HTMLTAGS = new String[] {
-			"TABLE", "HR", "LEGEND", "APPLET", "IFRAME", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
-			"IMG", "INPUT", "OBJECT", "CAPTION" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-	};
-
-	/**
-	 * default constructor
-	 */
-	public HorizontalAlignMeta() {
-		super(true, NOT_SPECIFIED);
-	}
-
-	/**
-	 * @param inherit
-	 * @param initvalue
-	 */
-	public HorizontalAlignMeta(boolean inherit, Object initvalue) {
-		super(inherit, initvalue);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-
-		if (Arrays.asList(HOR_SLIGN_HTMLTAGS).contains(htmltag.toUpperCase())) {
-			String align = DOMUtil.getAttributeIgnoreCase(element, "align"); //$NON-NLS-1$
-			return checkKeywordValues(align);
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#getHTMLElementInitialValue(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String)
-	 */
-	public Object getHTMLElementInitialValue(Element element, String htmltag,
-			String propertyName) {
-		if ("HR".equalsIgnoreCase(htmltag.toUpperCase())) //$NON-NLS-1$
-		{
-			return ICSSPropertyID.VAL_CENTER;
-		} else if (Arrays.asList(HOR_SLIGN_HTMLTAGS).contains(
-				htmltag.toUpperCase())) {
-			return ICSSPropertyID.VAL_LEFT;
-		}
-
-		return super.getHTMLElementInitialValue(element, htmltag, propertyName);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ICSSPropertyID.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ICSSPropertyID.java
deleted file mode 100644
index efce31d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ICSSPropertyID.java
+++ /dev/null
@@ -1,922 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-/**
- * @author mengbo
- */
-public interface ICSSPropertyID {
-	/**
-	 * display attribute name
-	 */
-	public static final String ATTR_DISPLAY = "display";
-
-	/**
-	 * whitespace attribute name
-	 */
-	public static final String ATTR_WHITESPACE = "white-space";
-
-	/**
-	 * text decoration attribute name
-	 */
-	public static final String ATTR_TEXTDECORATION = "text-decoration";
-
-	/**
-	 * text align attribute name
-	 */
-	public static final String ATTR_TEXTALIGN = "text-align";
-
-	/**
-	 * width attribute name
-	 */
-	public static final String ATTR_WIDTH = "width";
-
-	/**
-	 * min-width attribute name
-	 */
-	public static final String ATTR_MIN_WIDTH = "min-width";
-
-	/**
-	 * height attribute name
-	 */
-	public static final String ATTR_HEIGHT = "height";
-
-	/**
-	 * min height attribute name
-	 */
-	public static final String ATTR_MIN_HEIGHT = "min-height";
-
-	/**
-	 * border-left-width attribute name
-	 */
-	public static final String ATTR_BORDER_LEFT_WIDTH = "border-left-width";
-
-	/**
-	 * border-right-width attribute name
-	 */
-	public static final String ATTR_BORDER_RIGHT_WIDTH = "border-right-width";
-
-	/**
-	 * border bottom width
-	 */
-	public static final String ATTR_BORDER_BOTTOM_WIDTH = "border-bottom-width";
-
-	/**
-	 * css style attribute
-	 */
-	public static final String ATTR_BORDER_TOP_WIDTH = "border-top-width";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_FONT_FAMILY = "font-family";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_FONT_SIZE = "font-size";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_FONT_STYLE = "font-style";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_FONT_WEIGHT = "font-weight";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BORDER_LEFT_STYLE = "border-left-style";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BORDER_RIGHT_STYLE = "border-right-style";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BORDER_BOTTOM_STYLE = "border-bottom-style";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BORDER_TOP_STYLE = "border-top-style";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BORDER_LEFT_COLOR = "border-left-color";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BORDER_RIGHT_COLOR = "border-right-color";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BORDER_BOTTOM_COLOR = "border-bottom-color";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BORDER_TOP_COLOR = "border-top-color";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_PADDING_RIGHT = "padding-right";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_PADDING_BOTTOM = "padding-bottom";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_PADDING_LEFT = "padding-left";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_PADDING_TOP = "padding-top";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_MARGIN_RIGHT = "margin-right";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_MARGIN_BOTTOM = "margin-bottom";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_MARGIN_LEFT = "margin-left";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_MARGIN_TOP = "margin-top";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BACKGROUND_COLOR = "background-color";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_COLOR = "color";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_TEXTCOLOR = "text";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BORDER_COLLAPSE = "border-collapse";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BORDER_SPACING = "border-spacing";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_LIST_STYLE_TYPE = "list-style-type";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_LIST_STYLE_POSITION = "list-style-position";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_LIST_STYLE_IMAGE = "list-style-image";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_COUNTER_RESET = "counter-reset";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_COUNTER_INCREMENT = "counter-increment";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_EMPTY_CELLS = "empty-cells";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_VISIBILITY = "visibility";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_VERTICAL_ALIGN = "vertical-align";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_HORIZONTAL_ALIGN = "horizontal-align";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_CONTENT = "content";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BGCOLOR = "bgcolor";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_TEXT = "text";
-
-    /**
-     * css style attribute
-     */
-	public final static String ATTR_MULTIPLE = "multiple";
-
-    /**
-     * css style attribute
-     */
-	public final static String ATTR_ITEMLABEL = "itemLabel";
-
-    /**
-     * css style attribute
-     */
-	public final static String ATTR_BINDING = "binding";
-
-    /**
-     * css style attribute
-     */
-	public final static String ATTR_ITEMVALUE = "itemValue";
-
-    /**
-     * css style attribute
-     */
-	public final static String ATTR_VALUE = "value";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_URI = "uri";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_PREFIX = "prefix";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_STYLECLASS = "styleClass";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_SIZE = "size";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BASEFONT = "basefont";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_ROWSPAN = "rowSpan";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_COLSPAN = "colSpan";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_TYPE = "type";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_URL = "url";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_SRC = "src";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_TAGLIB_LOCATION = "taglib-location";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_TAGLIB_URI = "taglib-uri";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_IMAGE = "image";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_RESET = "reset";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_FOOTER = "footer";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_HEADER = "header";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_COLUMNS = "columns";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_COLUMNCLASSES = "columnClasses";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_CLASS = "class";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_STYLE = "style";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_PAGE = "page";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_HREF = "href";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_NAME = "name";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BASENAME = "basename";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_ACTION = "action";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_TARGET = "target";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_TOP = "top";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_BOTTOM = "bottom";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_LEFT = "left";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_RIGHT = "right";
-
-    /**
-     * css style attribute
-     */
-	public static final String ATTR_POSITION = "position";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_TRANSPARENT = "transparent";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_COLLAPSE = "collapse";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_SEPARATE = "separate";
-
-    /**
-     * css style value
-     */
-	public static final String ATTR_OVERFLOW = "overflow";
-
-    /**
-     * css style value
-     */
-	// border style values
-	public static final String VAL_HIDDEN = "hidden";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_DOTTED = "dotted";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_DASHED = "dashed";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_SOLID = "solid";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_DOUBLE = "double";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_GROOVE = "groove";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_RIDGE = "ridge";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_INSET = "inset";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_OUTSET = "outset";
-
-	// XXX: we introduce a new style for TD default border style, since it
-	// seemed IE
-	// is using none of the above style for td.
-    /**
-     * css style value
-     */
-	public static final String VAL_TDBORDERSTYLE = "__td_border_style__";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_THIN = "thin";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_THICK = "thick";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_INLINE = "inline";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_BLOCK = "block";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_INLINE_BLOCK = "inline-block";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_LIST_ITEM = "list-item";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_RUN_IN = "run-in";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_COMPACT = "compact";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_MARKER = "marker";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_TABLE = "table";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_INLINE_TABLE = "inline-table";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_TABLE_ROW_GROUP = "table-row-group";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_TABLE_HEADER_GROUP = "table-header-group";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_TABLE_FOOTER_GROUP = "table-footer-group";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_TABLE_ROW = "table-row";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_TABLE_COLUMN_GROUP = "table-column-group";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_TABLE_COLUMN = "table-column";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_TABLE_CELL = "table-cell";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_TABLE_CAPTION = "table-caption";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_NONE = "none";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_XX_SMALL = "xx-small";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_X_SMALL = "x-small";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_SMALL = "small";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_MEDIUM = "medium";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_LARGE = "large";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_X_LARGE = "x-large";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_XX_LARGE = "xx-large";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_LARGER = "larger";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_SMALLER = "smaller";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_ITALIC = "italic";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_OBLIQUE = "oblique";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_NORMAL = "normal";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_BOLD = "bold";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_BOLDER = "bolder";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_LIGHTER = "lighter";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_AUTO = "auto";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_OUTSIDE = "outside";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_INSIDE = "inside";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_LEFT = "left";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_RIGHT = "right";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_CENTER = "center";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_JUSTIFY = "justify";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_UNDERLINE = "underline";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_OVERLINE = "overline";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_LINETHROUGH = "line-through";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_BLINK = "blink";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_PRE = "pre";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_NOWRAP = "nowrap";
-
-    /**
-     * css style value
-     */
-	public final static String VAL_DISC = "disc"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_CIRCLE = "circle"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_DECIMAL = "decimal"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_CJK_IDEOGRAPHIC = "cjk-ideographic"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_DECIMAL_LEADING_ZERO = "decimal-leading-zero"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_ARMENIAN = "armenian"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_LOWER_ALPHA = "lower-alpha"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_LOWER_GREEK = "lower-greek"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_LOWER_LATIN = "lower-latin"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_LOWER_ROMAN = "lower-roman"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_UPPER_ALPHA = "upper-alpha"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_UPPER_LATIN = "upper-latin"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_UPPER_ROMAN = "upper-roman"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_HIRAGANA = "hiragana"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_HIRAGANA_IROHA = "hiragana-iroha"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_HEBREW = "hebrew"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_GEORGIAN = "georgian"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_KATAKANA = "katakana"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_KATAKANA_IROHA = "katakana-iroha"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_SQUARE = "square"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public final static String VAL_IMAGE = "image"; //$NON-NLS-1$
-
-    /**
-     * css style value
-     */
-	public static final String VAL_MULTIPLE = "multiple";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_BUTTON = "button";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_CHECKBOX = "checkbox";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_RADIO = "radio";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_FILE = "file";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_RESET = "reset";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_SUBMIT = "submit";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_PASSWORD = "password";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_TEXT = "text";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_VISIBLE = "visible";
-
-    /**
-     * css style value
-     */
-	public static final String VAL_SCROLL = "scroll";
-
-    /**
-     * css style value
-     */
-	public static final String TAG_TAGLIB = "taglib";
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ICSSPropertyMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ICSSPropertyMeta.java
deleted file mode 100644
index 74ae04f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ICSSPropertyMeta.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.w3c.dom.Element;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * @author mengbo
- */
-public interface ICSSPropertyMeta {
-	/**
-	 * 
-	 */
-	static final int PERCENTAGE_NONE = 0;
-
-	/**
-	 * 
-	 */
-	static final int PERCENTAGE_BOXSIZE = 1;
-
-	/**
-	 * 
-	 */
-	static final int PERCENTAGE_HEIGHT_CONTAININGBLOCK = 2;
-
-	/**
-	 * 
-	 */
-	static final int PERCENTAGE_FONT = 3;
-
-	/**
-	 * 
-	 */
-	static final int PERCENTAGE_WIDTH_CONTAININGBLOCK = 4;
-
-	/**
-	 * 
-	 */
-	static final Object NOT_SPECIFIED = "NOT_SPECIFIED";
-
-	/**
-	 * whether default inherit.
-	 * 
-	 * @return true if is inherited
-	 */
-	public boolean isInherited();
-
-	/**
-	 * @param propertyName 
-	 * @param style 
-	 * 
-	 * @return the initial value object
-	 */
-	public Object getInitialValue(String propertyName, ICSSStyle style);
-
-	/**
-	 * @param element
-	 * @param htmltag
-	 * @param propertyName
-	 * @return the initial value object
-	 */
-	public Object getHTMLElementInitialValue(Element element, String htmltag,
-			String propertyName);
-
-	/**
-	 * what's percentage value based on.
-	 * 
-	 * @return the percentage value
-	 */
-	public int getPercentageType();
-
-	/**
-	 * for many CSS property, there is corresponding HTML attribute can also
-	 * specify value for them. This method should check whether the element has
-	 * corresponding HTML attribute provide value.
-	 * 
-	 * @param element
-	 *            the element
-	 * @param htmltag
-	 *            the html tag name. This is for in case element is jsp/jsf
-	 *            element, and have non html tag name.
-	 * @param propertyName
-	 *            the property name.
-	 * @param style
-	 *            the style
-	 * @return null if no attribute override.
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style);
-
-	/**
-	 * @param value
-	 * @param propertyName
-	 * @param style
-	 * @return the value result
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/LengthMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/LengthMeta.java
deleted file mode 100644
index ec9f9e5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/LengthMeta.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.font.ICSSFont;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-import org.eclipse.swt.widgets.Display;
-import org.w3c.dom.DOMException;
-import org.w3c.dom.css.CSSPrimitiveValue;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * @author mengbo
- */
-public class LengthMeta extends CSSPropertyMeta {
-	private static final String[] KEYWORDS = new String[] { ICSSPropertyID.VAL_AUTO };
-
-	/**
-	 * @param inherit
-	 * @param initvalue
-	 */
-	public LengthMeta(boolean inherit, Object initvalue) {
-		super(inherit, initvalue);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.property.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		if (value == null || value.getCssValueType() == CSSValue.CSS_VALUE_LIST
-				|| value.getCssValueType() == CSSValue.CSS_CUSTOM) {
-			return ICSSPropertyID.VAL_AUTO;
-		}
-		if (value.getCssValueType() == CSSValue.CSS_INHERIT) {
-			return ICSSPropertyID.VAL_AUTO;
-		}
-		CSSPrimitiveValue primitive = (CSSPrimitiveValue) value;
-		String key = checkKeywordValues(primitive.getCssText());
-		if (key != null) {
-			return key;
-		}
-		short unitType = primitive.getPrimitiveType();
-		float fvalue;
-		try {
-			fvalue = primitive.getFloatValue(unitType);
-		} catch (DOMException ex) {
-// Hide this info.   Consider adding DEBUG option			
-//			_log.info("Get length failed, use auto value instead ("
-//					+ value.getCssText() + ")");
-			return ICSSPropertyID.VAL_AUTO;
-		}
-		return toLength(fvalue, unitType, style, this.getPercentageType(),
-				getBaseFont(style));
-	}
-
-	/**
-	 * @param lengthStr
-	 * @param style
-	 * @param percenttype
-	 * @param font
-	 * @return the object
-	 */
-	public static Object toLength(String lengthStr, ICSSStyle style,
-			int percenttype, ICSSFont font) {
-		try {
-			FloatInfo floatinfo = new FloatInfo(lengthStr);
-			return toLength(floatinfo.getValue(), floatinfo.getValueType(),
-					style, percenttype, font);
-		} catch (Exception e) {
-			return ICSSPropertyID.VAL_AUTO;
-		}
-	}
-
-	/**
-	 * Will not calculate percentage value. Used for calculate the "width" and
-	 * "height" css property
-	 * @param result 
-	 * @param unitType 
-	 * @param style 
-	 * @param percenttype 
-	 * @param font
-	 * @return an object?
-	 */
-	public static Object toLength(float result, short unitType,
-			ICSSStyle style, int percenttype, ICSSFont font) {
-		switch (unitType) {
-		case CSSPrimitiveValue.CSS_PERCENTAGE:
-			if (percenttype == PERCENTAGE_FONT) {
-				result = (int) ((result * font.getFontSize()) / 100.0);
-				break;
-			}
-			return new Length((int) result, true);
-		case CSSPrimitiveValue.CSS_PX: // no more calculation needed
-		case CSSPrimitiveValue.CSS_NUMBER:
-			break;
-		case CSSPrimitiveValue.CSS_EMS:
-			result *= font.getFontSize();
-			break;
-		case CSSPrimitiveValue.CSS_EXS:
-			result *= font.getXHeight();
-			break;
-		case CSSPrimitiveValue.CSS_CM:
-			result = cmToPixel(result);
-			break;
-		case CSSPrimitiveValue.CSS_IN:
-			result = inToPixel(result);
-			break;
-		case CSSPrimitiveValue.CSS_MM:
-			result = mmToPixel(result);
-			break;
-		case CSSPrimitiveValue.CSS_PT:
-			result = ptToPixel(result);
-			break;
-		case CSSPrimitiveValue.CSS_PC:
-			result = pcToPixel(result);
-			break;
-		case CSSPrimitiveValue.CSS_STRING:
-			return ICSSPropertyID.VAL_AUTO;
-			// FIXME:every thing is delt with?
-		}
-		// ok, when reach here, means we get the float value "result"
-		return new Length((int) result, false);
-	}
-
-	/**
-	 * child class can override this method. e.g: font-size style's base font is
-	 * parent style's font.
-	 * 
-	 * @param style
-	 * @return the base font
-	 */
-	protected ICSSFont getBaseFont(ICSSStyle style) {
-		return style.getCSSFont();
-	}
-
-	private static float pcToPixel(float value) {
-		return ptToPixel(12 * value);
-	}
-
-	/**
-	 * @param floatValue
-	 * @return
-	 */
-	private static float ptToPixel(float floatValue) {
-		// the points used by CSS 2.1 are equal to 1/72th of an inch.
-		return inToPixel(floatValue / 72);
-	}
-
-	/**
-	 * @param floatValue
-	 * @return
-	 */
-	private static float mmToPixel(float floatValue) {
-		return cmToPixel(floatValue / 10);
-	}
-
-	/**
-	 * @param floatValue
-	 * @return
-	 */
-	private static float inToPixel(float floatValue) {
-		return getDPI() * floatValue;
-	}
-
-	/**
-	 * @param floatValue
-	 * @return
-	 */
-	private static float cmToPixel(float floatValue) {
-		// 1 inch is equal to 2.54 centimeters
-		return inToPixel((float) (floatValue / 2.54));
-	}
-
-	/**
-	 * @return
-	 */
-	private static float getDPI() {
-		// XXX: cache the value?
-		return Display.getCurrent().getDPI().x;
-	}
-
-	/**
-	 * @param result
-	 * @return true if is auto
-	 */
-	public static boolean isAuto(Object result) {
-		if (result == ICSSPropertyID.VAL_AUTO) {
-			return true;
-		}
-		if (result instanceof Length && ((Length) result).getValue() <= 0) {
-			return true;
-		}
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ListStyleImageMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ListStyleImageMeta.java
deleted file mode 100644
index c275340..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ListStyleImageMeta.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class ListStyleImageMeta extends CSSPropertyMeta {
-	private static final String INITIAL_VALUE = ICSSPropertyID.VAL_NONE;
-
-	/**
-	 * Default constructor
-	 */
-	public ListStyleImageMeta() {
-		super(true, INITIAL_VALUE);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		return DOMUtil.getAttributeIgnoreCase(element,
-				ICSSPropertyID.ATTR_LIST_STYLE_IMAGE);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ListStylePositionMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ListStylePositionMeta.java
deleted file mode 100644
index 355a173..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ListStylePositionMeta.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-/**
- * @author mengbo
- */
-public class ListStylePositionMeta extends CSSPropertyMeta {
-	private static final String INITIAL_VALUE = ICSSPropertyID.VAL_OUTSIDE;
-
-	/**
-	 * Default constructor
-	 */
-	public ListStylePositionMeta() {
-		super(true, INITIAL_VALUE);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ListStyleTypeMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ListStyleTypeMeta.java
deleted file mode 100644
index 78ee887..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/ListStyleTypeMeta.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * @author mengbo
- */
-public class ListStyleTypeMeta extends CSSPropertyMeta {
-	private static final String INITIAL_VALUE = ICSSPropertyID.VAL_DISC;
-
-	/**
-	 * Default constructor
-	 */
-	public ListStyleTypeMeta() {
-		super(true, INITIAL_VALUE);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.style.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		return value.getCssText();
-	}
-
-	// /*
-	// * (non-Javadoc)
-	// *
-	// * @see
-	// org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	// java.lang.String, java.lang.String,
-	// org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	// */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		String listStyle = DOMUtil.getAttributeIgnoreCase(element, "type");
-		if (listStyle == null && element != null
-				&& element.getParentNode() != null) {
-			listStyle = DOMUtil.getAttributeIgnoreCase((Element) element
-					.getParentNode(), "type");
-		}
-		if (listStyle != null) {
-			listStyle = listStyle.trim();
-			if (listStyle.equals("1")) {
-				return ICSSPropertyID.VAL_DECIMAL;
-			} else if (listStyle.equals("a")) {
-				return ICSSPropertyID.VAL_LOWER_ALPHA;
-			} else if (listStyle.equals("A")) {
-				return ICSSPropertyID.VAL_UPPER_ALPHA;
-			} else if (listStyle.equals("i")) {
-				return ICSSPropertyID.VAL_LOWER_ROMAN;
-			} else if (listStyle.equals("I")) {
-				return ICSSPropertyID.VAL_UPPER_ROMAN;
-			}
-			return listStyle;
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/MarginWidthMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/MarginWidthMeta.java
deleted file mode 100644
index fddf276..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/MarginWidthMeta.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-/**
- * @author mengbo
- */
-public class MarginWidthMeta extends LengthMeta {
-
-	/**
-	 * Default constructor
-	 */
-	public MarginWidthMeta() {
-		super(false, ICSSPropertyID.VAL_AUTO);
-	}
-
-	/**
-	 * @param propertyName
-	 * @return true if the property is the margin width
-	 */
-	public static boolean isMarginWidth(String propertyName) {
-		return ICSSPropertyID.ATTR_MARGIN_BOTTOM.equalsIgnoreCase(propertyName)
-				|| ICSSPropertyID.ATTR_MARGIN_TOP
-						.equalsIgnoreCase(propertyName)
-				|| ICSSPropertyID.ATTR_MARGIN_LEFT
-						.equalsIgnoreCase(propertyName)
-				|| ICSSPropertyID.ATTR_MARGIN_RIGHT
-						.equalsIgnoreCase(propertyName);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/OverflowMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/OverflowMeta.java
deleted file mode 100644
index 23a0038..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/OverflowMeta.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * 
- * @author mengbo
- * @version 1.5
- */
-public class OverflowMeta extends CSSPropertyMeta {
-	static final String[] KEYWORDS = new String[] { ICSSPropertyID.VAL_VISIBLE,
-			ICSSPropertyID.VAL_HIDDEN, ICSSPropertyID.VAL_SCROLL,
-			ICSSPropertyID.VAL_AUTO };
-
-	/**
-	 * Default constructor
-	 */
-	public OverflowMeta() {
-		super(false, ICSSPropertyID.VAL_VISIBLE);
-	}
-
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		String display = style.getDisplay();
-		// we only support overflow for "block". Which means we don't support it
-		// for table/inline-block, etc.
-		if (!"block".equalsIgnoreCase(display)) {
-			return ICSSPropertyID.VAL_VISIBLE;
-		}
-		return super.calculateCSSValueResult(value, propertyName, style);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/PaddingWidthMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/PaddingWidthMeta.java
deleted file mode 100644
index dd295e6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/PaddingWidthMeta.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.css2.property;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class PaddingWidthMeta extends LengthMeta {
-    
-    private static int MIN_PADDING_THRESHOLD = 4;
-
-	/**
-	 * Default constructor
-	 */
-	public PaddingWidthMeta() {
-		super(false, ICSSPropertyID.VAL_AUTO);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		if (IHTMLConstants.TAG_TD.equalsIgnoreCase(htmltag)
-				|| IHTMLConstants.TAG_TH.equalsIgnoreCase(htmltag)) {
-			Node parent = element;
-			Element tableEle = null;
-			while ((parent = parent.getParentNode()) != null
-					&& parent instanceof Element) {
-				if (((Element) parent).getTagName().equalsIgnoreCase(
-						IHTMLConstants.TAG_TABLE)) {
-					tableEle = (Element) parent;
-					break;
-				}
-			}
-			if (tableEle != null) {
-				//TODO:  Why is only cellpadding being checked?  Why does this class even exist?  What is difference with BorderWidthMeta?   
-				String padding = DOMUtil.getAttributeIgnoreCase(tableEle,
-						"cellpadding");//$NON-NLS-1$
-				if (padding != null && padding.trim().length() > 0) {//fix for 200592						
-					Object length = LengthMeta.toLength(padding, style, this
-								.getPercentageType(), getBaseFont(style));
-                    if (length instanceof Length && ((Length)length).getValue() >= MIN_PADDING_THRESHOLD)                    
-                        return length;
-                    
-				}
-                // TODO should not be hardcoded value.  Either should change to a pref
-                // or a per-component customization.
-                return new Length(MIN_PADDING_THRESHOLD, false);
-			}
-		}
-		return super.calculateHTMLAttributeOverride(element, htmltag,
-				propertyName, style);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/PositionMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/PositionMeta.java
deleted file mode 100644
index f99dcfe..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/PositionMeta.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PositionMeta extends CSSPropertyMeta {
-	/**
-	 * static keyword
-	 */
-	public static final String STATIC = "static";
-
-	/**
-	 * absolute keyword
-	 */
-	public static final String ABSOLUTE = "absolute";
-
-	private static final String RELATIVE = "relative";
-
-	/**
-	 * fixed keyword
-	 */
-	public static final String FIXED = "fixed";
-
-	private static final String[] _keywords = new String[] { STATIC, ABSOLUTE,
-			RELATIVE, FIXED };
-
-	/**
-	 * Default constructor
-	 */
-	public PositionMeta() {
-		super(false, STATIC);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return _keywords;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/PositionOffsetMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/PositionOffsetMeta.java
deleted file mode 100644
index 81147cc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/PositionOffsetMeta.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PositionOffsetMeta extends LengthMeta {
-	/**
-	 * Default constructor
-	 */
-	public PositionOffsetMeta() {
-		super(false, ICSSPropertyID.VAL_AUTO);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/TableUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/TableUtil.java
deleted file mode 100644
index 1366164..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/TableUtil.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.utils.HTMLUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableUtil {
-	static final String TOP = "top";
-
-	static final String BOTTOM = "bottom";
-
-	static final String LEFT = "left";
-
-	static final String RIGHT = "right";
-
-	/**
-	 * @param edge
-	 * @param frame
-	 * @return true if there is a match
-	 */
-	public static boolean matchFrame(String edge, String frame) {
-		if ("above".equalsIgnoreCase(frame)) {
-			return TOP.equalsIgnoreCase(edge);
-		} else if ("below".equalsIgnoreCase(frame)) {
-			return BOTTOM.equalsIgnoreCase(edge);
-		} else if ("hsides".equalsIgnoreCase(frame)) {
-			return TOP.equalsIgnoreCase(edge) || BOTTOM.equalsIgnoreCase(edge);
-		} else if ("vsides".equalsIgnoreCase(frame)) {
-			return LEFT.equalsIgnoreCase(edge) || RIGHT.equalsIgnoreCase(edge);
-		} else if ("lhs".equalsIgnoreCase(frame)) {
-			return LEFT.equalsIgnoreCase(edge);
-		} else if ("rhs".equalsIgnoreCase(frame)) {
-			return RIGHT.equalsIgnoreCase(edge);
-		} else if ("box".equalsIgnoreCase(frame)
-				|| "border".equalsIgnoreCase(frame)) {
-			return true;
-		} else {
-			return false;
-		}
-	}
-
-	/**
-	 * @param edge 
-	 * @param rules
-	 * @return true if rules match
-	 */
-	public static boolean matchRules(String edge, String rules) {
-		// TODO: "groups" not supported.
-
-		if ("rows".equalsIgnoreCase(rules)) {
-			return TOP.equalsIgnoreCase(edge) || BOTTOM.equalsIgnoreCase(edge);
-		} else if ("cols".equalsIgnoreCase(rules)) {
-			return LEFT.equalsIgnoreCase(edge) || RIGHT.equalsIgnoreCase(edge);
-		} else if ("all".equalsIgnoreCase(rules)) {
-			return true;
-		} else {
-			return false;
-		}
-
-	}
-
-	/**
-	 * @param element
-	 * @return true if cell is empty
-	 * see http://www.w3.org/TR/CSS21/tables.html#empty-cells
-	 */
-	public static boolean isEmptyCell(Element element) {
-		NodeList children = element.getChildNodes();
-		if (children.getLength() == 0) {
-			return true;
-		}
-		// we only do simple checking here. When the element has one child
-		// and is text and is whitespace only, then we also treat as empty cell
-		if (children.getLength() == 1) {
-			Node child = children.item(0);
-			if (child instanceof Text) {
-				String text = child.getNodeValue();
-				if (HTMLUtil.isHTMLWhitespaceString(text)) {
-					return true;
-				}
-			}
-		}
-
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/TextAlignMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/TextAlignMeta.java
deleted file mode 100644
index e4e537e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/TextAlignMeta.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import java.util.Arrays;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class TextAlignMeta extends CSSPropertyMeta {
-	static final String[] KEYWORDS = new String[] { ICSSPropertyID.VAL_LEFT,
-			ICSSPropertyID.VAL_RIGHT, ICSSPropertyID.VAL_CENTER,
-			ICSSPropertyID.VAL_JUSTIFY };
-
-	private static final String[] HOR_SLIGN_HTMLTAGS = new String[] {
-			IHTMLConstants.TAG_TABLE, IHTMLConstants.TAG_HR,
-			IHTMLConstants.TAG_LEGEND, IHTMLConstants.TAG_APPLET,
-			IHTMLConstants.TAG_IFRAME, IHTMLConstants.TAG_IMG,
-			IHTMLConstants.TAG_INPUT, IHTMLConstants.TAG_OBJECT,
-			IHTMLConstants.TAG_CAPTION };
-
-	/**
-	 * Default constructor
-	 */
-	public TextAlignMeta() {
-		super(true, NOT_SPECIFIED);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		// /for td, it may look for the attribute value up to tr, but must stop
-		// at table.
-		// so for table,set _inherited=false to stop it.
-		if (IHTMLConstants.TAG_TABLE.equalsIgnoreCase(htmltag)) {
-			this._inherited = false;
-		} else {
-			this._inherited = true;
-		}
-		if (Arrays.asList(HOR_SLIGN_HTMLTAGS).contains(htmltag.toLowerCase())) {
-			return null;
-		}
-
-		String align = DOMUtil.getAttributeIgnoreCase(element,
-				IHTMLConstants.ATTR_ALIGN);
-		String value = checkKeywordValues(align);
-		if (value != null) {
-			return value;
-		}
-		if ("middle".equalsIgnoreCase(align)) {
-			return ICSSPropertyID.VAL_CENTER;
-		}
-
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/TextDecorationMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/TextDecorationMeta.java
deleted file mode 100644
index 7813463..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/TextDecorationMeta.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.w3c.dom.css.CSSValue;
-import org.w3c.dom.css.CSSValueList;
-
-/**
- * @author mengbo
- */
-public class TextDecorationMeta extends CSSPropertyMeta {
-	private static final int NONE = 0;
-
-	/**
-	 * 
-	 */
-	public static final int UNDERLINE = 1;
-
-	/**
-	 * 
-	 */
-	public static final int OVERLINE = 1 << 1;
-
-	/**
-	 * 
-	 */
-	public static final int LINETHROUGH = 1 << 2;
-
-	private static final int BLINK = 1 << 3;
-
-	static final String[] KEYWORDS = new String[] { ICSSPropertyID.VAL_NONE,
-			ICSSPropertyID.VAL_UNDERLINE, ICSSPropertyID.VAL_OVERLINE,
-			ICSSPropertyID.VAL_LINETHROUGH, ICSSPropertyID.VAL_BLINK };
-
-	/**
-	 * Default constructor
-	 */
-	public TextDecorationMeta() {
-		// the spec say text-decoration is not inherited. but the description
-		// seemed to make use inherit easier.
-		// It seems that the property is inherited in IE and Mozilla.
-		super(true, new Integer(NONE));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateCSSValueResult(org.w3c.dom.css.CSSValue,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.property.AbstractStyle)
-	 */
-	public Object calculateCSSValueResult(CSSValue value, String propertyName,
-			ICSSStyle style) {
-		String[] decorations = null;
-		if (value.getCssValueType() == CSSValue.CSS_VALUE_LIST) {
-			CSSValueList valueList = (CSSValueList) value;
-			decorations = new String[valueList.getLength()];
-			for (int i = 0; i < decorations.length; i++) {
-				decorations[i] = valueList.item(i).getCssText();
-			}
-		} else {
-			decorations = new String[1];
-			decorations[0] = value.getCssText();
-		}
-
-		int intvalue = 0;
-		for (int i = 0; i < decorations.length; i++) {
-			String key = super.checkKeywordValues(decorations[i]);
-			if (key == ICSSPropertyID.VAL_NONE) {
-				intvalue = NONE;
-			} else if (key == ICSSPropertyID.VAL_UNDERLINE) {
-				intvalue |= UNDERLINE;
-			} else if (key == ICSSPropertyID.VAL_OVERLINE) {
-				intvalue |= OVERLINE;
-			} else if (key == ICSSPropertyID.VAL_LINETHROUGH) {
-				intvalue |= LINETHROUGH;
-			} else if (key == ICSSPropertyID.VAL_BLINK) {
-				intvalue |= BLINK;
-			}
-		}
-
-		return new Integer(intvalue);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/VerticalAlignMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/VerticalAlignMeta.java
deleted file mode 100644
index d4bb569..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/VerticalAlignMeta.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class VerticalAlignMeta extends LengthMeta {
-	/**
-	 * baseline keyword
-	 */
-	public static final String BASELINE = "baseline"; //$NON-NLS-1$
-
-	/**
-	 * middle keyword
-	 */
-	public static final String MIDDLE = "middle"; //$NON-NLS-1$
-
-	/**
-	 * sub keyword
-	 */
-	public static final String SUB = "sub"; //$NON-NLS-1$
-
-	/**
-	 * super keyword
-	 */
-	public static final String SUPER = "super"; //$NON-NLS-1$
-
-	/**
-	 * text-top keyword
-	 */
-	public static final String TEXT_TOP = "text-top"; //$NON-NLS-1$
-
-	/**
-	 * text-bottom keyword
-	 */
-	public static final String TEXT_BOTTOM = "text-bottom"; //$NON-NLS-1$
-
-	/**
-	 * top keyword
-	 */
-	public static final String TOP = "top"; //$NON-NLS-1$
-
-	/**
-	 * bottom keyword
-	 */
-	public static final String BOTTOM = "bottom"; //$NON-NLS-1$
-
-	/**
-	 * center keyword
-	 */
-	public static final String CENTER = "center"; //$NON-NLS-1$
-
-	/**
-	 * default vertical align
-	 */
-	public static final String DEFAULT_VERTICAL_ALIGN = BASELINE;
-
-	private static final String[] KEYWORDS = new String[] { BASELINE, MIDDLE,
-			SUB, SUPER, TEXT_TOP, TEXT_BOTTOM, TOP, BOTTOM };
-
-	private static final String[] htmlAttributes = new String[] { IHTMLConstants.ATTR_VALIGN };
-
-	/**
-	 * Default constructor
-	 */
-	public VerticalAlignMeta() {
-		super(true, DEFAULT_VERTICAL_ALIGN);
-	}
-
-	/**
-	 * @param inherit
-	 * @param initvalue
-	 */
-	public VerticalAlignMeta(boolean inherit, Object initvalue) {
-		super(inherit, initvalue);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		for (int i = 0; i < htmlAttributes.length; i++) {
-			String align = DOMUtil.getAttributeIgnoreCase(element,
-					htmlAttributes[i]);
-			if (TOP.equalsIgnoreCase(align)) {
-				return TOP;
-			}
-			if (MIDDLE.equalsIgnoreCase(align)) {
-				return MIDDLE;
-			}
-			if (BOTTOM.equalsIgnoreCase(align)) {
-				return BOTTOM;
-			}
-			if (BASELINE.equalsIgnoreCase(align)) {
-				return BASELINE;
-			}
-			if (CENTER.equalsIgnoreCase(align)) {
-				return MIDDLE;
-			}
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/VisibilityMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/VisibilityMeta.java
deleted file mode 100644
index 17236d6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/VisibilityMeta.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class VisibilityMeta extends CSSPropertyMeta {
-	/**
-	 * visible keyword
-	 */
-	public static final String VISIBLE = "visible";
-
-	/**
-	 * hidden keyword
-	 */
-	public static final String HIDDEN = "hidden";
-
-	/**
-	 * collapse keyword
-	 */
-	public static final String COLLAPSE = "collapse";
-
-	private static final String[] KEYWORDS = new String[] { VISIBLE, HIDDEN,
-			COLLAPSE };
-
-	/**
-	 * Default constructor
-	 */
-	public VisibilityMeta() {
-		super(true, VISIBLE);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/WhiteSpaceMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/WhiteSpaceMeta.java
deleted file mode 100644
index c94481f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/WhiteSpaceMeta.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class WhiteSpaceMeta extends CSSPropertyMeta {
-	static final String[] KEYWORDS = new String[] { ICSSPropertyID.VAL_NORMAL,
-			ICSSPropertyID.VAL_PRE, ICSSPropertyID.VAL_NOWRAP };
-
-	/**
-	 * Default constructor
-	 */
-	public WhiteSpaceMeta() {
-		super(true, ICSSPropertyID.VAL_NORMAL);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#getKeywordValues()
-	 */
-	protected String[] getKeywordValues() {
-		return KEYWORDS;
-	}
-
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		if (IHTMLConstants.TAG_TD.equalsIgnoreCase(htmltag)
-				|| IHTMLConstants.TAG_TH.equalsIgnoreCase(htmltag)) {
-			String noWrap = DOMUtil.getAttributeIgnoreCase(element,
-					IHTMLConstants.ATTR_NOWRAP);
-			if (Boolean.TRUE.toString().equalsIgnoreCase(noWrap)) {
-				return ICSSPropertyID.VAL_NOWRAP;
-			}
-		}
-		return super.calculateHTMLAttributeOverride(element, htmltag,
-				propertyName, style);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/WidthMeta.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/WidthMeta.java
deleted file mode 100644
index f38e765..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/property/WidthMeta.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.property;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class WidthMeta extends LengthMeta {
-	/**
-	 * Default constructor
-	 */
-	public WidthMeta() {
-		super(false, ICSSPropertyID.VAL_AUTO);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.property.CSSPropertyMeta#calculateHTMLAttributeOverride(org.w3c.dom.Element,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.css2.ICSSStyle)
-	 */
-	public Object calculateHTMLAttributeOverride(Element element,
-			String htmltag, String propertyName, ICSSStyle style) {
-		if (!IHTMLConstants.TAG_INPUT.equalsIgnoreCase(htmltag)
-				&& !IHTMLConstants.TAG_BUTTON.equalsIgnoreCase(htmltag)) {
-			String width = DOMUtil
-					.getAttributeIgnoreCase(element, propertyName);
-			if (width != null) {
-				return LengthMeta.toLength(width, style, this
-						.getPercentageType(), getBaseFont(style));
-			}
-		}
-		return super.calculateHTMLAttributeOverride(element, htmltag,
-				propertyName, style);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/provider/DimensionInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/provider/DimensionInfo.java
deleted file mode 100644
index 4531ace..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/provider/DimensionInfo.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.provider;
-
-import org.eclipse.draw2d.geometry.Dimension;
-
-/**
- * This is a struct, include a dimension and a ascent info.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class DimensionInfo {
-	private final Dimension _dimension;
-
-	private final int _ascent;
-
-	/**
-	 * 
-	 * @param d
-	 * @param ascent
-	 *            -1 means ascent is same as dimension height
-	 */
-	public DimensionInfo(Dimension d, int ascent) {
-		this._dimension = d;
-		this._ascent = ascent;
-	}
-
-	/**
-	 * @param width
-	 * @param height
-	 * @param i
-	 */
-	public DimensionInfo(int width, int height, int i) {
-		this(new Dimension(width, height), i);
-	}
-
-	/**
-	 * @return the dimension
-	 */
-	public Dimension getDimension() {
-		return _dimension;
-	}
-
-	/**
-	 * @return the ascent
-	 */
-	public int getAscent() {
-		return _ascent;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/provider/ICSSTextProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/provider/ICSSTextProvider.java
deleted file mode 100644
index c646cc9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/provider/ICSSTextProvider.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.provider;
-
-/**
- * This class behave as the information provider of CSSTextFigure.
- * 
- * @author mengbo
- */
-public interface ICSSTextProvider {
-	/**
-	 * get the style.
-	 * 
-	 * @return can't be null
-	 */
-	// public ICSSStyle getCSSStyle();
-	/**
-	 * this is the final data to be displayed. There is no need for the
-	 * CSSTextFigure to normalize it.
-	 * 
-	 * @return the text data
-	 */
-	public String getTextData();
-
-	/**
-	 * get the selected information.
-	 * 
-	 * @return the selected range
-	 */
-	public int[] getSelectedRange();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/provider/ICSSWidgetProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/provider/ICSSWidgetProvider.java
deleted file mode 100644
index 81e7b9c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/provider/ICSSWidgetProvider.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.provider;
-
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-
-/**
- * @author mengbo
- */
-public interface ICSSWidgetProvider {
-	/**
-	 * can be null
-	 * 
-	 * @return the style
-	 */
-	public ICSSStyle getCSSStyle();
-
-	/**
-	 * @return true if is handling border
-	 */
-	public boolean isHandlingBorder();
-
-	/**
-	 * whether the parameter and return value includes border depends on the
-	 * isHandlingBorder
-	 * 
-	 * @param width
-	 *            -1 means no suggested value
-	 * @param height
-	 *            -1 means no suggested value
-	 * @return the dimension info
-	 */
-	public DimensionInfo getPreferredDimension(int width, int height);
-
-	/**
-	 * if isHandlingBorder return false, then "rect" will be the rect without
-	 * border, and this method should not paint border.
-	 * 
-	 * If isHandlingBorder returns true, then "rect" include border, and this
-	 * method should also paint its own border.
-	 * @param g 
-	 * @param rect
-	 */
-	public void paintFigure(Graphics g, Rectangle rect);
-
-	/**
-	 * @return true if is inline
-	 */
-	public boolean isInline();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/AbstractStyle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/AbstractStyle.java
deleted file mode 100644
index db251dd..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/AbstractStyle.java
+++ /dev/null
@@ -1,686 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.style;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.CSSUtil;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.font.CSSFontManager;
-import org.eclipse.jst.pagedesigner.css2.font.ICSSFont;
-import org.eclipse.jst.pagedesigner.css2.font.ICSSFontManager;
-import org.eclipse.jst.pagedesigner.css2.list.CounterHelper;
-import org.eclipse.jst.pagedesigner.css2.list.CounterValueGenerator;
-import org.eclipse.jst.pagedesigner.css2.list.ICounterValueGenerator;
-import org.eclipse.jst.pagedesigner.css2.property.CSSMetaRegistry;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta;
-import org.eclipse.jst.pagedesigner.css2.value.Length;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.css.CSSStyleDeclaration;
-import org.w3c.dom.css.CSSValue;
-
-/**
- * @author mengbo
- */
-public class AbstractStyle implements ICSSStyle 
-{
-	private final Element _element;
-
-	private Map _cachedValues = new HashMap();
-
-	private ICSSFont _font = null;
-
-	private CSSStyleDeclaration _cache;
-
-	private CSSStyleDeclaration _defaultCache;
-
-	private boolean _cssDeclareWasSearched = false;
-
-	private boolean _cssDefaultDeclareWasSearched = false;
-
-	private Insets _borderInsets, _marginInsets, _paddingInsets;
-
-	private ICSSStyle _parentStyle;
-
-	private HashMap _counters = null;
-
-	/**
-	 * @return the element this style if for
-	 */
-	public Element getElement() {
-		return _element;
-	}
-
-	/**
-	 * @param element
-	 */
-	public AbstractStyle(Element element) {
-		_element = element;
-	}
-
-	/**
-	 * reset all the cache.
-	 */
-	public void reset() {
-		_cachedValues.clear();
-		_font = null;
-		_cache = null;
-		_defaultCache = null;
-		_cssDeclareWasSearched = false;
-		_cssDefaultDeclareWasSearched = false;
-		// if (_counters != null)
-		// {
-		// unregistCounter();
-		// _counters.clear();
-		// _counters = null;
-		// }
-		_borderInsets = _marginInsets = _paddingInsets = null;
-	}
-
-	/**
-	 * this is a hook method so caller can use it to override default
-	 * calculation. Note, after the call to <code>reset</code>, it will be
-	 * lost.
-	 * 
-	 * @param property
-	 * @param value
-	 */
-	public void setStyleProperty(String property, Object value) {
-		_cachedValues.put(property, value);
-	}
-
-	/**
-	 * get a style property value.
-	 * 
-	 * @param property
-	 * @return the style property
-	 */
-	public Object getStyleProperty(String property) {
-		Object value = _cachedValues.get(property);
-		if (value == null) {
-			value = calculateProperty(property);
-			if (value != null) {
-				_cachedValues.put(property, value);
-			}
-		}
-		return value;
-	}
-
-	/**
-	 * in this method, should first check the "style" attribute, then combine
-	 * that with document style.
-	 * 
-	 * @return the style
-	 */
-	protected CSSStyleDeclaration calculateDeclaration() {
-		String name = getHtmlElement().getAttribute("id");
-		if (name == null || name.length() == 0) {
-			name = getHtmlElement().getAttribute("name");
-		}
-		return CSSUtil.getCSSDeclaration(this.getHtmlElement(), name);
-	}
-
-	/**
-	 * @return the style
-	 */
-	protected CSSStyleDeclaration calculateDefaultDeclaration() {
-		return CSSUtil.getDefaultCSSDeclaration(this.getHtmlElement(), null);
-	}
-
-	/**
-	 * @return the style declaration
-	 */
-	public CSSStyleDeclaration getDeclaration() {
-		// FIXME:may need to be change, boolean variable is not a best way.
-		if (!_cssDeclareWasSearched) {
-			_cache = calculateDeclaration();
-			_cssDeclareWasSearched = true;
-		}
-		return _cache;
-	}
-
-	/**
-	 * @return the default declaration
-	 */
-	public CSSStyleDeclaration getDefaultDeclaration() {
-		// FIXME:may need to be change, boolean variable is not a best way.
-		if (!_cssDefaultDeclareWasSearched) {
-			_defaultCache = calculateDefaultDeclaration();
-			_cssDefaultDeclareWasSearched = true;
-		}
-		return _defaultCache;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getHTMLelementInitValue(java.lang.String)
-	 */
-	public Object getHTMLelementInitValue(String propertyName) {
-		ICSSPropertyMeta meta = getPropertyMeta(propertyName);
-		if (meta != null) {
-			Object obj = meta.getHTMLElementInitialValue(_element,
-					getHTMLTag(), propertyName);
-			if (obj == null) {
-				obj = meta.getInitialValue(propertyName, this);
-			}
-			return obj;
-		}
-		return ICSSPropertyMeta.NOT_SPECIFIED;
-	}
-
-	/**
-	 * @param propertyName
-	 * @return the property
-	 */
-	protected Object calculateProperty(String propertyName) {
-		ICSSPropertyMeta meta = getPropertyMeta(propertyName);
-		Object result = null;
-		// get declaration
-		CSSStyleDeclaration decl = getDeclaration();
-		CSSValue value = decl == null ? null : decl
-				.getPropertyCSSValue(propertyName);
-		if (value == null) {
-			if (meta != null) {
-				result = meta.calculateHTMLAttributeOverride(_element,
-						getHTMLTag(), propertyName, this);
-				if (result != null) {
-					return result;
-				}
-			}
-			decl = getDefaultDeclaration();
-		}
-		value = decl == null ? null : decl.getPropertyCSSValue(propertyName);
-
-		if (value != null && value.getCssValueType() == CSSValue.CSS_INHERIT) {
-			result = getParentResultValue(meta, propertyName);
-		} else if (value == null) {
-			if (meta != null) {
-				result = meta.calculateHTMLAttributeOverride(_element,
-						getHTMLTag(), propertyName, this);
-			}
-			if (result == null) {
-				result = calculateLocalOverride(meta, propertyName);
-			}
-			if (result == null) {
-				if (meta == null) {
-					result = ICSSPropertyMeta.NOT_SPECIFIED;
-				} else {
-					if (meta.isInherited()) {
-						result = getParentResultValue(meta, propertyName);
-					} else {
-						result = meta.getInitialValue(propertyName, this);
-					}
-				}
-			}
-		} else {
-			result = calculateCSSValueResult(meta, value, propertyName);
-		}
-		return result;
-	}
-
-	/**
-	 * get the corresponding HTML tag for this style. This is for certain HTML
-	 * tag can also provide style information.
-	 * 
-	 * @return the html tag
-	 */
-	protected String getHTMLTag() {
-		return _element.getTagName();
-	}
-
-	/**
-	 * @param propertyName
-	 * @return the property meta for property name
-	 */
-	protected ICSSPropertyMeta getPropertyMeta(String propertyName) {
-		return CSSMetaRegistry.getInstance().getMeta(propertyName);
-	}
-
-	/**
-	 * convert the CSSValue to the property type specified data result.
-	 * 
-	 * @param meta 
-	 * @param value
-	 * @param propertyName
-	 * @return should not return null.
-	 */
-	protected Object calculateCSSValueResult(ICSSPropertyMeta meta,
-			CSSValue value, String propertyName) {
-		if (meta == null) {
-			return ICSSPropertyMeta.NOT_SPECIFIED;
-		}
-        return meta.calculateCSSValueResult(value, propertyName, this);
-	}
-
-	/**
-	 * it is possible that some attribute of the element may provide style
-	 * information. child class should override this method. Also, some element
-	 * type may have internally build style, such as input-submit may use
-	 * special border. NOTE: it is very important that in calculateLocalOverride
-	 * you don't directly or indirectly call getStyleProperty() to avoid
-	 * deadloop.
-	 * 
-	 * @param meta 
-	 * @param propertyName
-	 * @return null means no style information in other attributes. Otherwise
-	 *         return property specific data result -- normally will use meta to
-	 *         convert the attribute.
-	 */
-	protected Object calculateLocalOverride(ICSSPropertyMeta meta,
-			String propertyName) {
-		// // do some default margin thing.
-		// if (ICSSPropertyID.ATTR_MARGIN_RIGHT.equalsIgnoreCase(propertyName)
-		// || ICSSPropertyID.ATTR_MARGIN_BOTTOM.equalsIgnoreCase(propertyName))
-		// {
-		// return MARGIN_LENGTH;
-		// }
-		// else if
-		// (ICSSPropertyID.ATTR_MARGIN_LEFT.equalsIgnoreCase(propertyName))
-		// {
-		// // to make a little room, so it is possible for user to position the
-		// // mouse before the first element in a block.
-		// return MARGIN_LEFT;
-		// }
-		return null;
-	}
-
-	/**
-	 * This is only called when inherit value from parent.
-	 * 
-	 * @param meta 
-	 * @param propertyName
-	 * @return the result value
-	 */
-	protected Object getParentResultValue(ICSSPropertyMeta meta,
-			String propertyName) {
-		ICSSStyle style = getParentStyle();
-		return style.getStyleProperty(propertyName);
-	}
-
-	/**
-	 * @param parentStyle
-	 */
-	public void setParentStyle(ICSSStyle parentStyle) {
-		this._parentStyle = parentStyle;
-		reset();
-	}
-
-	public ICSSStyle getParentStyle() {
-		if (_parentStyle != null) {
-			return _parentStyle;
-		}
-		Node node = _element.getParentNode();
-		while (node instanceof Element && node instanceof INodeNotifier) {
-			ICSSStyle parentStyle = (ICSSStyle) ((INodeNotifier) node)
-					.getAdapterFor(ICSSStyle.class);
-			if (parentStyle != null) {
-				return parentStyle;
-			}
-            node = node.getParentNode();
-		}
-		return DefaultStyle.getInstance();
-	}
-
-	/**
-	 * Will not return null
-	 * 
-	 * @return the font
-	 */
-	public ICSSFont getCSSFont() {
-		if (_font == null) {
-			_font = getFontManager().createFont(this);
-		}
-		return _font;
-	}
-
-	/**
-	 * @return
-	 */
-	private ICSSFontManager getFontManager() {
-		return CSSFontManager.getInstance();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#dispose()
-	 */
-	public void dispose() {
-        // TODO: anything to dispose?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getMarginInsets()
-	 */
-	public Insets getMarginInsets() {
-		if (_marginInsets == null) {
-			int top = getInsetProperty(ICSSPropertyID.ATTR_MARGIN_TOP);
-			int left = getInsetProperty(ICSSPropertyID.ATTR_MARGIN_LEFT);
-			int bottom = getInsetProperty(ICSSPropertyID.ATTR_MARGIN_BOTTOM);
-			int right = getInsetProperty(ICSSPropertyID.ATTR_MARGIN_RIGHT);
-			_marginInsets = new Insets(top, left, bottom, right);
-		}
-		return _marginInsets;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getPaddingInsets()
-	 */
-	public Insets getPaddingInsets() {
-		if (_paddingInsets == null) {
-			int top = getInsetProperty(ICSSPropertyID.ATTR_PADDING_TOP)+ARTIFICIAL_BORDER_OFFSET;
-			int left = getInsetProperty(ICSSPropertyID.ATTR_PADDING_LEFT)+ARTIFICIAL_BORDER_OFFSET;
-			int bottom = getInsetProperty(ICSSPropertyID.ATTR_PADDING_BOTTOM)+ARTIFICIAL_BORDER_OFFSET;
-			int right = getInsetProperty(ICSSPropertyID.ATTR_PADDING_RIGHT)+ARTIFICIAL_BORDER_OFFSET;
-			_paddingInsets = new Insets(top, left, bottom, right);
-		}
-		return _paddingInsets;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getBorderInsets()
-	 */
-	public Insets getBorderInsets() {
-		if (_borderInsets == null) {
-			int top = getInsetProperty(ICSSPropertyID.ATTR_BORDER_TOP_WIDTH);
-			int left = getInsetProperty(ICSSPropertyID.ATTR_BORDER_LEFT_WIDTH);
-			int bottom = getInsetProperty(ICSSPropertyID.ATTR_BORDER_BOTTOM_WIDTH);
-			int right = getInsetProperty(ICSSPropertyID.ATTR_BORDER_RIGHT_WIDTH);
-			_borderInsets = new Insets(top, left, bottom, right);
-		}
-		return _borderInsets;
-	}
-
-	/**
-	 * @param border_top_width
-	 * @return
-	 */
-	private int getInsetProperty(String propertyName) {
-		Object obj = this.getStyleProperty(propertyName);
-		if (obj instanceof Length) {
-			Length l = (Length) obj;
-			if (l.isPercentage()) {
-				return 0; // FIXME:
-			}
-            return l.getValue();
-		}
-
-		return 0;
-	}
-
-	public boolean isAdapterForType(Object type) {
-		return (type == ICSSStyle.class);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#isSizeIncludeBorderPadding()
-	 */
-	public boolean isSizeIncludeBorderPadding() {
-		String display = this.getDisplay();
-		if ("table-cell".equalsIgnoreCase(display)) {
-			return false;
-		}
-		String tag = this.getHTMLTag();
-		if ("img".equalsIgnoreCase(tag)) {
-			return false;
-		}
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.sse.model.INodeAdapter#notifyChanged(com.ibm.sse.model.INodeNotifier,
-	 *      int, java.lang.Object, java.lang.Object, java.lang.Object, int)
-	 */
-	public void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-        // do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getBackgroundColor()
-	 */
-	public Object getColor() {
-		Object _color = null;
-		if (_color == null) {
-			_color = getStyleProperty(ICSSPropertyID.ATTR_COLOR);
-			if (_color == null) {
-				_color = getStyleProperty(ICSSPropertyID.ATTR_TEXTCOLOR);
-			}
-		}
-		return _color;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getColor()
-	 */
-	public Object getBackgroundColor() {
-		Object _backgroundColor = null;
-		if (_backgroundColor == null) {
-			_backgroundColor = getStyleProperty(ICSSPropertyID.ATTR_BACKGROUND_COLOR);
-		}
-		return _backgroundColor;
-	}
-
-	/**
-	 * @return the html element
-	 */
-	public Element getHtmlElement() {
-		// if (_element instanceof IDOMElement)
-		// {
-		// EditPart part = (EditPart) ((IDOMElement)
-		// _element).getAdapterFor(EditPart.class);
-		// if (part instanceof ElementEditPart)
-		// {
-		// ElementEditPart elementPart = (ElementEditPart) part;
-		// ITagHandler h = elementPart.getTagHandler();
-		// if (h != null)
-		// {
-		// return h.mapCustomElement(_element);
-		// }
-		// }
-		//
-		// }
-		return _element;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getDisplay()
-	 */
-	public String getDisplay() {
-		Object display = this.getStyleProperty(ICSSPropertyID.ATTR_DISPLAY);
-		String displayStr;
-		if (display == null) {
-			displayStr = ICSSPropertyID.VAL_INLINE;
-		} else if (display instanceof String) {
-			displayStr = (String) display;
-		} else {
-			displayStr = display.toString();
-		}
-		if (ICSSPropertyID.VAL_INLINE.equalsIgnoreCase(displayStr)
-				&& IHTMLConstants.TAG_TABLE.equalsIgnoreCase(getHTMLTag())) {
-			return ICSSPropertyID.VAL_INLINE_TABLE;
-		}
-		if (ICSSPropertyID.VAL_INLINE.equalsIgnoreCase(displayStr)) {
-			Object width = this.getStyleProperty(ICSSPropertyID.ATTR_WIDTH);
-			if (width instanceof Length) {
-				return ICSSPropertyID.VAL_INLINE_BLOCK;
-			}
-			Object height = this.getStyleProperty(ICSSPropertyID.ATTR_HEIGHT);
-			if (height instanceof Length) {
-				return ICSSPropertyID.VAL_INLINE_BLOCK;
-			}
-			return displayStr;
-		}
-        return displayStr;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getListStyle()
-	 */
-	public Map getCounters() {
-		if (_counters == null) {
-			_counters = new HashMap();
-			CounterHelper.processCounterReset(this, _counters);
-		}
-		return _counters;
-	}
-
-	/**
-	 * Get named counter from counters.
-	 * 
-	 * see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getCounter(java.lang.String)
-	 */
-	public ICounterValueGenerator findCounter(String name, boolean must) {
-		Map counters = getCounters();
-		if (counters == null || !counters.containsKey(name)) {
-			if (getParentStyle() != null
-					&& !(getParentStyle() instanceof DefaultStyle)) {
-				// ensure it is registered somewhere.
-				return getParentStyle().findCounter(name, must);
-			}
-			// must is called by counter-increment
-			else if (must) {
-				// the caller should do the other setting.
-				ICounterValueGenerator counter = new CounterValueGenerator(
-						name, null, null, this);
-				counter.resetCount();
-				counters.put(name, counter);
-			}
-		}
-		return (ICounterValueGenerator) counters.get(name);
-	}
-
-	/**
-	 * @param buffer
-	 */
-	public void dumpDebugInfo(StringBuffer buffer) {
-		if (_cache != null) {
-			buffer.append("cache:\n");
-			buffer.append(_cache.getCssText()).append("\n");
-		}
-		if (_defaultCache != null) {
-			buffer.append("default cache:\n");
-			buffer.append(_defaultCache.getCssText()).append("\n");
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getColSpan()
-	 */
-	public int getColSpan() {
-		int colspan = DOMUtil.getIntAttributeIgnoreCase(getHtmlElement(),
-				"colspan", 1);
-		// if span == 0, means span all col from the current column to end
-		// colume
-		if (colspan < 0) {
-			return 1;
-		}
-        return colspan;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getRowSpan()
-	 */
-	public int getRowSpan() {
-		int rowspan = DOMUtil.getIntAttributeIgnoreCase(getHtmlElement(),
-				"rowspan", 1);
-		if (rowspan < 0) {
-			return 1;
-		}
-        return rowspan;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#isInSelection()
-	 */
-	public boolean isInSelection() {
-		IRangeSelectionProxy proxy = (IRangeSelectionProxy) getAdapter(IRangeSelectionProxy.class);
-		if (proxy != null) {
-			return proxy.isRangeSelected();
-		}
-		ICSSStyle parentStyle = getParentStyle();
-		if (parentStyle != null) {
-			return parentStyle.isInSelection();
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		if (this._element instanceof INodeNotifier) {
-			Object ret = ((INodeNotifier) _element).getAdapterFor(adapter);
-			if (ret != null && adapter.isInstance(ret)) {
-				return ret;
-			}
-		}
-		return null;
-	}
-
-	// private void unregistCounter()
-	// {
-	// if (_counters != null)
-	// {
-	// Collection c = _counters.values();
-	// Iterator iter = c.iterator();
-	// while (iter.hasNext())
-	// {
-	// Counter2 counter = (Counter2) iter.next();
-	// counter.unregist(this);
-	// }
-	// }
-	// }
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#resetCounters()
-	 */
-	public void processCounters() {
-		this._counters = null;
-		CounterHelper.processCounterIncrement(this);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/DefaultStyle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/DefaultStyle.java
deleted file mode 100644
index 2a2d482..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/DefaultStyle.java
+++ /dev/null
@@ -1,259 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.style;
-
-import java.util.Map;
-
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.font.CSSFontManager;
-import org.eclipse.jst.pagedesigner.css2.font.ICSSFont;
-import org.eclipse.jst.pagedesigner.css2.list.ICounterValueGenerator;
-import org.eclipse.jst.pagedesigner.css2.property.CSSMetaRegistry;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-
-/**
- * @author mengbo
- * 
- * TODO: why doesn't this sub-class AbstractStyle
- */
-public class DefaultStyle implements ICSSStyle {
-
-	private static final Insets EMPTY_INSETS = new Insets();
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#reset()
-	 */
-	public void reset() {
-        // TODO: dead?        
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getStyleProperty(java.lang.String)
-	 */
-	public Object getStyleProperty(String property) {
-		ICSSPropertyMeta meta = CSSMetaRegistry.getInstance().getMeta(property);
-		if (meta == null) {
-			return ICSSPropertyMeta.NOT_SPECIFIED;
-		}
-        return meta.getInitialValue(property, this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getMarginInsets()
-	 */
-	public Insets getMarginInsets() {
-		return EMPTY_INSETS;
-        //return new Insets(0, 0, 0, 0);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getBorderInsets()
-	 */
-	public Insets getBorderInsets() {
-		return EMPTY_INSETS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getPaddingInsets()
-	 */
-	public Insets getPaddingInsets() {
-        return new Insets(ARTIFICIAL_BORDER_OFFSET, ARTIFICIAL_BORDER_OFFSET, ARTIFICIAL_BORDER_OFFSET, ARTIFICIAL_BORDER_OFFSET);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#isSizeIncludeBorderPadding()
-	 */
-	public boolean isSizeIncludeBorderPadding() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#dispose()
-	 */
-	public void dispose() {
-        // TODO: anything to dispose
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.sse.model.INodeAdapter#isAdapterForType(java.lang.Object)
-	 */
-	public boolean isAdapterForType(Object type) {
-		return type == ICSSStyle.class;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.sse.model.INodeAdapter#notifyChanged(com.ibm.sse.model.INodeNotifier,
-	 *      int, java.lang.Object, java.lang.Object, java.lang.Object, int)
-	 */
-	public void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-        // TODO: do nothing?
-	}
-
-	private ICSSFont defaultFont = CSSFontManager.getInstance().createDefaultFont();
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getCSSFont()
-	 */
-	public ICSSFont getCSSFont() {
-		return defaultFont;
-	}
-
-	/**
-	 * @return the singleton instance
-	 */
-	public static ICSSStyle getInstance() {
-		if (_instance == null) {
-			_instance = new DefaultStyle();
-		}
-		return _instance;
-	}
-
-	static DefaultStyle _instance;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getParentStyle()
-	 */
-	public ICSSStyle getParentStyle() {
-		// return this;
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getBackgroundColor()
-	 */
-	public Object getBackgroundColor() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getColor()
-	 */
-	public Object getColor() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getDisplay()
-	 */
-	public String getDisplay() {
-		return "inline";
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getListStyle()
-	 */
-	public Map getCounters() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getCounter(java.lang.String)
-	 */
-	public ICounterValueGenerator findCounter(String name, boolean must) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getColSpan()
-	 */
-	public int getColSpan() {
-		return 1;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getRowSpan()
-	 */
-	public int getRowSpan() {
-		return 1;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#isInSelection()
-	 */
-	public boolean isInSelection() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#resetCounters()
-	 */
-	public void processCounters() {
-		// do nothing.
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.ICSSStyle#getHTMLelementValue(java.lang.String)
-	 */
-	public Object getHTMLelementInitValue(String propertyName) {
-		ICSSPropertyMeta meta = CSSMetaRegistry.getInstance().getMeta(
-				propertyName);
-		if (meta == null) {
-			return ICSSPropertyMeta.NOT_SPECIFIED;
-		}
-        return meta.getInitialValue(propertyName, this);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/HiddenElementStyle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/HiddenElementStyle.java
deleted file mode 100644
index f5783f6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/HiddenElementStyle.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.style;
-
-import org.eclipse.jst.pagedesigner.parts.EditProxyAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.w3c.dom.Element;
-
-/**
- * A style for hidden elements
- *
- */
-public class HiddenElementStyle extends DefaultStyle {
-	private EditProxyAdapter _editProxyAdapter;
-
-	private Element _convertedElement;
-
-	private static ITagEditInfo _tagEditInfo = new ITagEditInfo() {
-
-		public boolean isWidget() {
-			return true;
-		}
-
-		public boolean needBorderDecorator() {
-			return false;
-		}
-
-		public boolean needTableDecorator() {
-			return false;
-		}
-
-		public int getMinWidth() {
-			return 0;
-		}
-
-		public int getMinHeight() {
-			return 0;
-		}
-	};
-
-	/**
-	 * @param adapter
-	 */
-	public HiddenElementStyle(EditProxyAdapter adapter) {
-		this._editProxyAdapter = adapter;
-	}
-
-	/**
-	 * @param convertedElement
-	 */
-	public HiddenElementStyle(Element convertedElement) {
-		this._convertedElement = convertedElement;
-	}
-
-	public boolean isInSelection() {
-		if (_convertedElement instanceof INodeNotifier) {
-			Object ret = ((INodeNotifier) _convertedElement)
-					.getAdapterFor(AbstractStyle.class);
-			if (ret instanceof AbstractStyle) {
-				return ((AbstractStyle) ret).isInSelection();
-			}
-		}
-
-		if (_editProxyAdapter != null) {
-			return _editProxyAdapter.isRangeSelected();
-		}
-
-		return false;
-	}
-
-	public Object getAdapter(Class adapter) {
-		if (_convertedElement instanceof INodeNotifier) {
-			Object ret = ((INodeNotifier) _convertedElement)
-					.getAdapterFor(AbstractStyle.class);
-			if (ret instanceof AbstractStyle) {
-				return ((AbstractStyle) ret).getAdapter(adapter);
-			}
-		}
-		if (_editProxyAdapter != null && adapter == ITagEditInfo.class) {
-			return _tagEditInfo;
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/IRangeSelectionProxy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/IRangeSelectionProxy.java
deleted file mode 100644
index 5bf6fb8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/IRangeSelectionProxy.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.style;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public interface IRangeSelectionProxy {
-
-	/**
-	 * @return true if the range is selected
-	 */
-	boolean isRangeSelected();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/ITagEditInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/ITagEditInfo.java
deleted file mode 100644
index e2ac601..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/ITagEditInfo.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.style;
-
-/**
- * TODO: TagConversion decorator should augment/replace
- * @author mengbo
- * @version 1.5
- */
-public interface ITagEditInfo 
-{
-	/**
-	 * @return true if is a widget
-	 */
-	public boolean isWidget();
-
-	/**
-	 * @return true if a border decorator is needed
-	 */
-	public boolean needBorderDecorator();
-
-	/**
-	 * @return true if a table decorator is needed
-	 */
-	public boolean needTableDecorator();
-
-	/**
-	 * for some element in design mode we want to them to have a default min
-	 * size.
-	 * 
-	 * @return positive value means an expected min size.
-	 */
-	public int getMinWidth();
-
-	/**
-	 * @return the minimum height
-	 */
-	public int getMinHeight();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/StyleUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/StyleUtil.java
deleted file mode 100644
index 635576f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/style/StyleUtil.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.style;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public final class StyleUtil {
-	/**
-	 * @param style
-	 * @return true if the style is in a widget
-	 */
-	public static boolean isInWidget(ICSSStyle style) {
-		while (style != null && style != DefaultStyle.getInstance()) {
-			ITagEditInfo info = (ITagEditInfo) style
-					.getAdapter(ITagEditInfo.class);
-			if (info != null && info.isWidget()) {
-				return true;
-			}
-
-			style = style.getParentStyle();
-		}
-		return false;
-	}
-	
-	private StyleUtil()
-	{
-	    // util class
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/value/Length.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/value/Length.java
deleted file mode 100644
index be19387..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/value/Length.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.value;
-
-/**
- * @author mengbo
- */
-public class Length {
-	/**
-	 * Constant for 0 length
-	 */
-	public static final Length LENGTH_0 = new Length(0, false);
-
-	/**
-	 * Constant for 1 length
-	 */
-	public static final Length LENGTH_1 = new Length(1, false);
-
-	/**
-	 * Constant for 2 length
-	 */
-	public static final Length LENGTH_2 = new Length(2, false);
-
-	/**
-	 * Constant for 3 length
-	 */
-	public static final Length LENGTH_3 = new Length(3, false);
-
-	/**
-	 * Constant for 8 length
-	 */
-	public static final Length LENGTH_8 = new Length(8, false);
-
-	private final boolean _percentage;
-
-	private final int _value;
-
-	/**
-	 * @param value
-	 * @param percentage
-	 */
-	public Length(int value, boolean percentage) {
-		_value = value;
-		_percentage = percentage;
-	}
-
-	/**
-	 * @return true if value is a percentage
-	 */
-	public boolean isPercentage() {
-		return _percentage;
-	}
-
-	/**
-	 * @return the length value
-	 */
-	public int getValue() {
-		return _value;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/AbstractWidgetProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/AbstractWidgetProvider.java
deleted file mode 100644
index c29d39f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/AbstractWidgetProvider.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.widget;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public abstract class AbstractWidgetProvider implements ICSSWidgetProvider {
-	final static int BORDERTHICK = 2;
-
-	private final ICSSStyle _style;
-
-	/**
-	 * @param style
-	 */
-	public AbstractWidgetProvider(ICSSStyle style) {
-		_style = style;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#getCSSStyle()
-	 */
-	public ICSSStyle getCSSStyle() {
-		return _style;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#isHandlingBorder()
-	 */
-	public boolean isHandlingBorder() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#isInline()
-	 */
-	public boolean isInline() {
-		return true;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/BorderUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/BorderUtil.java
deleted file mode 100644
index 65659f6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/BorderUtil.java
+++ /dev/null
@@ -1,315 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.widget;
-
-import java.util.List;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.FlowBox;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public final class BorderUtil {
-	/**
-	 * vertical bar style
-	 */
-	public final static int VERTICAL_BAR = 0;
-
-	/**
-	 * horizontal bar style
-	 */
-	public final static int HORIZONTAL_BAR = 1;
-
-	/**
-	 * both scroll bar style
-	 */
-	public final static int BOTH = 2;
-
-	/**
-	 * The scroll width
-	 */
-	public final static int SCROLL_WIDTH = 16;
-
-	/**
-	 * the border thickness
-	 */
-	public final static int BORDER_THICK = 2;
-
-	/**
-	 * draw a mask to a rectangle
-	 * 
-	 * @param g 
-	 * @param rect 
-	 * @param color 
-	 * 
-	 */
-	public static void maskRectangle(Graphics g, Rectangle rect, Color color) {
-		// set default if one not provided
-		if (color == null) {
-			color = ColorConstants.blue;
-		}
-
-		// get old information and keep them
-		int lineStyle = g.getLineStyle();
-		Color foregroundColor = g.getForegroundColor();
-
-		g.setLineStyle(SWT.LINE_SOLID);
-		g.setForegroundColor(color);
-		for (int i = 0, n = rect.height; i < n; i++, i++) {
-			for (int j = 0, m = rect.width; j < m; j++, j++) {
-				g.drawLine(rect.x + j, rect.y + i, rect.x + j, rect.y + i);
-			}
-		}
-
-		// restore to the old state
-		g.setLineStyle(lineStyle);
-		g.setForegroundColor(foregroundColor);
-	}
-
-	/**
-	 * @param g
-	 * @param rect
-	 * @param thick
-	 * @param inset
-	 */
-	public static void drawBorder(Graphics g, Rectangle rect, int thick,
-			boolean inset) {
-		drawBorder(g, rect.x, rect.y, rect.width, rect.height, thick, inset);
-	}
-
-	/**
-	 * draw a standard border.
-	 * 
-	 * @param g
-	 * @param left
-	 * @param top
-	 * @param width
-	 * @param height
-	 * @param thick
-	 * @param inset
-	 */
-	public static void drawBorder(Graphics g, int left, int top, int width,
-			int height, int thick, boolean inset) {
-		Color[] ltColors = new Color[] {
-				Display.getCurrent().getSystemColor(
-						SWT.COLOR_WIDGET_LIGHT_SHADOW),
-				Display.getCurrent().getSystemColor(
-						SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW) };
-		if (inset) {
-			ltColors = new Color[] { ColorConstants.buttonDarker,
-					ColorConstants.buttonDarkest };
-		}
-		for (int i = 0; i < thick; i++) {
-			g.setForegroundColor(ltColors[ltColors.length * i / thick]);
-			g.drawLine(left + i, top + i, left + width - 1 - i, top + i);
-			g.drawLine(left + i, top + i, left + i, top + height - i - i);
-		}
-
-		Color[] rbColors = new Color[] {
-				Display.getCurrent().getSystemColor(
-						SWT.COLOR_WIDGET_DARK_SHADOW),
-				Display.getCurrent().getSystemColor(SWT.COLOR_DARK_GRAY) };
-		if (inset) {
-			rbColors = new Color[] { ColorConstants.buttonLightest,
-					ColorConstants.button };
-		}
-		for (int i = 0; i < thick; i++) {
-			g.setForegroundColor(rbColors[ltColors.length * i / thick]);
-			g.drawLine(left + i, top - i + height - 1, left + width - 1 - i,
-					top - i + height - 1);
-			g.drawLine(left + width - 1 - i, top + i, left + width - 1 - i, top
-					+ height - 1 - i);
-		}
-	}
-
-	/**
-	 * @param g
-	 * @param scrollWidth
-	 * @param rect
-	 * @param style
-	 */
-	public static void drawScrollBar(Graphics g, int scrollWidth,
-			Rectangle rect, int style) {
-		drawScrollBar(g, scrollWidth, BORDER_THICK, rect, style);
-	}
-
-	/**
-	 * @param g
-	 * @param scrollWidth
-	 * @param borderThick
-	 * @param rect
-	 * @param style
-	 */
-	public static void drawScrollBar(Graphics g, int scrollWidth,
-			int borderThick, Rectangle rect, int style) {
-		if (style == BOTH) {
-			int width = scrollWidth;
-			int left = rect.x + rect.width - width;
-			int top = rect.y;
-			int height = rect.height;
-			Rectangle barRect = new Rectangle(left, top, width, height);
-			fillBar(g, barRect);
-			barRect = new Rectangle(left, top, width, height - scrollWidth);
-			drawVerticalPart(g, scrollWidth, borderThick, barRect);
-
-			left = rect.x + borderThick;
-			top = top + height - scrollWidth;
-			width = rect.width;
-			height = scrollWidth;
-			barRect = new Rectangle(left, top, width, height);
-			fillBar(g, barRect);
-			barRect = new Rectangle(left, top, width - scrollWidth - 2, height);
-			drawHorizontalPart(g, scrollWidth, borderThick, barRect);
-		} else if (style == VERTICAL_BAR) {
-			int width = scrollWidth;
-			int left = rect.x + rect.width - width;
-			int top = rect.y;
-			int height = rect.height;
-			Rectangle barRect = new Rectangle(left, top, width, height);
-			fillBar(g, barRect);
-			drawVerticalPart(g, scrollWidth, borderThick, barRect);
-		} else if (style == HORIZONTAL_BAR) {
-			int left = rect.x + borderThick;
-			int top = rect.y + rect.height - scrollWidth;
-			int width = rect.width;
-			int height = scrollWidth;
-			Rectangle barRect = new Rectangle(left, top, width, height);
-			fillBar(g, barRect);
-			drawHorizontalPart(g, scrollWidth, borderThick, barRect);
-		}
-	}
-
-	private static void fillBar(Graphics g, Rectangle rect) {
-		g.setBackgroundColor(ColorConstants.button);
-		g.fillRectangle(rect);
-	}
-
-	private static void drawVerticalPart(Graphics g, int arrawLength,
-			int borderThick, Rectangle rect) {
-		int left = rect.x;
-		int top = rect.y;
-		int width = Math.min(arrawLength, rect.width);
-		int height = Math.min(arrawLength, rect.height / 2);
-
-		Rectangle borderRect = new Rectangle(left, top, width, height);
-		BorderUtil.drawBorder(g, borderRect, borderThick, false);
-
-		g.setForegroundColor(ColorConstants.black);
-		int decoratorWidth = (width - borderThick * 2) / 2;
-		int length = decoratorWidth / 2 + 1;
-		int leftX = rect.x + (width - decoratorWidth) / 2 - 1;
-		int bottomY = rect.y + (height + length) / 2 - 1;
-		for (int i = 0; i < length; i++) {
-			g.drawLine(leftX + i, bottomY - i, leftX - i + decoratorWidth,
-					bottomY - i);
-		}
-
-		top = rect.y + rect.height - height;
-		borderRect = new Rectangle(left, top, width, height);
-		BorderUtil.drawBorder(g, borderRect, borderThick, false);
-
-		int topY = top + (height - length) / 2;
-		g.setForegroundColor(ColorConstants.black);
-		for (int i = 0; i < length; i++) {
-			g.drawLine(leftX + i, topY + i, leftX - i + decoratorWidth, topY
-					+ i);
-		}
-	}
-
-	private static void drawHorizontalPart(Graphics g, int arrawLength,
-			int borderThick, Rectangle rect) {
-		int left = rect.x;
-		int top = rect.y;
-		int width = Math.min(arrawLength, rect.width / 2);
-		int height = Math.min(arrawLength, rect.height);
-
-		Rectangle borderRect = new Rectangle(left, top, width, height);
-		BorderUtil.drawBorder(g, borderRect, borderThick, false);
-
-		g.setForegroundColor(ColorConstants.black);
-		int decoratorHeight = (height - borderThick * 2) / 2;
-		int length = decoratorHeight / 2 + 1;
-		int leftX = rect.x + (width + length) / 2 - 1;
-		int bottomY = rect.y + (height - length) / 2 - 1;
-		for (int i = 0; i < length; i++) {
-			g.drawLine(leftX - i, bottomY + i, leftX - i, bottomY - i
-					+ decoratorHeight);
-		}
-
-		left = rect.x + rect.width - width;
-		borderRect = new Rectangle(left, top, width, height);
-		BorderUtil.drawBorder(g, borderRect, borderThick, false);
-
-		leftX = left + (width - length) / 2;
-		g.setForegroundColor(ColorConstants.black);
-		for (int i = 0; i < length; i++) {
-			g.drawLine(leftX + i, bottomY + i, leftX + i, bottomY - i
-					+ decoratorHeight);
-		}
-	}
-
-	/**
-	 * @param g
-	 * @param arrawWidth
-	 * @param arrawHeight
-	 * @param borderThick
-	 * @param rect
-	 */
-	public static void drawVertialBar(Graphics g, int arrawWidth,
-			int arrawHeight, int borderThick, Rectangle rect) {
-		drawScrollBar(g, arrawWidth, borderThick, rect, VERTICAL_BAR);
-	}
-
-	/**
-	 * @param figure
-	 * @param graphics
-	 */
-	public static void drawBorderDecorator(CSSFigure figure, Graphics graphics) {
-		graphics.setLineWidth(1);
-		graphics.setLineStyle(Graphics.LINE_DASH);
-		graphics.setForegroundColor(ColorConstants.lightGray);
-		List fragments = figure.getFragmentsForRead();
-		for (int i = 0, size = fragments.size(); i < size; i++) {
-			FlowBox box = (FlowBox) fragments.get(i);
-			// XXX: why -1?
-			graphics.drawRectangle(box.getX(), box.getY(), box.getWidth() - 1, box
-					.getHeight() - 1);
-		}
-		graphics.restoreState();
-	}
-
-	/**
-	 * @param figure
-	 * @param g
-	 */
-	public static void maskFigure(CSSFigure figure, Graphics g) {
-		List fragments = figure.getFragmentsForRead();
-		for (int i = 0, size = fragments.size(); i < size; i++) {
-			FlowBox box = (FlowBox) fragments.get(i);
-			maskRectangle(g, new Rectangle(box.getX(), box.getY(), box.getWidth(), box
-					.getHeight()), null);
-		}
-	}
-	
-	private BorderUtil()
-	{
-	    // util class, no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/ButtonWidgetProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/ButtonWidgetProvider.java
deleted file mode 100644
index 98bfaf9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/ButtonWidgetProvider.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.widget;
-
-import java.util.StringTokenizer;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.font.ICSSFont;
-import org.eclipse.jst.pagedesigner.css2.layout.TextLayoutSupport;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyMeta;
-import org.eclipse.jst.pagedesigner.css2.provider.DimensionInfo;
-import org.eclipse.jst.pagedesigner.css2.style.DefaultStyle;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * For ButtonWidget, it displays some text value in it. And lays the text with
- * nowrap.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class ButtonWidgetProvider extends AbstractWidgetProvider {
-	// The button width should include the label length and padding,
-	// to let the button looks fine, we set the padding 0.46 width as the label
-	// length.
-	private final static double HORIZONTAL_RATE = 1.46;
-
-	// The button height should include the label height and padding,
-	// to let the button looks fine, we set the padding 0.36 height as the
-	// character height.
-	private final static double VERTICAL_PADDING_RATE = 0.36;
-
-	private static final String[] DEFAULTLINES = new String[] { "  " };
-
-	private String _value = "";
-
-	private String[] _lines = DEFAULTLINES;
-
-	/**
-	 * @param style
-	 */
-	public ButtonWidgetProvider(ICSSStyle style) {
-		super(style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#getPreferredDimension(int,
-	 *      int)
-	 */
-	public DimensionInfo getPreferredDimension(int width, int height) {
-		if (width <= 0) {
-			width = getDefaultWidth();
-		}
-		if (height <= 0) {
-			height = getDefaultHeight();
-		}
-		return new DimensionInfo(new Dimension(width, height), -1);
-	}
-
-	/**
-	 * by default, the combo's width will be calculated from the longest option
-	 * value.
-	 * 
-	 * @return the default width value
-	 */
-	public int getDefaultWidth() {
-		int longestStringWidth = 0;
-		if (_lines != null) {
-			ICSSStyle style = this.getCSSStyle();
-			if (style == null) {
-				style = DefaultStyle.getInstance();
-			}
-			ICSSFont font = style.getCSSFont();
-			Font swtFont = font.getSwtFont();
-			for (int i = 0; i < _lines.length; i++) {
-				int width = FigureUtilities.getTextWidth(_lines[i], swtFont);
-				if (width > longestStringWidth) {
-					longestStringWidth = width;
-				}
-			}
-		}
-		// text area width + padding
-		return (int) ((longestStringWidth) * HORIZONTAL_RATE);
-	}
-
-	/**
-	 * 
-	 * @return the default height value
-	 * @see TextInputWidgetProvider#getDefaultHeight()
-	 */
-	public int getDefaultHeight() {
-		ICSSStyle style = this.getCSSStyle();
-		if (style == null) {
-			style = DefaultStyle.getInstance();
-		}
-		ICSSFont font = style.getCSSFont();
-		Font swtfont = font.getSwtFont();
-		int fontHeight = FigureUtilities.getFontMetrics(swtfont).getHeight();
-		return (int) ((fontHeight) * (_lines.length + VERTICAL_PADDING_RATE));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#paintFigure(org.eclipse.draw2d.Graphics,
-	 *      org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void paintFigure(Graphics g, Rectangle rect) {
-		ICSSStyle style = this.getCSSStyle();
-		if (style == null) {
-			style = DefaultStyle.getInstance();
-		}
-		Object textAlign = style
-				.getStyleProperty(ICSSPropertyID.ATTR_TEXTALIGN);
-		if (ICSSPropertyMeta.NOT_SPECIFIED == textAlign) {
-			textAlign = "center";
-		}
-		Font font = style.getCSSFont().getSwtFont();
-		g.setFont(font);
-		int fontHeight = FigureUtilities.getFontMetrics(font).getHeight();
-
-		Color newColor = null;
-		Object color = style.getColor();
-		if (color instanceof Color) {
-			g.setForegroundColor((Color) color);
-		} else if (color instanceof RGB) {
-			newColor = new Color(Display.getCurrent(), (RGB) color);
-			g.setForegroundColor(newColor);
-		} else {
-			g.setForegroundColor(ColorConstants.black);
-		}
-
-		g.clipRect(rect);
-
-		int y = rect.y + (int) (fontHeight * VERTICAL_PADDING_RATE / 2);
-		if (rect.height > fontHeight * _lines.length) {
-			y = rect.y + (rect.height - fontHeight * _lines.length) / 2;
-		}
-
-		for (int i = 0; i < _lines.length && y < rect.y + rect.height; i++) {
-			int width = FigureUtilities.getTextWidth(_lines[i], font);
-			int x = TextLayoutSupport.getBeginX(textAlign, rect, width);
-			g.drawString(_lines[i], x, y);
-			TextLayoutSupport.paintTextDecoration(g, new Rectangle(x, y, width,
-					fontHeight), ((Integer) getCSSStyle().getStyleProperty(
-					ICSSPropertyID.ATTR_TEXTDECORATION)).intValue());
-			y += fontHeight;
-		}
-
-		if (newColor != null) {
-			newColor.dispose();
-		}
-	}
-
-	/**
-	 * @param value
-	 */
-	public void setValue(String value) {
-		if (value == null) {
-			value = "";
-		}
-		_value = value;
-		_lines = splitValue(_value);
-	}
-
-	/**
-	 * Split the value to multiple lines.
-	 * 
-	 * @param _value2
-	 * @return
-	 */
-	private String[] splitValue(String _value2) {
-		if (_value2 == null || "".equals(_value2)) {
-			return DEFAULTLINES;
-		}
-
-		StringTokenizer tokenizer = new StringTokenizer(_value2, "\r\n");
-		String[] result = new String[tokenizer.countTokens()];
-		for (int i = 0; i < result.length; i++) {
-			result[i] = tokenizer.nextToken().replaceAll("\t", "    ");
-		}
-		return result;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/CheckboxWidgetProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/CheckboxWidgetProvider.java
deleted file mode 100644
index 54e319e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/CheckboxWidgetProvider.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.widget;
-
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.provider.DimensionInfo;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class CheckboxWidgetProvider extends AbstractWidgetProvider {
-	private boolean isChecked;
-
-	/**
-	 * @param style
-	 */
-	public CheckboxWidgetProvider(ICSSStyle style) {
-		super(style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#getPreferredDimension(int,
-	 *      int)
-	 */
-	public DimensionInfo getPreferredDimension(int width, int height) {
-		if (width <= 0) {
-			width = getDefaultWidth();
-		}
-		if (height <= 0) {
-			height = getDefaultWidth();
-		}
-		return new DimensionInfo(new Dimension(width, height), height * 4 / 5);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#paintFigure(org.eclipse.draw2d.Graphics,
-	 *      org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void paintFigure(Graphics g, Rectangle rect) {
-		int centerX = rect.x + rect.width / 2;
-		int centerY = rect.y + rect.height / 2;
-
-		// we always draw it as a square.
-		int width = Math.min(rect.width, rect.height);
-		int innerWidth = width * 4 / 5;
-
-		int left = centerX - innerWidth / 2;
-		int top = centerY - innerWidth / 2;
-		BorderUtil.drawBorder(g, left, top, innerWidth, innerWidth, 2, true);
-		if (isChecked()) {
-			g.pushState();
-			Display display = Display.getCurrent();
-			g.setForegroundColor(display.getSystemColor(SWT.COLOR_BLACK));
-			g.drawLine(left + 3, top + 2, left + innerWidth - 3, top
-					+ innerWidth - 4);
-			g.drawLine(left + 2, top + 2, left + innerWidth - 3, top
-					+ innerWidth - 3);
-
-			g.drawLine(left + innerWidth - 4, top + 2, left + 2, top
-					+ innerWidth - 4);
-			g.drawLine(left + innerWidth - 3, top + 2, left + 2, top
-					+ innerWidth - 3);
-			g.popState();
-		}
-	}
-
-	/**
-	 * @return the default width
-	 */
-	private int getDefaultWidth() {
-		// FIXME: don't know the how to define the default width yet.
-		return 15;
-	}
-
-	/**
-	 * @return Returns the checked.
-	 */
-	public boolean isChecked() {
-		return isChecked;
-	}
-
-	/**
-	 * @param checked
-	 */
-	public void setChecked(boolean checked) {
-		this.isChecked = checked;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/ComboWidgetProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/ComboWidgetProvider.java
deleted file mode 100644
index 645ac6f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/ComboWidgetProvider.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.widget;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.font.ICSSFont;
-import org.eclipse.jst.pagedesigner.css2.provider.DimensionInfo;
-import org.eclipse.jst.pagedesigner.css2.style.DefaultStyle;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ComboWidgetProvider extends AbstractWidgetProvider {
-	private static final int VERTICAL_PADDING = 6;
-
-	private static final int HORIZONTAL_PADDING = 12;
-
-	private static int ARRAWWIDTH = 16;
-
-	//private static int ARROWHEIGHT = 16;
-
-	private String _firstString;
-
-	private String _longestString;
-
-	private String _label;
-
-	/**
-	 * @param style
-	 */
-	public ComboWidgetProvider(ICSSStyle style) {
-		super(style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#getPreferredDimension(int,
-	 *      int)
-	 */
-	public DimensionInfo getPreferredDimension(int width, int height) {
-		if (width <= 0) {
-			width = getDefaultWidth();
-
-		}
-		if (height <= 0) {
-			height = getDefaultHeight();
-		}
-		return new DimensionInfo(new Dimension(width, height), -1);
-	}
-
-	/**
-	 * by default, the combo's width will be calculated from the longest option
-	 * value.
-	 * 
-	 * @return the default width
-	 */
-	private int getDefaultWidth() {
-		int textareaWidth;
-		if (this._longestString == null || this._longestString.length() == 0) {
-			textareaWidth = 20;
-		} else {
-			ICSSStyle style = this.getCSSStyle();
-			if (style == null) {
-				style = DefaultStyle.getInstance();
-			}
-			ICSSFont font = style.getCSSFont();
-
-			textareaWidth = FigureUtilities.getTextWidth(_longestString, font
-					.getSwtFont());
-		}
-		return textareaWidth + ARRAWWIDTH + HORIZONTAL_PADDING;
-	}
-
-	/**
-	 * 
-	 * @return the default height
-	 * @see TextInputWidgetProvider#getDefaultHeight()
-	 */
-	public int getDefaultHeight() {
-		ICSSStyle style = this.getCSSStyle();
-		if (style == null) {
-			style = DefaultStyle.getInstance();
-		}
-		ICSSFont font = style.getCSSFont();
-		Font swtfont = font.getSwtFont();
-		int fontSize = FigureUtilities.getFontMetrics(swtfont).getHeight();
-		return fontSize + VERTICAL_PADDING;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#paintFigure(org.eclipse.draw2d.Graphics,
-	 *      org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void paintFigure(Graphics g, Rectangle rect) {
-		if (this._firstString != null) {
-			ICSSStyle style = this.getCSSStyle();
-			if (style == null) {
-				style = DefaultStyle.getInstance();
-			}
-			ICSSFont font = style.getCSSFont();
-			g.setFont(font.getSwtFont());
-
-			Color newColor = null;
-			Object color = style.getColor();
-			if (color instanceof Color) {
-				g.setForegroundColor((Color) color);
-			} else if (color instanceof RGB) {
-				newColor = new Color(Display.getCurrent(), (RGB) color);
-				g.setForegroundColor(newColor);
-			} else {
-				g.setForegroundColor(ColorConstants.black);
-			}
-			g.clipRect(rect);
-			String label = _label != null ? _label : _firstString;
-			label = label.replaceAll("[ \r\n]+", " ");
-			if (label.endsWith(" ")) {
-				label = label.substring(0, label.length() - 1);
-			}
-			g.drawString(label, rect.x + HORIZONTAL_PADDING / 2, rect.y
-					+ VERTICAL_PADDING / 2);
-			if (newColor != null) {
-				newColor.dispose();
-			}
-
-		}
-
-		BorderUtil.drawBorder(g, rect.x, rect.y, rect.width, rect.height,
-				BORDERTHICK, true);
-		// next the drop down button
-		int width = ARRAWWIDTH;
-		int left = rect.x + rect.width - width - BORDERTHICK;
-		int top = rect.y + BORDERTHICK;
-		int height = rect.height - BORDERTHICK * 2;
-		g.setBackgroundColor(ColorConstants.button);
-		g.fillRectangle(left, top, width, height);
-
-		Rectangle borderRect = new Rectangle(left, top, width, height);
-		BorderUtil.drawBorder(g, borderRect.x, borderRect.y, borderRect.width,
-				borderRect.height, BORDERTHICK, false);
-
-		g.setForegroundColor(ColorConstants.black);
-
-		int decoratorWidth = (width - BORDERTHICK * 2) / 2;
-		int length = decoratorWidth / 2 + 1;
-		int leftX = left + (width - decoratorWidth) / 2 - 1;
-		int topY = top + (height - length) / 2 + 1;
-		for (int i = 0; i < length; i++) {
-			g.drawLine(leftX + i, topY + i, leftX - i + decoratorWidth, topY
-					+ i);
-		}
-	}
-
-	/**
-	 * set the options to be displayed in this combo box. Will calculate out the
-	 * first string and the longest string.
-	 * 
-	 * @param options
-	 */
-	public void setOptions(String[] options) {
-		if (options == null || options.length == 0) {
-			this._firstString = null;
-			this._longestString = null;
-		} else {
-			this._firstString = options[0];
-			this._longestString = (options[0] == null ? "" : options[0]);
-			for (int i = 1; i < options.length; i++) {
-				if (options[i] == null) {
-					continue;
-				}
-				if (options[i].length() > this._longestString.length()) {
-					this._longestString = options[i];
-				}
-			}
-		}
-	}
-
-	/**
-	 * @param label
-	 */
-	public void setSelectedLabel(String label) {
-		this._label = label;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#isHandlingBorder()
-	 */
-	public boolean isHandlingBorder() {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/HiddenProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/HiddenProvider.java
deleted file mode 100644
index 965d7ac..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/HiddenProvider.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.widget;
-
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.jst.pagedesigner.css2.provider.DimensionInfo;
-import org.eclipse.jst.pagedesigner.css2.style.HiddenElementStyle;
-import org.eclipse.jst.pagedesigner.parts.EditProxyAdapter;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Display;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class HiddenProvider extends ImageWidgetProvider {
-	private final static int GAP = 3;
-
-	private String _label = null;
-
-	private boolean _labelVisible = true;
-
-	private FontMetrics _fontMetrics;
-    
-	/**
-	 * @param image
-	 * @param convertedElement 
-	 */
-	public HiddenProvider(Image image, Element convertedElement) {
-		super(image, new HiddenElementStyle(convertedElement));
-	}
-
-	/**
-	 * @param image
-	 * @param editPart
-	 */
-	public HiddenProvider(Image image, ElementEditPart editPart) {
-		super(image, new HiddenElementStyle(new EditProxyAdapter(editPart)));
-	}
-
-	// public HiddenProvider(Image image, String label)
-	// {
-	// this(image);
-	// this._label = label;
-	// }
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#getPreferredDimension(int,
-	 *      int)
-	 */
-	public DimensionInfo getPreferredDimension(int width, int height) {
-		int preWidth = width;
-		int preHeight = height;
-		_fontMetrics = getFontMetrics();
-		if (width <= 0) {
-			preWidth = getLabelWidth() + _imageWidth;
-		}
-		if (height <= 0) {
-			preHeight = Math.max(getLabelHeight(), _imageHeight);
-		}
-		return new DimensionInfo(preWidth, preHeight, -1);
-	}
-
-	private FontMetrics getFontMetrics() {
-		Font swtfont = Display.getCurrent().getSystemFont();
-		return FigureUtilities.getFontMetrics(swtfont);
-	}
-
-	private int getLabelHeight() {
-		if (_labelVisible && (_label != null) && (!_label.equals(""))
-				&& (_fontMetrics != null)) {
-			return _fontMetrics.getHeight();
-		}
-		return 0;
-	}
-
-	/**
-	 * @return the label width
-	 */
-	public int getLabelWidth() {
-		if (_labelVisible && _label != null && !_label.equals("")
-				&& _fontMetrics != null) {
-			Font swtfont = Display.getCurrent().getSystemFont();
-			return FigureUtilities.getTextWidth(_label, swtfont) + GAP;
-		}
-		return 0;
-	}
-
-	public void paintFigure(Graphics g,
-			org.eclipse.draw2d.geometry.Rectangle rect) {
-		g.fillRectangle(rect);
-		g.setClip(rect);
-		int imageAreaWidth = Math.min(rect.width, _imageWidth);
-		int imageAreaHeight = Math.min(rect.height, _imageHeight);
-		if (_image != null && !_image.isDisposed()) {
-			g.drawImage(_image, 0, 0, _imageWidth, _imageHeight, rect.x, rect.y
-					+ (rect.height - imageAreaHeight) / 2, imageAreaWidth,
-					imageAreaHeight);
-		}
-		if (_label != null && _labelVisible) {
-			int leading = 0;
-			if (_fontMetrics != null) {
-				leading = _fontMetrics.getLeading();
-			}
-            // TODO: adapt to bg: go lighter on colors that darker() would make black
-			// TODO: color registry
-            Color fg = FigureUtilities.darker(g.getBackgroundColor());
-            g.setForegroundColor(fg);
-            g.drawString(_label, imageAreaWidth + GAP, rect.y
-					+ (rect.height - getLabelHeight()) / 2 + leading);
-            fg.dispose();
-		}
-	}
-
-	/**
-	 * @return the label text
-	 */
-	public String getLabel() {
-		return _label;
-	}
-
-	/**
-	 * @param label
-	 */
-	public void setLabel(String label) {
-		this._label = label;
-	}
-
-	/**
-	 * @return whether the label is visible
-	 */
-	public boolean isLabelVisible() {
-		return _labelVisible;
-	}
-
-	/**
-	 * @param labelVisible
-	 */
-	public void setLabelVisible(boolean labelVisible) {
-		this._labelVisible = labelVisible;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/ImageWidgetProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/ImageWidgetProvider.java
deleted file mode 100644
index 03d41b8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/ImageWidgetProvider.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.widget;
-
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.provider.DimensionInfo;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @author mengbo
- */
-public class ImageWidgetProvider extends AbstractWidgetProvider {
-	private static final String NOPIC_IMAGE_NAME = "PD_nopic.jpg";
-
-	private static Image _noPicImage;
-
-	private static int _noPicWidth;
-
-	private static int _noPicHeight;
-
-	/**
-	 * the image
-	 */
-	protected Image _image;
-
-	/**
-	 * image width
-	 */
-	protected int _imageWidth;
-
-	/**
-	 * image height
-	 */
-	protected int _imageHeight;
-
-	/**
-	 * @param image
-	 * @param style
-	 */
-	public ImageWidgetProvider(Image image, ICSSStyle style) {
-		super(style);
-
-		// set up image and image width/height
-		org.eclipse.swt.graphics.Rectangle rect = null;
-		if (image != null) {
-			rect = image.getBounds();
-			if (rect.width <= 0 || rect.height <= 0) {
-				useNoPicImage();
-			} else {
-				_image = image;
-				_imageWidth = rect.width;
-				_imageHeight = rect.height;
-			}
-		} else {
-			useNoPicImage();
-		}
-	}
-
-	/**
-	 * 
-	 */
-	private void useNoPicImage() {
-		if (_noPicImage == null || _noPicImage.isDisposed()) {
-			ImageDescriptor noPicImageDesc = PDPlugin.getDefault()
-					.getImageDescriptor(NOPIC_IMAGE_NAME);
-			_noPicImage = noPicImageDesc.createImage();
-			org.eclipse.swt.graphics.Rectangle rect = _noPicImage.getBounds();
-			_noPicWidth = rect.width;
-			_noPicHeight = rect.height;
-		}
-		_image = _noPicImage;
-		_imageWidth = _noPicWidth;
-		_imageHeight = _noPicHeight;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#getPreferredDimension(int,
-	 *      int)
-	 */
-	public DimensionInfo getPreferredDimension(int width, int height) {
-		if (width <= 0 && height <= 0) {
-			// we are free, so use image size
-			org.eclipse.swt.graphics.Rectangle a = _image.getBounds();
-			return new DimensionInfo(a.width, a.height, -1);
-		} else if (width > 0 && height > 0) {
-			return new DimensionInfo(width, height, -1);
-		} else if (height > 0) {
-			width = (int) ((double) _imageWidth * height / _imageHeight);
-			return new DimensionInfo(width, height, -1);
-		} else {
-			height = (int) ((double) _imageHeight * width / _imageWidth);
-			return new DimensionInfo(width, height, -1);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#paintFigure(org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void paintFigure(Graphics g, Rectangle rect) {
-		if (_image != null) {
-			g.drawImage(_image, 0, 0, _imageWidth, _imageHeight, rect.x,
-					rect.y, rect.width, rect.height);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/InputFileWidgetProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/InputFileWidgetProvider.java
deleted file mode 100644
index af8704d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/InputFileWidgetProvider.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.widget;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.border.CSSBorder;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.provider.DimensionInfo;
-import org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider;
-import org.eclipse.jst.pagedesigner.editors.pagedesigner.MessageFormater;
-
-/**
- * @author mengbo
- */
-public class InputFileWidgetProvider extends AbstractWidgetProvider {
-	private static final String BODER_QUERY_TEMPLETE = "border-{0}-style";
-
-	private static final int GAP = 2;
-
-	private ICSSWidgetProvider _sub1;
-
-	private ICSSWidgetProvider _sub2;
-
-	/**
-	 * @param style
-	 * @param sub1 
-	 * @param sub2 
-	 */
-	public InputFileWidgetProvider(ICSSStyle style, ICSSWidgetProvider sub1,
-			ICSSWidgetProvider sub2) {
-		super(style);
-		_sub1 = sub1;
-		_sub2 = sub2;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#getPreferredDimension(int,
-	 *      int)
-	 */
-	public DimensionInfo getPreferredDimension(int width, int height) {
-		Insets borderInset = new Insets();
-		Insets borderPaddingInset = new Insets();
-		ICSSStyle style = getCSSStyle();
-		if (style != null) {
-			borderInset = style.getBorderInsets();
-			borderPaddingInset = borderInset.getAdded(style.getPaddingInsets());
-		}
-
-		Dimension d1 = _sub1.getPreferredDimension(-1, -1).getDimension();
-		Dimension d2 = _sub2.getPreferredDimension(-1, -1).getDimension();
-
-		int minWidth = d2.width + 2 * (borderInset.left + borderInset.right)
-				+ GAP;
-		int prefWidth = d1.width + d2.width + 2
-				* (borderPaddingInset.left + borderPaddingInset.right) + GAP;
-		int minHeight = borderInset.top + borderInset.bottom;
-		int prefHeight = Math.max(d1.height, d2.height)
-				+ borderPaddingInset.top + borderPaddingInset.bottom;
-
-		if (width > 0 && minWidth > width) {
-			prefWidth = minWidth;
-		} else if (width != 0) {
-			prefWidth = width;
-		}
-
-		if (height > 0 && minHeight > height) {
-			prefHeight = minHeight;
-		} else if (height != 0) {
-			prefHeight = height;
-		}
-		return new DimensionInfo(prefWidth, prefHeight, -1);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#paintFigure(org.eclipse.draw2d.Graphics,
-	 *      org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void paintFigure(Graphics g, Rectangle rect) {
-		Rectangle rect1, rect2;
-
-		Insets borderInset = new Insets();
-		Insets paddingInset = new Insets();
-		Insets borderPaddingInset = new Insets();
-		ICSSStyle style = getCSSStyle();
-		if (style != null) {
-			borderInset = style.getBorderInsets();
-			paddingInset = style.getPaddingInsets();
-			borderPaddingInset.add(borderInset).add(paddingInset);
-		}
-
-		Dimension d1 = _sub1.getPreferredDimension(-1, -1).getDimension();
-		Dimension d2 = _sub2.getPreferredDimension(-1, -1).getDimension();
-		int prefWidth = d1.width + d2.width + 2 * borderPaddingInset.left + 2
-				* borderPaddingInset.right + GAP;
-		if (rect.width < prefWidth) {
-			paddingInset.left = 0;
-			paddingInset.right = 0;
-		}
-		int prefHeight = Math.max(d1.height, d2.height)
-				+ borderPaddingInset.top + borderPaddingInset.bottom;
-		if (rect.height < prefHeight) {
-			paddingInset.top = 0;
-			paddingInset.bottom = 0;
-		}
-
-		int width = rect.width
-				- d2.width
-				- (borderInset.left + borderInset.right + paddingInset.left + paddingInset.right)
-				- GAP;
-		rect1 = new Rectangle(rect.x - 1, rect.y, width, rect.height);
-		rect2 = new Rectangle(rect.x + rect1.width + 2, rect.y, rect.width
-				- rect1.width - 3, rect.height);
-		Rectangle innerRect1 = rect1.getCopy().crop(borderInset);
-		Rectangle innerRect2 = rect2.getCopy().crop(borderInset);
-
-		g.pushState();
-		g.setBackgroundColor(ColorConstants.button);
-		g.fillRectangle(innerRect2);
-		g.popState();
-
-		CSSBorder cssBorder = new CSSBorder(style);
-		String[] edges = new String[] { ICSSStyle.LEFT, ICSSStyle.RIGHT,
-				ICSSStyle.TOP, ICSSStyle.BOTTOM };
-		for (int i = 0; i < edges.length; i++) {
-			cssBorder.paintEdge(g, rect1, innerRect1, edges[i],
-					getBorderStyle(edges[i]));
-		}
-		for (int i = 0; i < edges.length; i++) {
-			String borderStyle = getBorderStyle(edges[i]);
-			if (ICSSPropertyID.VAL_INSET.equals(borderStyle)) {
-				borderStyle = ICSSPropertyID.VAL_OUTSET;
-			}
-			cssBorder.paintEdge(g, rect2, innerRect2, edges[i], borderStyle);
-		}
-
-		_sub2.paintFigure(g, innerRect2.getCopy().crop(paddingInset));
-		// _sub1.paintFigure(g, innerRect1.crop(paddingInset));
-	}
-
-	private String getBorderStyle(String edge) {
-		ICSSStyle style = getCSSStyle();
-		if (style != null) {
-			String property = MessageFormater
-					.format(BODER_QUERY_TEMPLETE, edge);
-			String borderStyle = style.getStyleProperty(property).toString();
-			return borderStyle;
-		}
-		return ICSSPropertyID.VAL_HIDDEN;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#isHandlingBorder()
-	 */
-	public boolean isHandlingBorder() {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/ListWidgetProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/ListWidgetProvider.java
deleted file mode 100644
index 23cee34..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/ListWidgetProvider.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.widget;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.font.ICSSFont;
-import org.eclipse.jst.pagedesigner.css2.provider.DimensionInfo;
-import org.eclipse.jst.pagedesigner.css2.style.DefaultStyle;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ListWidgetProvider extends AbstractWidgetProvider {
-	private static int DEFAULTSIZE = 4;
-
-	private static final int VERTICAL_PADDING = 6;
-
-	private static final int HORIZONTAL_PADDING = 12;
-
-	private static int ARRAWWIDTH = 16;
-
-	private static int ARROWHEIGHT = 16;
-
-	private String[] _options;
-
-	private int _rows = DEFAULTSIZE;
-
-	/**
-	 * @param style
-	 */
-	public ListWidgetProvider(ICSSStyle style) {
-		super(style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#getPreferredDimension(int,
-	 *      int)
-	 */
-	public DimensionInfo getPreferredDimension(int width, int height) {
-		if (width <= 0) {
-			width = getDefaultWidth();
-		}
-		if (height <= 0) {
-			height = getDefaultHeight();
-		}
-		return new DimensionInfo(width, height, -1);
-	}
-
-	/**
-	 * by default, the combo's width will be calculated from the longest option
-	 * value.
-	 * 
-	 * @return the default width
-	 */
-	public int getDefaultWidth() {
-		int longestStringWidth = 0;
-		if (_options != null) {
-			ICSSStyle style = this.getCSSStyle();
-			if (style == null) {
-				style = DefaultStyle.getInstance();
-			}
-			ICSSFont font = style.getCSSFont();
-			Font swtFont = font.getSwtFont();
-			for (int i = 0; i < _options.length; i++) {
-				int width = FigureUtilities.getTextWidth(_options[i], swtFont);
-				if (width > longestStringWidth) {
-					longestStringWidth = width;
-				}
-			}
-		}
-		// text area width + borderWidth + vertical scroll width
-		return (longestStringWidth) + HORIZONTAL_PADDING + ARRAWWIDTH;
-	}
-
-	/**
-	 * 
-	 * @return the default height
-	 * @see TextInputWidgetProvider#getDefaultHeight()
-	 */
-	public int getDefaultHeight() {
-		ICSSStyle style = this.getCSSStyle();
-		if (style == null) {
-			style = DefaultStyle.getInstance();
-		}
-		ICSSFont font = style.getCSSFont();
-		Font swtfont = font.getSwtFont();
-		int fontHeight = FigureUtilities.getFontMetrics(swtfont).getHeight();
-		return (fontHeight) * _rows + VERTICAL_PADDING;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#paintFigure(org.eclipse.draw2d.Graphics,
-	 *      org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void paintFigure(Graphics g, Rectangle rect) {
-		BorderUtil.drawBorder(g, rect.x, rect.y, rect.width, rect.height,
-				BORDERTHICK, true);
-		if (_options != null) {
-			ICSSStyle style = this.getCSSStyle();
-			if (style == null) {
-				style = DefaultStyle.getInstance();
-			}
-			ICSSFont font = style.getCSSFont();
-			Font swtfont = font.getSwtFont();
-			g.setFont(swtfont);
-
-			Color newColor = null;
-			Object color = style.getColor();
-			if (color instanceof Color) {
-				g.setForegroundColor((Color) color);
-			} else if (color instanceof RGB) {
-				newColor = new Color(Display.getCurrent(), (RGB) color);
-				g.setForegroundColor(newColor);
-			} else {
-				g.setForegroundColor(ColorConstants.black);
-			}
-			int fontHeight = FigureUtilities.getFontMetrics(swtfont)
-					.getHeight();
-			int x = rect.x + HORIZONTAL_PADDING / 2;
-			int y = rect.y + VERTICAL_PADDING / 2;
-
-			g.clipRect(rect);
-			for (int i = 0; i < _options.length
-					&& (i * fontHeight < rect.height - VERTICAL_PADDING); i++) {
-				g.drawString(_options[i], x, y);
-				y += fontHeight;
-			}
-			if (newColor != null) {
-				newColor.dispose();
-			}
-
-			int borderThick = 2;
-			Rectangle barRect = new Rectangle(rect.x, rect.y + borderThick,
-					rect.width - borderThick, rect.height - 2 * borderThick);
-			BorderUtil.drawVertialBar(g, ARRAWWIDTH, ARROWHEIGHT, borderThick,
-					barRect);
-		}
-	}
-
-	/**
-	 * @param string
-	 * @param x
-	 * @param y
-	 * @return
-	 */
-	private String normalize(String string) {
-		if (string == null) {
-			return "";
-		}
-		int index = string.indexOf('\r');
-		if (index >= 0) {
-			string = string.substring(0, index);
-		}
-		index = string.indexOf('\n');
-		if (index >= 0) {
-			string = string.substring(0, index);
-		}
-		return string;
-	}
-
-	/**
-	 * set the options to be displayed in this combo box.
-	 * 
-	 * @param options
-	 */
-	public void setOptions(String[] options) {
-		this._options = options;
-		if (_options != null) {
-			for (int i = 0; i < _options.length; i++) {
-				_options[i] = normalize(_options[i]);
-			}
-		}
-	}
-
-	/**
-	 * set the default number of rows to be displayed.
-	 * 
-	 * @param rows
-	 */
-	public void setRows(int rows) {
-		_rows = (rows > 0 ? rows : DEFAULTSIZE);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#isHandlingBorder()
-	 */
-	public boolean isHandlingBorder() {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/RadioWidgetProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/RadioWidgetProvider.java
deleted file mode 100644
index 980171f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/RadioWidgetProvider.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.widget;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.provider.DimensionInfo;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class RadioWidgetProvider extends AbstractWidgetProvider {
-	private boolean isChecked;
-
-	/**
-	 * @param style
-	 */
-	public RadioWidgetProvider(ICSSStyle style) {
-		super(style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#getPreferredDimension(int,
-	 *      int)
-	 */
-	public DimensionInfo getPreferredDimension(int width, int height) {
-		if (width <= 0) {
-			width = getDefaultWidth();
-		}
-		if (height <= 0) {
-			height = getDefaultWidth();
-		}
-		return new DimensionInfo(width, height, height * 4 / 5);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#paintFigure(org.eclipse.draw2d.Graphics,
-	 *      org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void paintFigure(Graphics g, Rectangle rect) {
-		int centerX = rect.x + rect.width / 2;
-		int centerY = rect.y + rect.height / 2;
-
-		// we always draw it as a circle.
-		int width = Math.min(rect.width, rect.height);
-		int cycleWidth = width * 3 / 5;
-
-		// FIXME: when the size of the radio is big, the line width may need
-		// calculate to be bigger.
-		int lineWidth = 2;
-		g.setLineWidth(lineWidth);
-
-		g.setForegroundColor(ColorConstants.buttonDarker);
-		g.drawArc(centerX - cycleWidth / 2, centerY - cycleWidth + 1,
-				cycleWidth, cycleWidth, 45, 180);
-
-		g.setForegroundColor(ColorConstants.button);
-		g.drawArc(centerX - cycleWidth / 2, centerY - cycleWidth + 1,
-				cycleWidth, cycleWidth, 225, 180);
-
-		// since the two cycle may not overlap very well, some space between
-		// them will be displayed.
-		// so we make the bigger cycle to be a little thicker.
-		cycleWidth += (2 * lineWidth - 2);
-		lineWidth += 1;
-
-		if (cycleWidth < width) {
-			g.setForegroundColor(ColorConstants.buttonDarkest);
-			g.drawArc(centerX - cycleWidth / 2, centerY - cycleWidth + 1,
-					cycleWidth, cycleWidth, 45, 180);
-		}
-
-		if (isChecked()) {
-			g.setBackgroundColor(ColorConstants.black);
-			g.fillArc(centerX - 1, centerY - cycleWidth / 2 - 1, 4, 4, 0, 360);
-		}
-	}
-
-	/**
-	 * @return the default width
-	 */
-	public final int getDefaultWidth() {
-		// FIXME: don't know the how to define the default width yet.
-		return 15;
-	}
-
-	/**
-	 * @return Returns the checked.
-	 */
-	public boolean isChecked() {
-		return isChecked;
-	}
-
-	/**
-	 * @param checked
-	 */
-	public void setChecked(boolean checked) {
-		this.isChecked = checked;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/TextAreaWidgetProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/TextAreaWidgetProvider.java
deleted file mode 100644
index 77aea65..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/TextAreaWidgetProvider.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.widget;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.font.ICSSFont;
-import org.eclipse.jst.pagedesigner.css2.layout.TextLayoutSupport;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.provider.DimensionInfo;
-import org.eclipse.jst.pagedesigner.css2.style.DefaultStyle;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TextAreaWidgetProvider extends AbstractWidgetProvider {
-	private static final int DEFAULTCOLUMN = 20;
-
-	private static final int DEFAULTROWS = 2;
-
-	private static final int VERTICAL_PADDING = 2;
-
-	private static final int HORIZONTAL_PADDING = 2;
-
-	private static int ARRAWWIDTH = 16;
-
-	private static int ARROWHEIGHT = 16;
-
-	private int _columns = DEFAULTCOLUMN;
-
-	private int _rows = DEFAULTROWS;
-
-	private String _value;
-
-	/**
-	 * @param style
-	 */
-	public TextAreaWidgetProvider(ICSSStyle style) {
-		super(style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#getPreferredDimension(int,
-	 *      int)
-	 */
-	public DimensionInfo getPreferredDimension(int width, int height) {
-		if (width <= 0) {
-			width = getDefaultWidth();
-		}
-		if (height <= 0) {
-			height = getDefaultHeight();
-		}
-		return new DimensionInfo(width, height, -1);
-	}
-
-	/**
-	 * @return
-	 */
-	private int getDefaultHeight() {
-		ICSSStyle style = this.getCSSStyle();
-		if (style == null) {
-			style = DefaultStyle.getInstance();
-		}
-		ICSSFont font = style.getCSSFont();
-		Font swtfont = font.getSwtFont();
-		int fontHeight = FigureUtilities.getFontMetrics(swtfont).getHeight();
-
-		return (fontHeight) * _rows + VERTICAL_PADDING;
-	}
-
-	/**
-	 * @return
-	 */
-	private int getDefaultWidth() {
-		ICSSStyle style = this.getCSSStyle();
-		if (style == null) {
-			style = DefaultStyle.getInstance();
-		}
-		ICSSFont font = style.getCSSFont();
-
-		int fontWidth = FigureUtilities.getFontMetrics(font.getSwtFont())
-				.getAverageCharWidth();
-		return _columns * fontWidth + ARRAWWIDTH + HORIZONTAL_PADDING;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#paintFigure(org.eclipse.draw2d.Graphics,
-	 *      org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void paintFigure(Graphics g, Rectangle rect) {
-		if (_value != null) {
-			g.clipRect(rect);
-			ICSSStyle style = this.getCSSStyle();
-			if (style == null) {
-				style = DefaultStyle.getInstance();
-			}
-			int decoration = ((Integer) style
-					.getStyleProperty(ICSSPropertyID.ATTR_TEXTDECORATION))
-					.intValue();
-			ICSSFont font = style.getCSSFont();
-			g.setFont(font.getSwtFont());
-
-			Color newColor = null;
-			Object color = style.getColor();
-			if (color instanceof Color) {
-				g.setForegroundColor((Color) color);
-			} else if (color instanceof RGB) {
-				newColor = new Color(Display.getCurrent(), (RGB) color);
-				g.setForegroundColor(newColor);
-			} else {
-				g.setForegroundColor(ColorConstants.black);
-			}
-
-			Object textAlign = style
-					.getStyleProperty(ICSSPropertyID.ATTR_TEXTALIGN);
-			int begin = 0;
-			int end = 0;
-			int fontHeight = FigureUtilities.getFontMetrics(font.getSwtFont())
-					.getHeight();
-
-			int fontWidth = FigureUtilities.getFontMetrics(font.getSwtFont())
-					.getAverageCharWidth();
-			int columns = (rect.width - HORIZONTAL_PADDING) / fontWidth;
-
-			int i = 0;
-			while (true) {
-				int y = rect.y + VERTICAL_PADDING / 2 + fontHeight * i;
-				if (y >= rect.bottom()) {
-					break;
-				}
-				end += columns;
-				if (end > _value.length()) {
-					end = _value.length();
-				}
-				end = getTextCount(begin, end, g.getFont(), rect.width
-						- ARRAWWIDTH);
-
-				String text = _value.substring(begin, end);
-
-				int width = FigureUtilities.getTextWidth(text, g.getFont());
-				int x = TextLayoutSupport.getBeginX(textAlign, rect, width);
-				g.drawString(text, x, y);
-
-				TextLayoutSupport.paintTextDecoration(g, new Rectangle(x, y,
-						width, fontHeight), decoration);
-				begin = end;
-
-				if (end == _value.length()) {
-					break;
-				}
-				i++;
-			}
-			if (newColor != null) {
-				newColor.dispose();
-			}
-		}
-		int borderThick = 2;
-		BorderUtil
-				.drawVertialBar(g, ARRAWWIDTH, ARROWHEIGHT, borderThick, rect);
-	}
-
-	private int getTextCount(int begin, int end, Font swtFont, int textWidth) {
-		while (FigureUtilities.getTextWidth(_value.substring(begin, end),
-				swtFont) > textWidth) {
-			end--;
-		}
-		return end;
-	}
-
-	/**
-	 * @param columns
-	 */
-	public void setColumns(int columns) {
-		this._columns = (columns > 0 ? columns : DEFAULTCOLUMN);
-	}
-
-	/**
-	 * @param rows
-	 */
-	public void setRows(int rows) {
-		this._rows = (rows > 0 ? rows : DEFAULTROWS);
-	}
-
-	/**
-	 * @param value
-	 */
-	public void setValue(String value) {
-		this._value = value;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/TextInputWidgetProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/TextInputWidgetProvider.java
deleted file mode 100644
index 966c5b8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/widget/TextInputWidgetProvider.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.css2.widget;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.FigureUtilities;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.font.ICSSFont;
-import org.eclipse.jst.pagedesigner.css2.layout.TextLayoutSupport;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.provider.DimensionInfo;
-import org.eclipse.jst.pagedesigner.css2.style.DefaultStyle;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TextInputWidgetProvider extends AbstractWidgetProvider {
-	private static final int VERTICAL_INCREMENT = 2;
-
-	/**
-	 * password size
-	 */
-	public static final int PWD_SIZE = 18;
-
-	private int DEFAULTSIZE = 20;
-
-	private int _size = DEFAULTSIZE;
-
-	private String _value;
-
-	/**
-	 * @param style
-	 */
-	public TextInputWidgetProvider(ICSSStyle style) {
-		this(style, 20);
-	}
-
-	/**
-	 * @param style
-	 * @param size
-	 */
-	public TextInputWidgetProvider(ICSSStyle style, int size) {
-		super(style);
-		DEFAULTSIZE = size;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#getPreferredDimension(int,
-	 *      int)
-	 */
-	public DimensionInfo getPreferredDimension(int width, int height) {
-		if (width <= 0) {
-			width = getDefaultWidth();
-
-		}
-		if (height <= 0) {
-			height = getDefaultHeight();
-		}
-		return new DimensionInfo(width, height, -1);
-	}
-
-	/**
-	 * @return
-	 */
-	private int getDefaultHeight() {
-		ICSSStyle style = this.getCSSStyle();
-		if (style == null) {
-			style = DefaultStyle.getInstance();
-		}
-		ICSSFont font = style.getCSSFont();
-		Font swtfont = font.getSwtFont();
-		int fontSize = FigureUtilities.getFontMetrics(swtfont).getHeight();
-		return fontSize + VERTICAL_INCREMENT;
-	}
-
-	/**
-	 * @return the default width
-	 */
-	public int getDefaultWidth() {
-		ICSSStyle style = this.getCSSStyle();
-		if (style == null) {
-			style = DefaultStyle.getInstance();
-		}
-		return computeWidth(style.getCSSFont());
-	}
-
-	private int computeWidth(ICSSFont font) {
-		int fontWidth = FigureUtilities
-				.getTextWidth("abcde", font.getSwtFont());//$NON-NLS-1$
-		return (fontWidth + 1) * _size / 5;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider#paintFigure(org.eclipse.draw2d.Graphics,
-	 *      org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void paintFigure(Graphics g, Rectangle rect) {
-		String value = getValue();
-		if (value != null) {
-			ICSSStyle style = this.getCSSStyle();
-			if (style == null) {
-				style = DefaultStyle.getInstance();
-			}
-			Object textAlign = style
-					.getStyleProperty(ICSSPropertyID.ATTR_TEXTALIGN);
-
-			Font font = style.getCSSFont().getSwtFont();
-			g.setFont(font);
-
-			Color newColor = null;
-			Object color = style.getColor();
-			if (color instanceof Color) {
-				g.setForegroundColor((Color) color);
-			} else if (color instanceof RGB) {
-				newColor = new Color(Display.getCurrent(), (RGB) color);
-				g.setForegroundColor(newColor);
-			} else {
-				g.setForegroundColor(ColorConstants.black);
-			}
-			g.clipRect(rect);
-			int width = FigureUtilities.getTextWidth(value, g.getFont());
-			int x = TextLayoutSupport.getBeginX(textAlign, rect, width);
-			int y = rect.y + VERTICAL_INCREMENT / 2;
-
-			g.drawString(value, x, y);
-			TextLayoutSupport.paintTextDecoration(g, new Rectangle(x, y, width,
-					g.getFontMetrics().getHeight()), ((Integer) getCSSStyle()
-					.getStyleProperty(ICSSPropertyID.ATTR_TEXTDECORATION))
-					.intValue());
-			if (newColor != null) {
-				newColor.dispose();
-			}
-		}
-	}
-
-	/**
-	 * set the value in this text input control
-	 * 
-	 * @param value
-	 */
-	public void setValue(String value) {
-		this._value = value;
-	}
-
-	/**
-	 * @param size
-	 */
-	public void setSize(int size) {
-		this._size = (size <= 0 ? DEFAULTSIZE : size);
-	}
-
-	/**
-	 * get current value in this text input control
-	 * 
-	 * @return the value
-	 */
-	public String getValue() {
-		return _value;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/FeedBackInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/FeedBackInfo.java
deleted file mode 100644
index f405bbc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/FeedBackInfo.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd;
-
-/**
- * @author mengbo
- */
-public class FeedBackInfo {
-	private String _description;
-
-	private int _order;
-
-	/**
-	 * @param desc 
-	 * @param order 
-	 */
-	public FeedBackInfo(String desc, int order) {
-		this._description = desc;
-	}
-
-	/**
-	 * the description may be used in tooltip or wizard dialog selection to tell
-	 * user the effect of the drop.
-	 * 
-	 * @return the description
-	 */
-	public String getDescription() {
-		return _description;
-	}
-
-	/**
-	 * how important this feedback is. This information may be used when we
-	 * ordering the choices in the wizard.
-	 * 
-	 * range from 0-10, the bigger, the more important.
-	 * 
-	 * @return the order
-	 */
-	public int getOrder() {
-		return _order;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/ILocalDropHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/ILocalDropHandler.java
deleted file mode 100644
index 11378a1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/ILocalDropHandler.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd;
-
-import org.eclipse.jface.wizard.IWizard;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public interface ILocalDropHandler {
-	/**
-	 * whether this handler will use wizard for user to config detail
-	 * 
-	 * @return true if should use wizard
-	 */
-	public boolean useWizard();
-
-	/**
-	 * @param localData
-	 * @param viewer
-	 * @return true if should use wizard
-	 */
-	public boolean useWizard(Object localData, IHTMLGraphicalViewer viewer);
-
-	/**
-	 * 
-	 * @param localData
-	 * @param widget
-	 * @return the feed back info
-	 */
-	public FeedBackInfo supportUpdateWidget(Object localData, Node widget);
-
-	/**
-	 * This method will only be called when <code>supportUpdateWidget</code>
-	 * return true and <code>useWizard</code> return true.
-	 * 
-	 * @param localData
-	 * @param widget
-	 * @param viewer
-	 * @return the wizard
-	 */
-	public IWizard getWizard(Object localData, Node widget,
-			IHTMLGraphicalViewer viewer);
-
-	/**
-	 * this method is called when the handler don't support wizard.
-	 * 
-	 * @param localData
-	 * @param widget
-	 * @param viewer
-	 */
-	public void doUpdateWidget(Object localData, Node widget,
-			IHTMLGraphicalViewer viewer);
-
-	/**
-	 * 
-	 * @param localData
-	 * @param position
-	 * @return the feedback info
-	 */
-	public FeedBackInfo supportInsertElements(Object localData,
-			IDOMPosition position);
-
-	/**
-	 * 
-	 * @param localData
-	 * @param position
-	 * @param viewer
-	 * @return the wizard
-	 */
-	public IWizard getWizard(Object localData, IDOMPosition position,
-			IHTMLGraphicalViewer viewer);
-
-	/**
-	 * @param localData
-	 * @param position
-	 * @param viewer
-	 */
-	public void doInsertElements(Object localData, IDOMPosition position,
-			IHTMLGraphicalViewer viewer);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/LocalDropRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/LocalDropRequest.java
deleted file mode 100644
index bcb165d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/LocalDropRequest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.requests.DropRequest;
-
-/**
- * @author mengbo
- */
-public class LocalDropRequest extends Request implements DropRequest {
-	// XXX: need move this constant to somewhere else.
-	/**
-	 * the request name for local drops
-	 */
-	public static final String REQ_LOCAL_DROP = "Local Drop";
-
-	private Point _location;
-
-	private Object _localObject;
-
-	/**
-	 * 
-	 */
-	public LocalDropRequest() {
-		super(REQ_LOCAL_DROP);
-	}
-
-	/**
-	 * Returns the location of the object to be created.
-	 * 
-	 * @return the location
-	 */
-	public Point getLocation() {
-		return _location;
-	}
-
-	/**
-	 * Sets the location where the new object will be placed.
-	 * 
-	 * @param location
-	 *            the location
-	 */
-	public void setLocation(Point location) {
-		this._location = location;
-	}
-
-	/**
-	 * @return the  local object
-	 */
-	public Object getLocalObject() {
-		return _localObject;
-	}
-
-	/**
-	 * @param local
-	 */
-	public void setLocalObject(Object local) {
-		this._localObject = local;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/DesignerSourceDropTargetListener.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/DesignerSourceDropTargetListener.java
deleted file mode 100644
index bd19857..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/DesignerSourceDropTargetListener.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd.internal;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.dnd.TemplateTransfer;
-import org.eclipse.jst.pagedesigner.commands.PaletteDropInsertCommand;
-import org.eclipse.jst.pagedesigner.editors.pagedesigner.PageDesignerResources;
-import org.eclipse.jst.pagedesigner.editors.palette.TagToolPaletteEntry;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.dnd.DropTargetEvent;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.ui.texteditor.ITextEditorDropTargetListener;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-import org.eclipse.wst.sse.ui.internal.ExtendedEditorDropTargetAdapter;
-
-/**
- * @author mengbo
- */
-public class DesignerSourceDropTargetListener extends
-		ExtendedEditorDropTargetAdapter implements
-		ITextEditorDropTargetListener {
-	private int _location;
-
-	private StructuredTextEditor _textEditor;
-
-	/**
-	 * @param textEditor
-	 */
-	public DesignerSourceDropTargetListener(StructuredTextEditor textEditor) {
-		super(false);
-		_textEditor = textEditor;
-		setTextViewer(_textEditor.getTextViewer());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.texteditor.ITextEditorDropTargetListener#getTransfers()
-	 */
-	public Transfer[] getTransfers() {
-		return new Transfer[] { TemplateTransfer.getInstance(),
-				TextTransfer.getInstance() };
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.dnd.DropTargetListener#dragOperationChanged(org.eclipse.swt.dnd.DropTargetEvent)
-	 */
-	public void dragOperationChanged(DropTargetEvent event) {
-		super.dragOperationChanged(event);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.dnd.DropTargetListener#dragOver(org.eclipse.swt.dnd.DropTargetEvent)
-	 */
-	public void dragOver(DropTargetEvent event) {
-		StyledText text = null;
-		if (_textEditor.getTextViewer() != null) {
-			text = _textEditor.getTextViewer().getTextWidget();
-			if (TemplateTransfer.getInstance().isSupportedType(
-					event.currentDataType)) {
-				if (_textEditor.getTextViewer() != null) {
-					Point p = new Point(event.x, event.y);
-					SourceViewerDragDropHelper.getInstance().updateCaret(
-							_textEditor, p);
-					_location = text.getCaretOffset();
-					if (TemplateTransfer.getInstance().isSupportedType(
-							event.currentDataType)) {
-						_location = SourceViewerDragDropHelper.getInstance()
-								.getValidLocation(_textEditor, _location);
-					}
-					SourceViewerDragDropHelper.getInstance().showCaret(
-							_textEditor, _location);
-				}
-			} else if (TextTransfer.getInstance().isSupportedType(
-					event.currentDataType)) {
-				super.dragOver(event);
-				_location = text.getCaretOffset();
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.dnd.DropTargetListener#drop(org.eclipse.swt.dnd.DropTargetEvent)
-	 */
-	public void drop(DropTargetEvent event) {
-		StyledText text = null;
-		if (_textEditor.getTextViewer() != null) {
-			text = _textEditor.getTextViewer().getTextWidget();
-		}
-		text.setCaretOffset(_location);
-		Command command = getCommand(event);
-		if (command == null) {
-			return;
-		}
-		command.execute();
-	}
-
-	private Command getCommand(DropTargetEvent event) {
-		if (TextTransfer.getInstance().isSupportedType(event.currentDataType)) {
-			Object data = event.data;
-			if (data instanceof String) {
-				SourceViewLocalDropCommand command = new SourceViewLocalDropCommand(
-						_textEditor, data, _location);
-				return command;
-			}
-		} else if (TemplateTransfer.getInstance().isSupportedType(
-				event.currentDataType)) {
-			Object data = event.data;
-			PaletteDropInsertCommand command = null;
-			if (data instanceof TagToolPaletteEntry) {
-				TagToolPaletteEntry tagItem = (TagToolPaletteEntry) data;
-				// "Create new item"
-				command = new PaletteDropInsertCommand(
-						PageDesignerResources
-								.getInstance()
-								.getString(
-										"DesignerSourceDropTargetListener.InserCommandLabel"), _textEditor, tagItem, _location); //$NON-NLS-1$
-			}
-			return command;
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/DesignerSourceMouseTrackAdapter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/DesignerSourceMouseTrackAdapter.java
deleted file mode 100644
index 636460b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/DesignerSourceMouseTrackAdapter.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd.internal;
-
-import org.eclipse.gef.EditDomain;
-import org.eclipse.gef.palette.ToolEntry;
-import org.eclipse.jst.pagedesigner.commands.PaletteDropInsertCommand;
-import org.eclipse.jst.pagedesigner.commands.SourceViewerCommand;
-import org.eclipse.jst.pagedesigner.editors.pagedesigner.PageDesignerResources;
-import org.eclipse.jst.pagedesigner.editors.palette.TagToolPaletteEntry;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseListener;
-import org.eclipse.swt.events.MouseMoveListener;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-import org.eclipse.wst.sse.ui.internal.ExtendedEditorDropTargetAdapter;
-
-/**
- * @author mengbo
- */
-public class DesignerSourceMouseTrackAdapter extends
-		ExtendedEditorDropTargetAdapter implements MouseListener,
-		MouseMoveListener {
-	private int _location;
-
-	private StructuredTextEditor _textEditor;
-
-	private EditDomain _domain;
-
-	/**
-	 * @param textEditor
-	 * @param domain
-	 */
-	public DesignerSourceMouseTrackAdapter(StructuredTextEditor textEditor,
-			EditDomain domain) {
-		super(false);
-		_textEditor = textEditor;
-		_domain = domain;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.events.MouseMoveListener#mouseMove(org.eclipse.swt.events.MouseEvent)
-	 */
-	public void mouseMove(MouseEvent event) {
-		Object object = getPaletteObject();
-		StyledText text = null;
-		if (_textEditor.getTextViewer() != null) {
-			text = _textEditor.getTextViewer().getTextWidget();
-		} else {
-			return;
-		}
-		if (object == null) {
-            // set to default cusror
-			text.setCursor(null);
-			return;
-		}
-		Point p = new Point(event.x, event.y);
-		p = _textEditor.getTextViewer().getTextWidget().toDisplay(p);
-		SourceViewerDragDropHelper.getInstance().updateCaret(_textEditor, p);
-		_location = text.getCaretOffset();
-		_location = SourceViewerDragDropHelper.getInstance().getValidLocation(
-				_textEditor, _location);
-		_location = SourceViewerDragDropHelper.getInstance().showCaret(
-				_textEditor, _location);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.events.MouseListener#mouseUp(org.eclipse.swt.events.MouseEvent)
-	 */
-	public void mouseUp(MouseEvent event) {
-		if (event.button != 1) {
-			if (_domain.getPaletteViewer() != null) {
-				_domain.getPaletteViewer().setActiveTool(null);
-			}
-			return;
-		}
-        SourceViewerCommand command = getCommand(event);
-        if (command != null) {
-        	command.execute();
-        	resetPalette();
-        }
-        _location = 0;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.palette.PaletteListener#activeToolChanged(org.eclipse.gef.ui.palette.PaletteViewer,
-	 *      org.eclipse.gef.palette.ToolEntry)
-	 */
-	private Object getPaletteObject() {
-		if (_domain.getPaletteViewer() != null) {
-			Object tool = _domain.getPaletteViewer().getActiveTool();
-			if (tool instanceof TagToolPaletteEntry) {
-				return tool;
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.events.MouseListener#mouseDoubleClick(org.eclipse.swt.events.MouseEvent)
-	 */
-	public void mouseDoubleClick(MouseEvent e) {
-       // do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.events.MouseListener#mouseDown(org.eclipse.swt.events.MouseEvent)
-	 */
-	public void mouseDown(MouseEvent e) {
-        // do nothing
-	}
-
-	private PaletteDropInsertCommand getCommand(MouseEvent event) {
-		Object data = getPaletteObject();
-		PaletteDropInsertCommand command = null;
-		if (data instanceof TagToolPaletteEntry) {
-			TagToolPaletteEntry descriptor = (TagToolPaletteEntry) data;
-			// "Create new item"
-			command = new PaletteDropInsertCommand(
-					PageDesignerResources
-							.getInstance()
-							.getString(
-									"DesignerSourceDropTargetListener.InserCommandLabel"),
-					_textEditor, descriptor, _location);
-		}
-		return command;
-	}
-
-	private void resetPalette() {
-		if (_domain.getPaletteViewer() != null) {
-			ToolEntry tool = _domain.getPaletteViewer().getPaletteRoot()
-					.getDefaultEntry();
-			if (tool != null) {
-				_domain.getPaletteViewer().setActiveTool(tool);
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/DesignerTemplateTransferDragSourceListener.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/DesignerTemplateTransferDragSourceListener.java
deleted file mode 100644
index c1d3868..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/DesignerTemplateTransferDragSourceListener.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.dnd.internal;
-
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.dnd.TemplateTransferDragSourceListener;
-import org.eclipse.jst.pagedesigner.editors.palette.TagToolPaletteEntry;
-
-/**
- * @author mengbo
- */
-public class DesignerTemplateTransferDragSourceListener extends
-		TemplateTransferDragSourceListener {
-
-	/**
-	 * @param viewer
-	 */
-	public DesignerTemplateTransferDragSourceListener(EditPartViewer viewer) {
-		super(viewer);
-	}
-
-	protected Object getTemplate() {
-		Object object = super.getTemplate();
-		if (object == null) {
-			List selection = getViewer().getSelectedEditParts();
-			if (selection.size() == 1) {
-				EditPart editpart = (EditPart) getViewer()
-						.getSelectedEditParts().get(0);
-				Object model = editpart.getModel();
-				if (model instanceof TagToolPaletteEntry) {
-					return model;
-				}
-			}
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/DropSelectionWizard.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/DropSelectionWizard.java
deleted file mode 100644
index 8960639..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/DropSelectionWizard.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd.internal;
-
-import java.util.Map;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dnd.ILocalDropHandler;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class DropSelectionWizard extends Wizard {
-	private final String INTIAL_DEFAULT_PAGE_IMAGE = "newsuade_wiz.gif";
-
-	private Object _localData;
-
-	private IHTMLGraphicalViewer _viewer;
-
-	private Map _feedbackToHandlers;
-
-	private boolean _updateWidget;
-
-	private Node _widget;
-
-	private IDOMPosition _position;
-
-	private SimpleWizardSelectionPage _firstPage;
-
-	private DropSelectionWizard(IHTMLGraphicalViewer viewer, Object localData,
-			Map handlers) {
-		this.setWindowTitle(Messages.getString("DropSelectionWizard.Title")); //$NON-NLS-1$
-		ImageDescriptor desc = PDPlugin.getDefault().getImageDescriptor(
-				INTIAL_DEFAULT_PAGE_IMAGE);
-		setDefaultPageImageDescriptor(desc);
-		this._viewer = viewer;
-		this._localData = localData;
-		this._feedbackToHandlers = handlers;
-
-		_firstPage = new SimpleWizardSelectionPage(_viewer, _localData,
-				_feedbackToHandlers);
-	}
-
-	/**
-	 * @param viewer 
-	 * @param localData 
-	 * @param handlers 
-	 * @param widget 
-	 */
-	public DropSelectionWizard(IHTMLGraphicalViewer viewer, Object localData,
-			Map handlers, Node widget) {
-		this(viewer, localData, handlers);
-		_updateWidget = true;
-		_widget = widget;
-
-		_firstPage.setWidget(widget);
-	}
-
-	/**
-	 * @param viewer
-	 * @param localData
-	 * @param handlers
-	 * @param position
-	 */
-	public DropSelectionWizard(IHTMLGraphicalViewer viewer, Object localData,
-			Map handlers, IDOMPosition position) {
-		this(viewer, localData, handlers);
-		_updateWidget = false;
-		_position = position;
-
-		_firstPage.setPosition(position);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.Wizard#addPages()
-	 */
-	public void addPages() {
-		addPage(_firstPage);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.Wizard#needsPreviousAndNextButtons()
-	 */
-	public boolean needsPreviousAndNextButtons() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.Wizard#canFinish()
-	 */
-	public boolean canFinish() {
-		if (getContainer().getCurrentPage() == _firstPage) {
-			Object obj = _firstPage.getCurrentHandler();
-			if (obj instanceof ILocalDropHandler)
-            {
-				return true;
-            }
-            return false;
-		}
-        return super.canFinish();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.IWizard#performFinish()
-	 */
-	public boolean performFinish() {
-		if (getContainer().getCurrentPage() == _firstPage) {
-			Object obj = _firstPage.getCurrentHandler();
-			if (obj instanceof ILocalDropHandler) {
-				ILocalDropHandler handler = (ILocalDropHandler) obj;
-				if (_updateWidget) {
-					handler.doUpdateWidget(_localData, _widget, _viewer);
-				} else {
-					handler.doInsertElements(_localData, _position, _viewer);
-				}
-				return true;
-			}
-		}
-		return true;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/LocalDropCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/LocalDropCommand.java
deleted file mode 100644
index 6b6a802..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/LocalDropCommand.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd.internal;
-
-import java.util.Map;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.wizard.IWizard;
-import org.eclipse.jst.jsf.common.ui.internal.dialogs.CommonWizardDialog;
-import org.eclipse.jst.pagedesigner.dnd.ILocalDropHandler;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.widgets.Shell;
-import org.w3c.dom.Node;
-
-/**
- * This is the command that performs the drop operation. There is no need for
- * this command to go into command stack, it simply open wizards, and let
- * wizards to handle the remaining things.
- * 
- * @author mengbo
- */
-public class LocalDropCommand extends Command {
-	/**
-	 * the map from feedback to ILocalDropHandler
-	 */
-	private Map _feedbackToHandlers;
-
-	private IHTMLGraphicalViewer _viewer;
-
-	private Object _localObject;
-
-	private Node _widget;
-
-	private IDOMPosition _position;
-
-	/**
-	 * constructor
-	 * @param viewer 
-	 * @param localObject 
-	 * @param feedbackHandlers 
-	 */
-	public LocalDropCommand(IHTMLGraphicalViewer viewer, Object localObject,
-			Map feedbackHandlers) {
-		_viewer = viewer;
-		_localObject = localObject;
-		_feedbackToHandlers = feedbackHandlers;
-	}
-
-	/**
-	 * @param widget
-	 */
-	public void setWidget(Node widget) {
-		_widget = widget;
-	}
-
-	/**
-	 * @param position
-	 */
-	public void setDOMPosition(IDOMPosition position) {
-		_position = position;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.commands.Command#execute()
-	 */
-	public void execute() {
-		if (_feedbackToHandlers.size() == 1) {
-			// only have one choice.
-			ILocalDropHandler handler = (ILocalDropHandler) _feedbackToHandlers
-					.values().toArray()[0];
-			if (handler.useWizard(_localObject, _viewer)) {
-				IWizard wizard;
-				if (_widget != null) {
-					wizard = handler.getWizard(_localObject, _widget, _viewer);
-				} else {
-					wizard = handler
-							.getWizard(_localObject, _position, _viewer);
-				}
-				CommonWizardDialog wizardDialog = new CommonWizardDialog(
-						getShell(), wizard);
-				wizardDialog.setTitle(Messages
-						.getString("LocalDropCommand.DropHandler"));
-				wizardDialog.create();
-				wizardDialog.open();
-			} else {
-				if (_widget != null) {
-					handler.doUpdateWidget(_localObject, _widget, _viewer);
-				} else {
-					handler.doInsertElements(_localObject, _position, _viewer);
-				}
-			}
-		} else {
-			CommonWizardDialog wizardDialog = new CommonWizardDialog(
-					getShell(), getWizard());
-			wizardDialog.setTitle(Messages
-					.getString("LocalDropCommand.DropHandler"));
-			wizardDialog.setBlockOnOpen(false);
-			wizardDialog.create();
-			wizardDialog.open();
-		}
-	}
-
-	/**
-	 * @return
-	 */
-	private IWizard getWizard() {
-		if (_widget != null) {
-			return new DropSelectionWizard(_viewer, _localObject,
-					_feedbackToHandlers, _widget);
-		}
-        return new DropSelectionWizard(_viewer, _localObject,
-        		_feedbackToHandlers, _position);
-	}
-
-	/**
-	 * @return
-	 */
-	private Shell getShell() {
-		return _viewer.getControl().getShell();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/LocalDropEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/LocalDropEditPolicy.java
deleted file mode 100644
index 5076d6c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/LocalDropEditPolicy.java
+++ /dev/null
@@ -1,255 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd.internal;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.RectangleFigure;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.GraphicalEditPolicy;
-import org.eclipse.jst.pagedesigner.dnd.FeedBackInfo;
-import org.eclipse.jst.pagedesigner.dnd.ILocalDropHandler;
-import org.eclipse.jst.pagedesigner.dnd.LocalDropRequest;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.editpolicies.LocationHelper;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.tools.ExposeHelper;
-import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.DnDPositionValidator;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.EditPartPositionHelper;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Node;
-
-/**
- * This is the editpolicy to handle LocalSelectionDrop
- * 
- * @author mengbo
- */
-public class LocalDropEditPolicy extends GraphicalEditPolicy {
-	private RectangleFigure _feedbackFigure;
-
-	// indicate whether update is checked
-	private static boolean _checkUpdate = true;
-
-	/**
-	 * @param widgetEditPart
-	 * @param request
-	 * @param results
-	 * @return true if should update widget
-	 */
-	public boolean checkUpdateWidget(EditPart widgetEditPart,
-			LocalDropRequest request, Map results) {
-		if (!(widgetEditPart instanceof ElementEditPart)) {
-			return false;
-		}
-		Node widget = ((ElementEditPart) widgetEditPart).getIDOMNode();
-		ILocalDropHandler[] handlers = RegistryReader.getAllHandlers();
-		Object localData = request.getLocalObject();
-		for (int i = 0; i < handlers.length; i++) {
-			FeedBackInfo feedback = handlers[i].supportUpdateWidget(localData,
-					widget);
-			if (feedback != null) {
-				results.put(feedback, handlers[i]);
-			}
-		}
-		return !results.isEmpty();
-	}
-
-	/**
-	 * @param request
-	 * @param host
-	 * @param results
-	 * @param dpHolder
-	 * @param position
-	 * @return true if should insert element
-	 */
-	public boolean checkInsertElement(LocalDropRequest request,
-			EditPart[] host, Map results, DesignPosition[] dpHolder,
-			IDOMPosition[] position) {
-		DesignPosition designPosition = EditPartPositionHelper
-		    .findEditPartPosition(host[0], request.getLocation(),
-		        new DnDPositionValidator(new ActionData(
-		            ActionData.DATABINDING_DND, request)));
-		dpHolder[0] = designPosition;
-		if (designPosition == null) {
-			return false;
-		}
-
-		host[0] = designPosition.getContainerPart();
-		position[0] = DOMPositionHelper.toDOMPosition(designPosition);
-		ILocalDropHandler[] handlers = RegistryReader.getAllHandlers();
-		Object localData = request.getLocalObject();
-		for (int i = 0; i < handlers.length; i++) {
-			FeedBackInfo feedback = handlers[i].supportInsertElements(
-					localData, position[0]);
-			if (feedback != null) {
-				results.put(feedback, handlers[i]);
-			}
-		}
-		return !results.isEmpty();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#getTargetEditPart(org.eclipse.gef.Request)
-	 */
-	public EditPart getTargetEditPart(Request request) {
-		if (request instanceof LocalDropRequest) {
-			LocalDropRequest r = (LocalDropRequest) request;
-			EditPart host = getHost();
-			if (_checkUpdate && checkUpdateWidget(host, r, new HashMap())) {
-				return host;
-			}
-			EditPart[] hostHolder = new EditPart[] { host };
-			if (checkInsertElement(r, hostHolder, new HashMap(),
-					new DesignPosition[1], new IDOMPosition[1])) {
-				return hostHolder[0];
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#getCommand(org.eclipse.gef.Request)
-	 */
-	public Command getCommand(Request request) {
-		if (request instanceof LocalDropRequest) {
-			LocalDropRequest r = (LocalDropRequest) request;
-			EditPart host = getHost();
-
-			Map result = new HashMap();
-			if (_checkUpdate && checkUpdateWidget(host, r, result)) {
-				LocalDropCommand command = new LocalDropCommand(
-						getViewer(host), r.getLocalObject(), result);
-				command.setWidget(((NodeEditPart) host).getIDOMNode());
-				return command;
-			}
-			result.clear();
-
-			EditPart[] hostHolder = new EditPart[] { host };
-			IDOMPosition[] positionHolder = new IDOMPosition[1];
-			if (checkInsertElement(r, hostHolder, result,
-					new DesignPosition[1], positionHolder)) {
-				LocalDropCommand command = new LocalDropCommand(
-						getViewer(host), r.getLocalObject(), result);
-				command.setDOMPosition(positionHolder[0]);
-				return command;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param host
-	 * @return
-	 */
-	private IHTMLGraphicalViewer getViewer(EditPart host) {
-		return (IHTMLGraphicalViewer) ((GraphicalEditPart) host).getViewer();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#eraseTargetFeedback(org.eclipse.gef.Request)
-	 */
-	public void eraseTargetFeedback(Request request) {
-		if (_feedbackFigure != null) {
-			removeFeedback(_feedbackFigure);
-			_feedbackFigure = null;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#showTargetFeedback(org.eclipse.gef.Request)
-	 */
-	public void showTargetFeedback(Request request) {
-		if (request instanceof LocalDropRequest) {
-			LocalDropRequest r = (LocalDropRequest) request;
-			EditPart host = getHost();
-			if (_checkUpdate && checkUpdateWidget(host, r, new HashMap())) {
-				Rectangle rect = LocationHelper
-						.getAbsoluteBounds((GraphicalEditPart) host);
-				showFeedbackRect(rect);
-				return;
-			}
-			EditPart[] hostHolder = new EditPart[] { host };
-			DesignPosition[] holder = new DesignPosition[1];
-			if (checkInsertElement(r, hostHolder, new HashMap(), holder,
-					new IDOMPosition[1])) {
-				Rectangle rect = EditPartPositionHelper
-						.convertToAbsoluteCaretRect(holder[0]);
-				showFeedbackRect(rect);
-				if (getHost() instanceof GraphicalEditPart) {
-					ExposeHelper exposeHelper = new ExposeHelper(
-							getViewer(getHost()));
-					exposeHelper.adjustVertical(r.getLocation());
-				}
-				return;
-			}
-		}
-	}
-
-	/**
-	 * @return the feedback figure
-	 */
-	protected RectangleFigure getFeedbackFigure() {
-		if (_feedbackFigure == null) {
-			_feedbackFigure = new RectangleFigure();
-			_feedbackFigure.setFill(true);
-			_feedbackFigure.setOutline(true);
-			_feedbackFigure.setLineWidth(1);
-			_feedbackFigure.setForegroundColor(ColorConstants.red);
-			_feedbackFigure.setBounds(new Rectangle(0, 0, 0, 0));
-			_feedbackFigure.setXOR(true);
-			addFeedback(_feedbackFigure);
-		}
-		return _feedbackFigure;
-	}
-
-	/**
-	 * @param rect
-	 */
-	protected void showFeedbackRect(Rectangle rect) {
-		RectangleFigure pf = getFeedbackFigure();
-		pf.translateToRelative(rect);
-		pf.setBounds(rect);
-	}
-
-	/**
-	 * @return Returns the _forUpdate.
-	 */
-	public static boolean isCheckUpdate() {
-		return _checkUpdate;
-	}
-
-	/**
-	 * @param update
-	 *            The _forUpdate to set.
-	 */
-	public static void setCheckUpdate(boolean update) {
-		_checkUpdate = update;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/LocalSelectionDropTargetListener.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/LocalSelectionDropTargetListener.java
deleted file mode 100644
index 14fcf31..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/LocalSelectionDropTargetListener.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd.internal;
-
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.dnd.AbstractTransferDropTargetListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.Alerts;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dnd.LocalDropRequest;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DropTargetEvent;
-import org.eclipse.ui.views.navigator.LocalSelectionTransfer;
-
-/**
- * @author mengbo
- */
-public class LocalSelectionDropTargetListener extends
-		AbstractTransferDropTargetListener {
-	/**
-	 * @param viewer
-	 */
-	public LocalSelectionDropTargetListener(EditPartViewer viewer) {
-		super(viewer, LocalSelectionTransfer.getInstance());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.dnd.AbstractTransferDropTargetListener#createTargetRequest()
-	 */
-	protected Request createTargetRequest() {
-		LocalDropRequest request = new LocalDropRequest();
-		request.setLocation(getDropLocation());
-		request.setLocalObject(getCurrentLocalObject());
-		return request;
-	}
-
-	/**
-	 * @return the current local object
-	 */
-	private Object getCurrentLocalObject() {
-		ISelection sel = LocalSelectionTransfer.getInstance().getSelection();
-		if (sel instanceof IStructuredSelection) {
-			return ((IStructuredSelection) sel).getFirstElement();
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.dnd.AbstractTransferDropTargetListener#updateTargetRequest()
-	 */
-	protected void updateTargetRequest() {
-		LocalDropRequest dropRequest = (LocalDropRequest) getTargetRequest();
-		dropRequest.setLocation(getDropLocation());
-		dropRequest.setLocalObject(getCurrentLocalObject());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.dnd.AbstractTransferDropTargetListener#setCurrentEvent(org.eclipse.swt.dnd.DropTargetEvent)
-	 */
-	public void setCurrentEvent(DropTargetEvent currentEvent) {
-		super.setCurrentEvent(currentEvent);
-		if (currentEvent != null) {
-			if (currentEvent.detail != DND.DROP_NONE) {
-				currentEvent.detail = DND.DROP_COPY;
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.dnd.DropTargetListener#dragOperationChanged(org.eclipse.swt.dnd.DropTargetEvent)
-	 */
-	public void dragOperationChanged(DropTargetEvent event) {
-		// switch the insert or update
-		if ((event.detail & (DND.DROP_COPY)) != 0) {
-			LocalDropEditPolicy.setCheckUpdate(false);
-		} else {
-			LocalDropEditPolicy.setCheckUpdate(true);
-		}
-		super.dragOperationChanged(event);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.dnd.DropTargetListener#drop(org.eclipse.swt.dnd.DropTargetEvent)
-	 */
-	public void drop(DropTargetEvent event) {
-		String path = ((IHTMLGraphicalViewer) getViewer()).getModel()
-				.getBaseLocation();
-		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		IWorkspaceRoot root = workspace.getRoot();
-		IPath filePath = new Path(path);
-		if (root.getFile(filePath).exists()) {
-			getViewer().getControl().setFocus();
-			super.drop(event);
-			LocalDropEditPolicy.setCheckUpdate(true);
-		} else {
-			Alerts alert = PDPlugin.getAlerts();
-			alert.info("LocalSelectionDropTargetListener.MessageDialog.Title",
-					"LocalSelectionDropTargetListener.MessageDialog.Message");
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/Messages.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/Messages.java
deleted file mode 100644
index f7baa6e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/Messages.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd.internal;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * A message bundle for dnd
- *
- */
-/*package*/ class Messages {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.pagedesigner.dnd.internal.messages"; //$NON-NLS-1$
-
-	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
-			.getBundle(BUNDLE_NAME);
-
-	private Messages() {
-        // no external instantiation
-	}
-
-	/**
-	 * @param key
-	 * @return the message for key
-	 */
-	public static String getString(String key) {
-		try {
-			return RESOURCE_BUNDLE.getString(key);
-		} catch (MissingResourceException e) {
-			return '!' + key + '!';
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/PDTemplateTransferDropTargetListener.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/PDTemplateTransferDropTargetListener.java
deleted file mode 100644
index a251045..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/PDTemplateTransferDropTargetListener.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.dnd.internal;
-
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.dnd.AbstractTransferDropTargetListener;
-import org.eclipse.gef.dnd.TemplateTransfer;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.editors.palette.TagToolPaletteEntry;
-import org.eclipse.jst.pagedesigner.itemcreation.ItemCreationRequest;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DropTargetEvent;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PDTemplateTransferDropTargetListener extends
-		AbstractTransferDropTargetListener {
-
-	/**
-	 * @param viewer
-	 */
-	public PDTemplateTransferDropTargetListener(EditPartViewer viewer) {
-		super(viewer, TemplateTransfer.getInstance());
-	}
-
-	/**
-	 * @see org.eclipse.gef.dnd.AbstractTransferDropTargetListener#createTargetRequest()
-	 */
-	protected Request createTargetRequest() {
-		ItemCreationRequest request = new ItemCreationRequest();
-		/*TODO: nothing is done with this var.  Does the method have a side-effect? TagToolPaletteEntry tagItem =*/TemplateTransfer.getInstance().getTemplate();
-		return request;
-	}
-
-	/**
-	 * A helper method that casts the target Request to a CreateRequest.
-	 * 
-	 * @return CreateRequest
-	 */
-	protected final Request getCreateRequest() {
-		return getTargetRequest();
-	}
-
-	/**
-	 * The purpose of a template is to be copied. Therefore, the drop operation
-	 * can't be anything but <code>DND.DROP_COPY</code>.
-	 * 
-	 * @see AbstractTransferDropTargetListener#handleDragOperationChanged()
-	 */
-	protected void handleDragOperationChanged() {
-		getCurrentEvent().detail = DND.DROP_COPY;
-		super.handleDragOperationChanged();
-	}
-
-	/**
-	 * The purpose of a template is to be copied. Therefore, the Drop operation
-	 * is set to <code>DND.DROP_COPY</code> by default.
-	 * 
-	 * @see org.eclipse.gef.dnd.AbstractTransferDropTargetListener#handleDragOver()
-	 */
-	protected void handleDragOver() {
-		getCurrentEvent().detail = DND.DROP_COPY;
-		getCurrentEvent().feedback = DND.FEEDBACK_SCROLL | DND.FEEDBACK_EXPAND;
-		super.handleDragOver();
-	}
-
-	/**
-	 * Assumes that the target request is a {@link org.eclipse.gef.requests.CreateRequest}.
-	 */
-	protected void updateTargetRequest() {
-		// We should never see request that is not of ItemCreationRequest type,
-		// but there is an error case that Eclipse send out other types
-		// requests.
-		// Add this test to avoid potential error.
-		if (getCreateRequest() instanceof ItemCreationRequest) {
-			ItemCreationRequest request = (ItemCreationRequest) getCreateRequest();
-            Object transferObj = TemplateTransfer.getInstance().getObject();
-            
-            if (transferObj instanceof TagToolPaletteEntry)
-            {
-            	TagToolPaletteEntry tagItem = 
-                    (TagToolPaletteEntry) transferObj;
-
-                request.setTagToolPaletteEntry(tagItem);
-                request.setLocation(getDropLocation());
-            }
-            else
-            {
-                PDPlugin.getLogger(this.getClass()).error("Unexpected transfer object on palette drag:"+transferObj, new Throwable("Artificial throwable for stack tracing"));
-            }
-		}
-	}
-
-	public void drop(DropTargetEvent event) {
-		if (getCreateRequest() instanceof ItemCreationRequest) {
-			getViewer().getControl().setFocus();
-			super.drop(event);
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/RegistryReader.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/RegistryReader.java
deleted file mode 100644
index c364c7f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/RegistryReader.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd.internal;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.IJMTConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dnd.ILocalDropHandler;
-
-/**
- * Read the registry to find out all the LocalDropHandlers.
- * 
- * @author mengbo
- */
-public class RegistryReader {
-	final private static Logger _log = PDPlugin.getLogger(RegistryReader.class);
-
-	private static ILocalDropHandler[] _handlers = null;
-
-	/**
-	 * @return all registered drop handlers
-	 */
-	public static synchronized ILocalDropHandler[] getAllHandlers() {
-		if (_handlers == null) {
-			_handlers = readAllHandlers();
-		}
-		return _handlers;
-
-	}
-
-	private static ILocalDropHandler[] readAllHandlers() {
-		List result = new ArrayList();
-		IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
-				.getExtensionPoint(PDPlugin.getPluginId(),
-						IJMTConstants.EXTENSION_POINT_PAGEDESIGNER);
-		IExtension[] extensions = extensionPoint.getExtensions();
-
-		for (int i = 0; i < extensions.length; i++) {
-			IExtension ext = extensions[i];
-			IConfigurationElement[] dropHandlers = ext
-					.getConfigurationElements();
-
-			for (int j = 0; j < dropHandlers.length; j++) {
-				if (dropHandlers[j].getName().equals(
-						IJMTConstants.LOCAL_DROP_HANDLER)) {
-					dropHandlers[j].getAttribute("class");
-					Object obj;
-					try {
-						obj = dropHandlers[j]
-								.createExecutableExtension("class");
-
-						if (obj instanceof ILocalDropHandler) {
-							result.add(obj);
-						}
-					} catch (CoreException e) {
-						_log.info("CoreException", e);
-					}
-				}
-			}
-		}
-		ILocalDropHandler[] ret = new ILocalDropHandler[result.size()];
-		result.toArray(ret);
-		return ret;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/ResouceDropTargetListener.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/ResouceDropTargetListener.java
deleted file mode 100644
index 873c641..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/ResouceDropTargetListener.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd.internal;
-
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.dnd.AbstractTransferDropTargetListener;
-import org.eclipse.jst.pagedesigner.dnd.LocalDropRequest;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.DropTargetEvent;
-import org.eclipse.swt.dnd.FileTransfer;
-
-/**
- * The drop target listener for DnD from Windows explorer.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class ResouceDropTargetListener extends
-		AbstractTransferDropTargetListener {
-
-	/**
-	 * @param viewer
-	 */
-	public ResouceDropTargetListener(EditPartViewer viewer) {
-		super(viewer, FileTransfer.getInstance());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.dnd.AbstractTransferDropTargetListener#createTargetRequest()
-	 */
-	protected Request createTargetRequest() {
-		LocalDropRequest request = new LocalDropRequest();
-		request.setLocation(getDropLocation());
-		request.setLocalObject(getCurrentLocalObject());
-		return request;
-	}
-
-	private Object getCurrentLocalObject() {
-		Object result = null;
-		try {
-			Object data = ((FileTransfer) getTransfer())
-					.nativeToJava(getCurrentEvent().currentDataType);
-			if (data instanceof String[]) {
-				result = ((String[]) data)[0];
-			}
-		} catch (Exception e) {
-			// Don't know the tag type.
-		}
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.dnd.AbstractTransferDropTargetListener#updateTargetRequest()
-	 */
-	protected void updateTargetRequest() {
-		LocalDropRequest dropRequest = (LocalDropRequest) getTargetRequest();
-		dropRequest.setLocation(getDropLocation());
-		dropRequest.setLocalObject(getCurrentLocalObject());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.dnd.AbstractTransferDropTargetListener#setCurrentEvent(org.eclipse.swt.dnd.DropTargetEvent)
-	 */
-	public void setCurrentEvent(DropTargetEvent currentEvent) {
-		super.setCurrentEvent(currentEvent);
-		if (currentEvent != null) {
-			if (currentEvent.detail != DND.DROP_NONE) {
-				currentEvent.detail = DND.DROP_COPY;
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.dnd.DropTargetListener#dragOperationChanged(org.eclipse.swt.dnd.DropTargetEvent)
-	 */
-	public void dragOperationChanged(DropTargetEvent event) {
-		// switch the insert or update
-		if ((event.detail & (DND.DROP_COPY)) != 0) {
-			LocalDropEditPolicy.setCheckUpdate(false);
-		} else {
-			LocalDropEditPolicy.setCheckUpdate(true);
-		}
-		super.dragOperationChanged(event);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.swt.dnd.DropTargetListener#drop(org.eclipse.swt.dnd.DropTargetEvent)
-	 */
-	public void drop(DropTargetEvent event) {
-		getViewer().getControl().setFocus();
-		super.drop(event);
-		LocalDropEditPolicy.setCheckUpdate(true);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/SimpleWizardSelectionPage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/SimpleWizardSelectionPage.java
deleted file mode 100644
index c507c2a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/SimpleWizardSelectionPage.java
+++ /dev/null
@@ -1,274 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd.internal;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.ListViewer;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.jface.wizard.IWizard;
-import org.eclipse.jface.wizard.IWizardNode;
-import org.eclipse.jface.wizard.WizardSelectionPage;
-import org.eclipse.jst.pagedesigner.dnd.FeedBackInfo;
-import org.eclipse.jst.pagedesigner.dnd.ILocalDropHandler;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.w3c.dom.Node;
-
-/**
- * UI wizard selection page. To let user select which ILocalDropHandler to use
- * to handle the drop.
- * 
- * @author mengbo
- */
-public class SimpleWizardSelectionPage extends WizardSelectionPage implements
-		ISelectionChangedListener {
-	private Object _localData;
-
-	private IHTMLGraphicalViewer _viewer;
-
-	private boolean _updateWidget;
-
-	private Node _widget;
-
-	private IDOMPosition _position;
-
-	/**
-	 * for those handler that support wizard, then map to WizardNode, otherwise
-	 * still map to the handler
-	 */
-	private Map _objToWizardNodeOrHandler = new HashMap();
-
-	private Map _feedbackToHandlers;
-
-	private Object _currentHandler = null; // IWizardNode or a
-
-	// ILocalDropHandler that don't
-	// useWizard.
-
-	/**
-	 * @param viewer 
-	 * @param localData 
-	 * @param handlers 
-	 */
-	public SimpleWizardSelectionPage(IHTMLGraphicalViewer viewer,
-			Object localData, Map handlers) {
-		super(Messages.getString("SimpleWizardSelectionPage.PageName")); //$NON-NLS-1$
-		this.setTitle(Messages.getString("SimpleWizardSelectionPage.Title")); //$NON-NLS-1$
-		this.setDescription(Messages
-				.getString("SimpleWizardSelectionPage.Description")); //$NON-NLS-1$
-		this
-				.setMessage(Messages
-						.getString("SimpleWizardSelectionPage.Message")); //$NON-NLS-1$
-
-		this._viewer = viewer;
-		this._localData = localData;
-		this._feedbackToHandlers = handlers;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {
-		Composite container = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.verticalSpacing = 10;
-		container.setLayout(layout);
-		container.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		Label label = new Label(container, SWT.NONE);
-		label
-				.setText(Messages
-						.getString("SimpleWizardSelectionPage.Operation")); //$NON-NLS-1$
-		GridData gd = new GridData();
-		label.setLayoutData(gd);
-
-		final ListViewer listViewer = new ListViewer(container);
-		listViewer.getControl().setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		listViewer.setContentProvider(new IStructuredContentProvider() {
-			public Object[] getElements(Object inputElement) {
-				return ((List) inputElement).toArray();
-			}
-
-			public void dispose() {
-                // nothing to dispose
-			}
-
-			public void inputChanged(Viewer viewer, Object oldInput,
-					Object newInput) {
-                // no input changing
-			}
-		});
-		listViewer.setLabelProvider(new LabelProvider() {
-			public String getText(Object element) {
-				return SimpleWizardSelectionPage.this.getText(element);
-			}
-		});
-		listViewer.addDoubleClickListener(new IDoubleClickListener() {
-			public void doubleClick(DoubleClickEvent event) {
-				selectionChanged(new SelectionChangedEvent(listViewer,
-						listViewer.getSelection()));
-				advanceToNextPage();
-			}
-		});
-		listViewer.setSorter(new ViewerSorter());
-		listViewer.setInput(getElements());
-		listViewer.addSelectionChangedListener(this);
-		Dialog.applyDialogFont(container);
-		setControl(container);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		ISelection sel = event.getSelection();
-		if (sel instanceof IStructuredSelection) {
-			Object obj = ((IStructuredSelection) sel).getFirstElement();
-			if (obj != null) {
-				_currentHandler = this._objToWizardNodeOrHandler.get(obj);
-				if (_currentHandler == null) {
-					_currentHandler = getWizardNodeOrHandler(obj);
-					this._objToWizardNodeOrHandler.put(obj, _currentHandler);
-				}
-
-				if (_currentHandler instanceof IWizardNode) {
-					this.setSelectedNode((IWizardNode) _currentHandler);
-				} else {
-					this.getWizard().getContainer().updateButtons();
-				}
-			}
-		}
-	}
-
-	/**
-	 * @param obj
-	 * @return
-	 */
-	private Object getWizardNodeOrHandler(Object obj) {
-		final ILocalDropHandler dropHandler = (ILocalDropHandler) _feedbackToHandlers
-				.get(obj);
-		if (dropHandler.useWizard(_localData, _viewer)) {
-			return new IWizardNode() {
-				IWizard _wizard = null;
-
-				public void dispose() {
-                    // nothing to dispose
-				}
-
-				public Point getExtent() {
-					return null;
-				}
-
-				public IWizard getWizard() {
-					if (_wizard == null) {
-						if (_updateWidget) {
-							_wizard = dropHandler.getWizard(_localData,
-									_widget, _viewer);
-						} else {
-							_wizard = dropHandler.getWizard(_localData,
-									_position, _viewer);
-						}
-					}
-					return _wizard;
-				}
-
-				public boolean isContentCreated() {
-					return _wizard != null;
-				}
-			};
-		}
-        return dropHandler;
-	}
-
-	/**
-	 * could be have next page or just directly perform the action.
-	 * 
-	 */
-	public void advanceToNextPage() {
-
-		getContainer().showPage(getNextPage());
-	}
-
-	/**
-	 * @param element
-	 * @return the text
-	 */
-	protected String getText(Object element) {
-		return ((FeedBackInfo) element).getDescription();
-	}
-
-	/**
-	 * @return the elements
-	 */
-	protected List getElements() {
-		return new ArrayList(this._feedbackToHandlers.keySet());
-	}
-
-	/**
-	 * @param widget
-	 */
-	public void setWidget(Node widget) {
-		_updateWidget = true;
-		_widget = widget;
-	}
-
-	/**
-	 * @param position
-	 */
-	public void setPosition(IDOMPosition position) {
-		_updateWidget = false;
-		_position = position;
-	}
-
-	/**
-	 * @return the current handler
-	 */
-	public Object getCurrentHandler() {
-		return _currentHandler;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.wizard.WizardSelectionPage#canFlipToNextPage()
-	 */
-	public boolean canFlipToNextPage() {
-		return getCurrentHandler() instanceof IWizardNode
-				&& super.canFlipToNextPage();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/SourceViewLocalDropCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/SourceViewLocalDropCommand.java
deleted file mode 100644
index b4e7fd4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/SourceViewLocalDropCommand.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd.internal;
-
-import org.eclipse.jst.pagedesigner.commands.SourceViewerCommand;
-import org.eclipse.jst.pagedesigner.editors.pagedesigner.PageDesignerResources;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-
-/**
- * @author mengbo
- */
-public class SourceViewLocalDropCommand extends SourceViewerCommand {
-	/**
-	 * the map from feedback to ILocalDropHandler
-	 */
-	private int _location;
-
-	private StructuredTextEditor _textEditor;
-
-	private Object _data;
-
-	/**
-	 * @param textEditor 
-	 * @param data 
-	 * @param location 
-	 * 
-	 */
-	public SourceViewLocalDropCommand(StructuredTextEditor textEditor,
-			Object data, int location) {
-		super(PageDesignerResources.getInstance().getString(
-				"SourceViewLocalDropCommand.Label.InsertSyntax"), textEditor); //$NON-NLS-1$
-		_textEditor = textEditor;
-		_data = data;
-		_location = location;
-	}
-
-	public void doExecute() {
-		_textEditor.getTextViewer().getTextWidget().insert((String) _data);
-	}
-
-	public void setSelection() {
-		_textEditor.getTextViewer().setSelectedRange(_location,
-				((String) _data).length());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/SourceViewerDragDropHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/SourceViewerDragDropHelper.java
deleted file mode 100644
index d596a2c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/SourceViewerDragDropHelper.java
+++ /dev/null
@@ -1,394 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd.internal;
-
-import org.eclipse.gef.SharedCursors;
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IRegion;
-import org.eclipse.jface.text.TextViewer;
-import org.eclipse.jface.text.source.ISourceViewer;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.EditValidateUtil;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.ST;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Cursor;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Caret;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
-import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-/**
- * This class will 1. determine it's insertion or update 2. call validator
- * corresponding helper to resolve it.
- * 
- * @author mengbo
- */
-public final class SourceViewerDragDropHelper {
-	private static SourceViewerDragDropHelper _instance;
-
-	/**
-	 * @return the singleton instance
-	 */
-	public static SourceViewerDragDropHelper getInstance() {
-		if (_instance == null) {
-			_instance = new SourceViewerDragDropHelper();
-		}
-		return _instance;
-	}
-
-	private SourceViewerDragDropHelper()
-	{
-	    // singleton, no external instantiation
-	}
-	
-	private Point toControl(TextViewer textViewer, Point point) {
-		return (textViewer != null ? textViewer.getTextWidget()
-				.toControl(point) : point);
-	}
-
-	private int getDropOffset(StructuredTextEditor ste, Point pt) {
-		StyledText st = ste.getTextViewer().getTextWidget();
-		int offset = st.getCaretOffset();
-		try {
-			offset = st.getOffsetAtLocation(pt);
-		} catch (IllegalArgumentException e) {
-			boolean found = false;
-			Point p = new Point((pt.x > 0 ? pt.x : 0), pt.y);
-			// search nearest character
-			for (; p.x > -1; p.x--) {
-				try {
-					offset = st.getOffsetAtLocation(p);
-
-					/*
-					 * Now that a valid offset has been found, try to place at
-					 * the end of the line
-					 */
-					if (ste.getTextViewer() != null
-							&& ste.getTextViewer().getDocument() != null) {
-						IRegion lineInfo = null;
-						try {
-							lineInfo = ste.getTextViewer().getDocument()
-									.getLineInformationOfOffset(offset);
-						} catch (BadLocationException e1) {
-                            // ignore exception and fall-through with lineInfo == null
-						}
-						if (lineInfo != null)
-							offset = lineInfo.getOffset()
-									+ lineInfo.getLength();
-					}
-
-					found = true;
-					break;
-				} catch (IllegalArgumentException ex) {
-					// for trying location, no need to catch.
-				}
-			}
-			if (!found) {
-				offset = st.getCharCount();
-			}
-		}
-		return offset;
-	}
-
-	/**
-	 * @param textEditor
-	 * @param location
-	 * @param caret
-	 */
-	public void updateCaret(StructuredTextEditor textEditor, Point location,
-			Point caret) {
-		TextViewer textViewer = textEditor.getTextViewer();
-		if (textViewer != null) {
-			Point pt = toControl(textViewer, location);
-			StyledText st = textViewer.getTextWidget();
-
-			// auto scroll
-			Rectangle ca = st.getClientArea();
-			int margin = st.getLineHeight();
-
-			if (pt.y < margin) { // up
-				st.invokeAction(ST.LINE_UP);
-			} else if (pt.y > ca.height - margin) { // down
-				st.invokeAction(ST.LINE_DOWN);
-			}
-
-			// draw insertion point
-			int offset = getDropOffset(textEditor, pt);
-			if (offset != st.getCaretOffset()) {
-				st.setCaretOffset(offset);
-				st.setSelection(offset);
-			}
-
-			Point newCaret = st.getLocationAtOffset(offset);
-			if (newCaret.equals(caret)) {
-				return;
-			}
-
-			Caret ct = st.getCaret();
-			Point size = ct.getSize();
-
-			GC gc = new GC(st);
-			//gc.setXORMode(true);
-			gc.setLineWidth(size.x);
-
-			// erase old caret
-			if (caret != null) {
-				Color originalForeground = gc.getForeground();
-				gc.setForeground(st.getBackground());
-				gc.drawLine(caret.x, caret.y, caret.x, caret.y + size.y);
-				gc.setForeground(originalForeground);
-			}
-
-			st.redraw();
-			st.update();
-
-			// draw new caret
-			if (caret == null) {
-				caret = newCaret;
-			} else {
-				caret.x = newCaret.x;
-				caret.y = newCaret.y;
-			}
-			if (ct.getImage() != null) {
-				gc.drawImage(ct.getImage(), caret.x, caret.y);
-			} else {
-				gc.drawLine(caret.x, caret.y, caret.x, caret.y + size.y);
-			}
-
-			gc.dispose();
-		}
-	}
-
-	/**
-	 * @param textEditor
-	 * @param location
-	 */
-	public void updateCaret(StructuredTextEditor textEditor, Point location) {
-		TextViewer textViewer = textEditor.getTextViewer();
-		if (textViewer != null) {
-			Point pt = toControl(textViewer, location);
-			StyledText st = textViewer.getTextWidget();
-
-			// auto scroll
-			Rectangle ca = st.getClientArea();
-			int margin = st.getLineHeight();
-
-			if (pt.y < margin) { // up
-				st.invokeAction(ST.LINE_UP);
-			} else if (pt.y > ca.height - margin) { // down
-				st.invokeAction(ST.LINE_DOWN);
-			}
-
-			// draw insertion point
-			int offset = getDropOffset(textEditor, pt);
-			if (offset != st.getCaretOffset()) {
-				st.setCaretOffset(offset);
-				st.setSelection(offset);
-			}
-		}
-	}
-
-	/**
-	 * @param textEditor
-	 * @param location
-	 * @return the caret offset
-	 */
-	public int showCaret(StructuredTextEditor textEditor, int location) {
-		StyledText text = textEditor.getTextViewer().getTextWidget();
-		text.setCursor(SharedCursors.CURSOR_TREE_ADD);
-		text.setCaretOffset(location);
-		if (!text.isFocusControl()) {
-			text.setFocus();
-		}
-		return text.getCaretOffset();
-	}
-
-	/**
-	 * @param node
-	 * @return the model query for the node or null if not available
-	 */
-	protected ModelQuery getModelQuery(Node node) {
-		if (node.getNodeType() == Node.DOCUMENT_NODE) {
-			return ModelQueryUtil.getModelQuery((Document) node);
-		}
-        return ModelQueryUtil.getModelQuery(node.getOwnerDocument());
-	}
-
-	/**
-	 * @param caretPos
-	 * @param element
-	 * @return the position 
-	 */
-	public IDOMPosition findPosition(int caretPos, Node element) {
-		EditValidateUtil.validNode(element);
-		IDOMPosition position = EditModelQuery.getInstance().createDomposition(
-				((IDOMNode) element).getModel(), caretPos, false);
-		return position;
-	}
-
-	/**
-	 * @param viewer
-	 * @param node
-	 */
-	public void format(TextViewer viewer, Node node) {
-		if (node == null) {
-			return;
-		}
-		Node tmp;
-		int start, offset;
-		if (node.getPreviousSibling() != null) {
-			tmp = node.getPreviousSibling();
-			start = ((IndexedRegion) tmp).getEndOffset();
-		} else {
-			tmp = node;
-			start = ((IndexedRegion) tmp).getStartOffset();
-		}
-		if (node.getNextSibling() != null) {
-			tmp = node.getNextSibling();
-			offset = ((IndexedRegion) tmp).getStartOffset() - start;
-		} else {
-			tmp = node;
-			offset = ((IndexedRegion) tmp).getEndOffset() - start;
-		}
-		viewer.setSelectedRange(start, offset);
-		viewer.doOperation(ISourceViewer.FORMAT);
-	}
-
-	/**
-	 * @param textEditor
-	 * @param reset
-	 */
-	public void changeCaret(StructuredTextEditor textEditor, boolean reset) {
-		if (reset) {
-			StyledText text = textEditor.getTextViewer().getTextWidget();
-			text.setCursor(new Cursor(null, SWT.CURSOR_IBEAM));
-		}
-	}
-
-	/**
-	 * @param textEditor
-	 * @param locationOffset
-	 * @return the location offset
-	 */
-	public int getValidLocation(StructuredTextEditor textEditor,
-			int locationOffset) {
-		Node node = getCaretNode(textEditor, locationOffset);
-		if (node == null) {
-			// empty page?
-			return 0;
-		}
-		if (node.getNodeType() == Node.TEXT_NODE) {
-			return locationOffset;
-		}
-		return calculateCaretLocation(node, locationOffset);
-	}
-
-	/**
-	 * @param textEditor
-	 * @param location
-	 * @return the offset
-	 */
-	public int getOffset(StructuredTextEditor textEditor, Point location) {
-		StyledText text = textEditor.getTextViewer().getTextWidget();
-		return text.getOffsetAtLocation(location);
-	}
-
-	// private IStructuredModel getModel(StructuredTextEditor textEditor)
-	// {
-	// IStructuredModel model = null;
-	// if (textEditor.getDocumentProvider() != null)
-	// {
-	// if (textEditor.getDocumentProvider() instanceof IModelProvider)
-	// {
-	// model = ((IModelProvider)
-	// textEditor.getDocumentProvider()).getModel(textEditor.getEditorInput());
-	// }
-	// else
-	// {
-	// IDocument doc =
-	// textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput());
-	// if (doc instanceof IDocument)
-	// {
-	// model =
-	// StructuredModelManager.getModelManager().getExistingModelForEdit(doc);
-	// if (model == null)
-	// {
-	// model =
-	// StructuredModelManager.getModelManager().getExistingModelForEdit((IDocument)
-	// doc);
-	// }
-	// }
-	// }
-	// }
-	// return model;
-	// }
-
-	/**
-	 * @param textEditor
-	 * @param pos
-	 * @return the node
-	 */
-	public Node getCaretNode(StructuredTextEditor textEditor, int pos) {
-        // TODO: getModel is deprecated
-		IStructuredModel model = textEditor.getModel();
-		// getModel(textEditor);
-		if (model == null) {
-			return null;
-		}
-		IndexedRegion inode = model.getIndexedRegion(pos);
-		if (inode == null) {
-			inode = model.getIndexedRegion(pos - 1);
-		}
-		return (inode instanceof Node) ? (Node) inode : null;
-	}
-
-	/**
-	 * Calculate and adjust the location in compare with Node.
-	 * 
-	 * @param node
-	 * @param location
-	 * @return the location
-	 */
-	public int calculateCaretLocation(Node node, int location) {
-		int pos[][] = new int[2][2];
-		pos[0][0] = EditModelQuery.getNodeStartIndex(node);
-		pos[0][1] = EditModelQuery.getNodeStartNameEndIndex(node);
-		pos[1][0] = EditModelQuery.getNodeEndNameStartIndex(node);
-		pos[1][1] = EditModelQuery.getNodeEndIndex(node);
-		if (pos[0][0] >= location || pos[1][0] == location
-				|| pos[1][1] <= location) {
-			return location;
-		} else if (pos[0][0] <= location && pos[0][1] >= location) {
-			if (((pos[0][1] + pos[0][0]) / 2) >= location) {
-				return pos[0][0];
-			}
-            return pos[0][1];
-		} else if (pos[1][0] <= location && pos[1][1] >= location) {
-			if (((pos[1][1] + pos[1][0]) / 2) >= location) {
-				return pos[1][0];
-			}
-            return pos[1][1];
-		}
-		return location;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/TextEditorDropTargetListenerFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/TextEditorDropTargetListenerFactory.java
deleted file mode 100644
index 538bb97..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/TextEditorDropTargetListenerFactory.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dnd.internal;
-
-import org.eclipse.core.runtime.IAdapterFactory;
-import org.eclipse.jst.pagedesigner.editors.DesignerStructuredTextEditorJSP;
-import org.eclipse.ui.texteditor.ITextEditorDropTargetListener;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-
-/**
- * @author mengbo
- */
-public class TextEditorDropTargetListenerFactory implements IAdapterFactory {
-
-	/**
-	 * 
-	 */
-	public TextEditorDropTargetListenerFactory() {
-		super();
-		// TODO Auto-generated constructor stub
-	}
-
-	public Object getAdapter(Object adaptableObject, Class adapterType) {
-		if (ITextEditorDropTargetListener.class.equals(adapterType)) {
-			if (adaptableObject instanceof DesignerStructuredTextEditorJSP) {
-				DesignerSourceDropTargetListener listener = new DesignerSourceDropTargetListener(
-						(StructuredTextEditor) adaptableObject);
-				return listener;
-			}
-
-		}
-		return null;
-
-	}
-
-	public Class[] getAdapterList() {
-		Class[] classes = new Class[1];
-		classes[0] = ITextEditorDropTargetListener.class;
-		return classes;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/messages.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/messages.properties
deleted file mode 100644
index 654d9ee..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/messages.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-DropSelectionWizard.Title=Drop Operation Handling
-SimpleWizardSelectionPage.PageName=Select Operation
-SimpleWizardSelectionPage.Title=Select Operation
-SimpleWizardSelectionPage.Description=Select Action
-SimpleWizardSelectionPage.Message=Select the operation you want to perform from the following list
-SimpleWizardSelectionPage.Operation=Operations:
-LocalDropCommand.DropHandler=Drop Handler
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/CaretMoveIterator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/CaretMoveIterator.java
deleted file mode 100644
index d4e8d63..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/CaretMoveIterator.java
+++ /dev/null
@@ -1,271 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.utils.HTMLUtil;
-import org.eclipse.jst.pagedesigner.validation.caret.IMovementMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.Target;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-import org.w3c.dom.traversal.NodeIterator;
-
-/**
- * @author mengbo
- */
-public class CaretMoveIterator {
-	private final static Logger _log = PDPlugin
-			.getLogger(CaretMoveIterator.class);
-
-	private final boolean INNER_DEBUG = false;
-
-	private NodeIterator _nodeIterator;
-
-	private IMovementMediator _validator;
-
-	private IDOMPosition _currentPosition;
-
-	private boolean _forward;
-
-	/**
-	 * @param nodeIterator 
-	 * @param validator 
-	 * @param position 
-	 * @param forward 
-	 */
-	public CaretMoveIterator(NodeIterator nodeIterator,
-			IMovementMediator validator, IDOMPosition position, boolean forward) {
-		super();
-		_nodeIterator = nodeIterator;
-		_validator = validator;
-		_currentPosition = position;
-		_forward = forward;
-	}
-
-	/**
-	 * @return the node iterator
-	 */
-	public NodeIterator getNodeIterator() {
-		return _nodeIterator;
-	}
-
-	/**
-	 * @return Returns the _currentPosition.
-	 */
-	public IDOMPosition getCurrentPosition() {
-		return _currentPosition;
-	}
-
-	/**
-	 * @param position
-	 *            The _currentPosition to set.
-	 */
-	public void setCurrentPosition(IDOMPosition position) {
-		_currentPosition = position;
-	}
-
-	// assume the currentPosition is invalid
-	private IDOMPosition moveOut(Node container) {
-		IDOMPosition result = new DOMRefPosition(container, _forward);
-		String name = container.getNodeName();
-		if (name != null
-				&& EditModelQuery.HTML_STYLE_NODES.contains(name.toLowerCase())) {
-			result = moveToNextPosition(result, _validator);
-		}
-		return result;
-	}
-
-	/**
-	 * @param node
-	 * @return the dom position
-	 */
-	public IDOMPosition moveIn(Node node) {
-		IDOMPosition result = null;
-		if (INNER_DEBUG) {
-			_log.info("- Move into: " + node.getLocalName());
-		}
-		if (_validator.isEditable(new Target(node))) {
-			int index;
-			// Transparent text is not editable, so this is not transparent.
-			if (EditModelQuery.isText(node)) {
-				index = (_forward) ? 0 : ((Text) node).getData().length();
-				result = new DOMPosition(node, index);
-				// move ahead one pos.
-				IDOMPosition pos = getNextTextPosition(result);
-				if (pos != null) {
-					result = pos;
-				}
-			} else {
-				if (node.hasChildNodes()) {
-					index = _forward ? 0 : node.getChildNodes().getLength();
-					result = new DOMPosition(node, index); // DOMRefPosition(next,
-					// !_forward);
-				} else {
-					result = new DOMPosition(node, 0);
-				}
-			}
-		} else {
-			if (node.hasChildNodes()) {
-				Node child = _forward ? node.getFirstChild() : node
-						.getLastChild();
-				result = new DOMRefPosition(child, _forward);
-				while (child != null) {
-					if (_validator.allowsMoveIn(new Target(child))) {
-						result = moveIn(child);
-						break;
-					}
-					child = _forward ? child.getNextSibling() : child
-							.getPreviousSibling();
-				}
-			} else {
-				// Should be impposible to reach here.
-				result = new DOMPosition(node, 0);
-			}
-		}
-		return result;
-	}
-
-	private IDOMPosition getNextTextPosition(IDOMPosition position) {
-		IDOMPosition result = null;
-		String value = position.getContainerNode().getNodeValue();
-		int i = position.getOffset();
-		if (_forward) {
-			if (i < value.length()) {
-				if (HTMLUtil.isHTMLWhitespace(value.charAt(i))) {
-					while (i < value.length()
-							&& HTMLUtil.isHTMLWhitespace(value.charAt(i))) {
-						i++;
-					}
-					result = new DOMPosition(position.getContainerNode(), i);
-				} else if (i < value.length()) {
-					result = new DOMPosition(position.getContainerNode(), i + 1);
-				}
-			}
-		} else {
-			if (i > 0) {
-				if (HTMLUtil.isHTMLWhitespace(value.charAt(i - 1))) {
-					while (i > 0
-							&& HTMLUtil.isHTMLWhitespace(value.charAt(i - 1))) {
-						i--;
-					}
-					result = new DOMPosition(position.getContainerNode(), i);
-				} else if (i > 0) {
-					result = new DOMPosition(position.getContainerNode(), i - 1);
-				}
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Assume the original position are valid.
-	 * 
-	 * @param position
-	 * @param validator
-	 * @param _forward
-	 * @param referenceImediatly
-	 * @return
-	 */
-	private IDOMPosition moveToNextPosition(IDOMPosition position,
-			IMovementMediator validator) {
-		IDOMPosition currentPosition = null;
-		if (validator.isValidPosition(position) && position.isText()) {
-			currentPosition = getNextTextPosition(position);
-		}
-		if (currentPosition == null) {
-			Node nextNode = EditModelQuery.getInstance().getSibling(position,
-					_forward);
-			while (EditModelQuery.isText(nextNode)
-					&& ((Text) nextNode).getData().length() == 0) {
-				nextNode = EditModelQuery.getInstance().getSibling(nextNode,
-						_forward);
-			}
-			if (nextNode != null) {
-				// move in?
-				if (validator.allowsMoveIn(new Target(nextNode))) {
-					currentPosition = moveIn(nextNode);
-					// Stop when it is in table. For others we continue search
-					// for text.
-					if (!canStopHere(nextNode) && //
-							EditModelQuery.getInstance().getSibling(
-									currentPosition, _forward) != null) {
-						currentPosition = moveToNextPosition(currentPosition,
-								validator);
-					}
-				}
-				// not allowed to move in. e.g. it's empty string.
-				else {
-					currentPosition = new DOMRefPosition(nextNode, _forward);// skip(position);
-				}
-			} else {
-				if (validator.allowsMoveOut(new Target(
-						getNaviContainer(position)))) {
-					currentPosition = moveOut(getNaviContainer(position));
-				}
-			}
-		}
-		currentPosition = EditHelper.ensureDOMPosition(currentPosition);
-		if (currentPosition != null
-				&& !validator.isValidPosition(currentPosition)) {
-			currentPosition = moveToNextPosition(currentPosition, validator);
-		}
-		return currentPosition;
-	}
-
-	/**
-	 * When the tag starts from new line, or in table, then caret can be put at
-	 * 0 offset.
-	 * 
-	 * @param node
-	 * @return
-	 */
-	private boolean canStopHere(Node node) {
-		boolean result = false;
-		if (EditModelQuery.isText(node)) {
-			result = true;
-		} else if (node != null && node.getNodeName() != null) {
-			result |= node.getNodeName().equals(IHTMLConstants.TAG_TD);
-			result |= EditModelQuery.isBlockNode(node);
-		}
-		return result;
-	}
-
-	/**
-	 * Move operation position to next edit position. We may need rule to valid
-	 * it based on operation ID and direction. We need to pack transparent
-	 * string.
-	 * 
-	 * @param currentPosition
-	 * @param forward
-	 * @param validator
-	 * @return the dom position
-	 */
-	public IDOMPosition moveToNextEditPosition(IDOMPosition currentPosition,
-			boolean forward, IMovementMediator validator) {
-		IDOMPosition result = null;
-		if ((currentPosition = moveToNextPosition(currentPosition, validator)) != null) {
-			result = currentPosition;
-		} else {
-			result = _currentPosition;
-		}
-		return result;
-	}
-
-	private Node getNaviContainer(IDOMPosition position) {
-		if (position.isText()) {
-			return position.getContainerNode().getParentNode();
-		}
-        return position.getContainerNode();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMPosition.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMPosition.java
deleted file mode 100644
index ca840d2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMPosition.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public class DOMPosition implements IDOMPosition {
-	Node _containerNode;
-
-	int _offset;
-
-	/**
-	 * @param containerNode
-	 * @param offset
-	 */
-	public DOMPosition(Node containerNode, int offset) {
-		_containerNode = containerNode;
-		_offset = offset;
-	}
-
-	/**
-	 * this is the offset in the DOM tree. When parent node is text node, the
-	 * offset if the offset into the actual displayed data of the text node.
-	 * 
-	 * when parent is not text node, then the offset is the index in
-	 * getIDOMNode().getChildNodes()
-	 * 
-	 * @return the offset
-	 */
-	public int getOffset() {
-		return _offset;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.range.IDOMPosition#getNextSiblingNode()
-	 */
-	public Node getNextSiblingNode() {
-		if (isText())
-			return null;
-		NodeList children = _containerNode.getChildNodes();
-		int length = children.getLength();
-		if (_offset >= length || _offset < 0)
-			return null;
-        return children.item(_offset);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.range.IDOMPosition#getPreviousSiblingNode()
-	 */
-	public Node getPreviousSiblingNode() {
-		if (isText())
-			return null;
-		NodeList children = _containerNode.getChildNodes();
-		int length = children.getLength();
-		if (_offset > length || _offset <= 0)
-			return null;
-        return children.item(_offset - 1);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.range.IDOMPosition#getContainerNode()
-	 */
-	public Node getContainerNode() {
-		return _containerNode;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.range.IDOMPosition#isText()
-	 */
-	public boolean isText() {
-		return _containerNode instanceof Text;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.range.IDOMPosition#getSibling(boolean)
-	 */
-	public Node getSibling(boolean forward) {
-		if (forward)
-			return getNextSiblingNode();
-        return getPreviousSiblingNode();
-	}
-
-	public IDOMPosition handleReplacement(Node original, Node replacement) {
-		if (original == this._containerNode) {
-			return new DOMPosition(replacement, this._offset);
-		}
-        return this;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return "DOMPosition: (" + _containerNode + " : " + _offset + ")";
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMPositionHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMPositionHelper.java
deleted file mode 100644
index d0e77f8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMPositionHelper.java
+++ /dev/null
@@ -1,395 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.parts.TextEditPart;
-import org.eclipse.jst.pagedesigner.utils.HTMLUtil;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRefPosition;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public class DOMPositionHelper {
-	/**
-	 * @param position
-	 * @return the design position
-	 */
-	public static DesignPosition toDesignRefPosition(DOMRefPosition position) {
-		Node node = position.getReferenceNode();
-		do {
-			IDOMNode container = (IDOMNode) node.getParentNode();
-			EditPart part = (EditPart) container.getAdapterFor(EditPart.class);
-			if (part != null) {
-				// XXX: what if the node has not corresponding part?
-				EditPart child = DOMPositionHelper.findEditPart(part, node);
-				if (child != null) {
-					return new DesignRefPosition(child, position.isForward());
-				}
-                return DesignPosition.INVALID;
-			}
-            node = node.getParentNode();
-		} while (true);
-	}
-
-	/**
-	 * 
-	 * @param position
-	 *            if it is null, then will return null
-	 * @return null if position is null or invalid.
-	 */
-	public static DesignPosition toDesignPosition(IDOMPosition position) {
-		if (position == null) {
-			return null;
-		}
-		if (position instanceof DOMRefPosition) {
-			return toDesignRefPosition((DOMRefPosition) position);
-		}
-		do {
-			IDOMNode container = (IDOMNode) position.getContainerNode();
-			EditPart part = (EditPart) container.getAdapterFor(EditPart.class);
-			if (part != null) {
-				if (container instanceof Text) {
-					String textData = ((Text) container).getData();
-					String displayData = ((TextEditPart) part).getTextData();
-					return new DesignPosition(part,
-							textDataOffsetToDisplayOffset(textData,
-									displayData, position.getOffset()));
-				}
-                Node pre = position.getPreviousSiblingNode();
-                while (pre != null) {
-                	int index = findChildEditPartIndex(part, pre);
-                	if (index != -1) {
-                		return new DesignPosition(part, index + 1);
-                	}
-                	pre = pre.getPreviousSibling();
-                }
-                return new DesignPosition(part, 0);
-			}
-            position = new DOMRefPosition(position.getContainerNode(),
-            		false);
-		} while (true);
-	}
-
-	/**
-	 * Here is the position is not currect, currently it will returns invalid
-	 * pos.
-	 * 
-	 * @param position
-	 * @return the design position
-	 */
-	public static DesignPosition toDesignPosition1(IDOMPosition position) {
-		if (position instanceof DOMRefPosition) {
-			return toDesignRefPosition((DOMRefPosition) position);
-		}
-		do {
-			IDOMNode container = (IDOMNode) position.getContainerNode();
-			EditPart part = (EditPart) container.getAdapterFor(EditPart.class);
-			if (part != null) {
-				if (container instanceof Text) {
-					String textData = ((Text) container).getData();
-					String displayData = ((TextEditPart) part).getTextData();
-					return new DesignPosition(part,
-							textDataOffsetToDisplayOffset(textData,
-									displayData, position.getOffset()));
-				}
-                Node pre = position.getPreviousSiblingNode();
-                while (pre != null) {
-                	int index = findChildEditPartIndex(part, pre);
-                	if (index != -1) {
-                		return new DesignPosition(part, index + 1);
-                	}
-                	pre = pre.getPreviousSibling();
-                }
-                return new DesignPosition(part, 0);
-			}
-            return DesignPosition.INVALID;
-		} while (true);
-	}
-
-	static int findChildEditPartIndex(EditPart parent, Node node) {
-		List children = parent.getChildren();
-		for (int i = 0; i < children.size(); i++) {
-			if (((EditPart) children.get(i)).getModel() == node) {
-				return i;
-			}
-		}
-		return -1;
-	}
-
-	static EditPart findEditPart(EditPart parent, Node node) {
-		List children = parent.getChildren();
-		EditPart part;
-		for (int i = 0; i < children.size(); i++) {
-			if ((part = (EditPart) children.get(i)).getModel() == node) {
-				return part;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * convert a DesignPosition into DOMPosition.
-	 * 
-	 * @param position
-	 * @return the dom position
-	 */
-	public static IDOMPosition toDOMRefPosition(DesignRefPosition position) {
-		// ok, it is not text.
-		EditPart sibling = position.getRefPart();
-		if (sibling != null) {
-			return new DOMRefPosition((Node) sibling.getModel(), position
-					.caretIsAtRight());
-		}
-		// should never happens
-		Assert.isTrue(false);
-		return null;
-	}
-
-	/**
-	 * convert a DesignPosition into DOMPosition.
-	 * 
-	 * @param position
-	 * @return the dom position
-	 */
-	public static IDOMPosition toDOMPosition(DesignPosition position) {
-		if (!EditValidateUtil.validPosition(position)) {
-			return null;
-		} else if (position instanceof DesignRefPosition) {
-			return toDOMRefPosition((DesignRefPosition) position);
-		}
-		EditPart part = position.getContainerPart();
-		if (part instanceof TextEditPart) {
-			Text text = (Text) ((TextEditPart) part).getIDOMNode();
-			int offset = position.getOffset();
-			if (offset == 0) {
-				return new DOMPosition(text, 0);
-			}
-            String displayData = ((TextEditPart) part).getTextData();
-            String nodeData = text.getData();
-            if (offset >= displayData.length()) {
-            	// point to end of the text node.
-            	return new DOMPosition(text, nodeData.length());
-            }
-            // we need to calculate it out.
-            int index = displayOffsetToTextDataOffset(displayData,
-            		nodeData, offset);
-            return new DOMPosition(text, index);
-		}
-        // ok, it is not text.
-        EditPart sibling = position.getSiblingEditPart(true);
-        if (sibling instanceof NodeEditPart) {
-        	return new DOMRefPosition(((NodeEditPart) sibling).getDOMNode(), false);
-        }
-
-        sibling = position.getSiblingEditPart(false);
-        if (sibling instanceof NodeEditPart) {
-        	return new DOMRefPosition(((NodeEditPart) sibling).getDOMNode(), true);
-        }
-
-        // no previous sibling, no next sibling, the parent node must be
-        // empty
-        return new DOMPosition(((NodeEditPart) part).getDOMNode(), 0);
-	}
-
-	/**
-	 * if "position" is inside a text node, then split the text node and return
-	 * a new IDOMPosition semantically equal to the position in the two
-	 * splitted text. If the "position" is not a text position, then no action
-	 * will be taken and will return the original position.
-	 * 
-	 * @param position
-	 * @return IDOMPosition
-	 */
-	public static IDOMPosition splitText(IDOMPosition position) {
-		Node container = position.getContainerNode();
-		if (container instanceof Text) {
-			int offset = position.getOffset();
-			if (offset <= 0) {
-				// at beginning of text node. no need to split
-				return new DOMRefPosition(container, false);
-			}
-			String textData = ((Text) container).getData();
-			if (offset >= textData.length()) {
-				// at end of text node. no need to split
-				return new DOMRefPosition(container, true);
-			}
-			// ok, we need split
-			((Text) container).splitText(offset);
-			return new DOMRefPosition(container, true);
-		}
-        return position;
-	}
-
-	/**
-	 * Remove all the content in the range. And return the new position.
-	 * 
-	 * @param range
-	 * @return the dom position
-	 */
-	public static IDOMPosition removeRange(DOMRange range) {
-		boolean ordered = range.isOrdered();
-//		IDOMPosition start = ordered ? range.getStartPosition() : range
-//				.getEndPosition();
-		IDOMPosition end = ordered ? range.getEndPosition() : range
-				.getStartPosition();
-
-		// FIXME: Not DONE:
-		return end;
-	}
-
-	/**
-	 * try to merge the position in adjacent text node (if it is not already in)
-	 * 
-	 * @param position
-	 * @return the dom position
-	 */
-	public static IDOMPosition mergeIntoText(IDOMPosition position) {
-		if (position.getContainerNode() instanceof Text)
-			return position;
-		Node pre = position.getPreviousSiblingNode();
-		if (pre instanceof Text) {
-			return new DOMPosition(pre, ((Text) pre).getData().length());
-		}
-		Node after = position.getNextSiblingNode();
-		if (after instanceof Text) {
-			return new DOMPosition(after, 0);
-		}
-		return position;
-	}
-
-	/**
-	 * @param displayData
-	 * @param nodeData
-	 * @param offset
-	 * @return the offset
-	 */
-	// FIXME: this method is still buggy
-	public static int displayOffsetToTextDataOffset(String displayData,
-			String nodeData, int offset) {
-		char[] display = displayData.toCharArray();
-		if (offset >= display.length) {
-			// offset is already at end
-			return nodeData.length();
-		}
-		char[] node = nodeData.toCharArray();
-		int nodeDataLength = node.length;
-		int displayIndex = 0;
-		int nodeIndex = 0;
-
-		while (displayIndex < offset && nodeIndex < nodeDataLength) {
-			if (display[displayIndex] == node[nodeIndex]) {
-				displayIndex++;
-				nodeIndex++;
-				continue;
-			}
-			if (HTMLUtil.isHTMLWhitespace(node[nodeIndex])) {
-				if (HTMLUtil.isHTMLWhitespace(display[displayIndex])) {
-					displayIndex++;
-					nodeIndex++;
-				} else {
-					nodeIndex++;
-				}
-				continue;
-			}
-            // should not happen!
-            displayIndex++;
-            nodeIndex++;
-		}
-
-		if (nodeIndex >= nodeDataLength)
-			return nodeDataLength;
-		// else means displayIndex == offset
-		// since we already checked that offset < displayLength, so we can get
-		// the next char
-		if (display[offset] != ' ') {
-			// we may need to skip whitespaces after nodeIndex
-			while (nodeIndex < nodeDataLength
-					&& HTMLUtil.isHTMLWhitespace(node[nodeIndex])) {
-				nodeIndex++;
-			}
-		}
-		return nodeIndex;
-	}
-
-	/**
-	 * @param nodeData 
-	 * @param displayData
-	 * @param offset
-	 * @return the offset
-	 */
-	// FIXME: this method is still buggy
-	public static int textDataOffsetToDisplayOffset(String nodeData,
-			String displayData, int offset) {
-		if (offset >= nodeData.length()) {
-			return displayData.length();
-		}
-		char[] node = nodeData.toCharArray();
-		char[] display = displayData.toCharArray();
-
-		int displayIndex = 0;
-		int nodeIndex = 0;
-		int displayDataLength = display.length;
-
-		while (nodeIndex < offset && displayIndex < displayDataLength) {
-			if (display[displayIndex] == node[nodeIndex]) {
-				displayIndex++;
-				nodeIndex++;
-				continue;
-			}
-			if (HTMLUtil.isHTMLWhitespace(node[nodeIndex])) {
-				if (HTMLUtil.isHTMLWhitespace(display[displayIndex])) {
-					displayIndex++;
-					nodeIndex++;
-				} else {
-					nodeIndex++;
-				}
-				continue;
-			}
-            // should not happen!
-            displayIndex++;
-            nodeIndex++;
-		}
-		return displayIndex;
-	}
-
-	/**
-	 * Convert a IDOMPosition to IDOMRefPosition. If can't convert to
-	 * IDOMRefPosition, will return the original one.
-	 * 
-	 * @param position
-	 * @return IDOMPosition
-	 */
-	public static IDOMPosition toDOMRefPosition(IDOMPosition position) {
-		if (position.isText()) {
-			return position; // can't convert Text node.
-		}
-		if (position instanceof IDOMRefPosition) {
-			return position;
-		}
-		if (position.getNextSiblingNode() != null) {
-			return new DOMRefPosition(position.getNextSiblingNode(), false);
-		}
-		if (position.getPreviousSiblingNode() != null) {
-			return new DOMRefPosition(position.getPreviousSiblingNode(), true);
-		}
-        return new DOMRefPosition2(position.getContainerNode(), true);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMRange.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMRange.java
deleted file mode 100644
index f35dfda..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMRange.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class DOMRange {
-	IDOMPosition _start;
-
-	IDOMPosition _end;
-
-	/**
-	 * @param p1
-	 * @param p2
-	 */
-	public DOMRange(IDOMPosition p1, IDOMPosition p2) {
-		_start = p1;
-		_end = p2;
-	}
-
-	/**
-	 * @return the start position
-	 */
-	public IDOMPosition getStartPosition() {
-		return _start;
-	}
-
-	/**
-	 * @return the end position
-	 */
-	public IDOMPosition getEndPosition() {
-		return _end;
-	}
-
-	/**
-	 * @return true if is empty
-	 */
-	public boolean isEmpty() {
-		return _start.getContainerNode() == _end.getContainerNode()
-				&& _start.getOffset() == _end.getOffset();
-	}
-
-	/**
-	 * @return true if is ordered
-	 */
-	public boolean isOrdered() {
-		Node common = DOMUtil.findCommonAncester(_start.getContainerNode(),
-				_end.getContainerNode());
-		if (common == null) {
-			return true;
-		}
-		IDOMPosition s = moveUp(_start, common);
-		IDOMPosition e = moveUp(_end, common);
-		return e.getOffset() >= s.getOffset();
-	}
-
-	private IDOMPosition moveUp(IDOMPosition p, Node ancester) {
-		while (p.getContainerNode() != ancester) {
-			p = new DOMRefPosition(p.getContainerNode(), false);
-		}
-		return p;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMRangeHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMRangeHelper.java
deleted file mode 100644
index 1c7a33c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMRangeHelper.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public final class DOMRangeHelper {
-	/**
-	 * @param range
-	 * @return the dom range
-	 */
-	public static DOMRange toDOMRange(DesignRange range) {
-		if (range.getStartPosition() == range.getEndPosition()) {
-			IDOMPosition dp = DOMPositionHelper.toDOMPosition(range
-					.getStartPosition());
-			return new DOMRange(dp, dp);
-		}
-        return new DOMRange(DOMPositionHelper.toDOMPosition(range
-        		.getStartPosition()), DOMPositionHelper.toDOMPosition(range
-        		.getEndPosition()));
-	}
-
-	/**
-	 * @param range
-	 * @return the design range
-	 */
-	public static DesignRange toDesignRange(DOMRange range) {
-		if (range.getStartPosition() == range.getEndPosition()) {
-			DesignPosition dp = DOMPositionHelper.toDesignPosition(range
-					.getStartPosition());
-			return new DesignRange(dp, dp);
-		}
-		return new DesignRange(DOMPositionHelper.toDesignPosition(range
-				.getStartPosition()), DOMPositionHelper.toDesignPosition(range
-				.getEndPosition()));
-	}
-
-	/**
-	 * @param range
-	 * @param original
-	 * @param replacement
-	 * @return the dom range
-	 */
-	public static DOMRange handleReplacement(DOMRange range, Node original,
-			Node replacement) {
-		if (range.getStartPosition() == range.getEndPosition()) {
-			IDOMPosition pos = range.getStartPosition().handleReplacement(
-					original, replacement);
-			return new DOMRange(pos, pos);
-		}
-        return new DOMRange(range.getStartPosition().handleReplacement(
-        		original, replacement), range.getEndPosition()
-        		.handleReplacement(original, replacement));
-	}
-	
-	private DOMRangeHelper()
-	{
-	    // util class, no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMRefPosition.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMRefPosition.java
deleted file mode 100644
index 634e855..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMRefPosition.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * DOMRefPosition is another way to identify a position in the document tree. It
- * has the advantage against the DOMPosition, that even something change in the
- * document, DOMRefPosition may still reference the correct position.
- * 
- * @author mengbo
- */
-public class DOMRefPosition implements IDOMRefPosition {
-	Node _refNode;
-
-	boolean _forward;
-
-	/**
-	 * @param refNode
-	 * @param forward
-	 *            true means the position after refNode. false means the
-	 *            position before refNode
-	 */
-	public DOMRefPosition(Node refNode, boolean forward) {
-		_refNode = refNode;
-		_forward = forward;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.range.IDOMPosition#getSibling(boolean)
-	 */
-	public Node getSibling(boolean forward) {
-		if (forward != _forward)
-        {
-		    return _refNode;
-        }
-		if (forward)
-        {
-			return _refNode.getNextSibling();
-        }
-        return _refNode.getPreviousSibling();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.range.IDOMPosition#getNextSiblingNode()
-	 */
-	public Node getNextSiblingNode() {
-		return getSibling(true);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.range.IDOMPosition#getPreviousSiblingNode()
-	 */
-	public Node getPreviousSiblingNode() {
-		return getSibling(false);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.range.IDOMPosition#getContainerNode()
-	 */
-	public Node getContainerNode() {
-		return _refNode.getParentNode();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.range.IDOMPosition#getOffset()
-	 */
-	public int getOffset() {
-		Node parent = _refNode.getParentNode();
-		if (parent == null) {
-			return _forward ? 1 : 0;
-		}
-        NodeList list = parent.getChildNodes();
-        for (int i = 0, n = list.getLength(); i < n; i++) {
-        	if (list.item(i) == _refNode) {
-        		return _forward ? (i + 1) : i;
-        	}
-        }
-        // should not happen.
-        return -1;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.range.IDOMPosition#isText()
-	 */
-	public boolean isText() {
-		return false;
-	}
-
-	public IDOMPosition handleReplacement(Node original, Node replacement) {
-		if (this._refNode == original) {
-			return new DOMRefPosition(replacement, this._forward);
-		}
-        return this;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return "DOMRefPosition: (" + (_forward ? "after " : "before ")
-				+ _refNode + ")";
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.dom.IDOMRefPosition#getReferenceNode()
-	 */
-	public Node getReferenceNode() {
-		return _refNode;
-	}
-
-	/**
-	 * @return true if is forward
-	 */
-	public boolean isForward() {
-		return _forward;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMRefPosition2.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMRefPosition2.java
deleted file mode 100644
index 3da9127..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMRefPosition2.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import org.w3c.dom.Node;
-
-/**
- * This ref position use a parent node as reference. And provide whether this
- * location is at the beginning of its parent or last of its parent.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class DOMRefPosition2 implements IDOMRefPosition {
-	Node _parentNode;
-
-	boolean _last;
-
-	/**
-	 * @param parent 
-	 * @param last 
-	 */
-	public DOMRefPosition2(Node parent, boolean last) {
-		_parentNode = parent;
-		_last = last;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.dom.IDOMRefPosition#getReferenceNode()
-	 */
-	public Node getReferenceNode() {
-		return _parentNode;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.dom.IDOMPosition#getSibling(boolean)
-	 */
-	public Node getSibling(boolean forward) {
-		if (forward) {
-			if (_last) {
-				return null;
-			}
-            return _parentNode.getFirstChild();
-		} else if (_last) {
-        	return _parentNode.getLastChild();
-        } else {
-        	return null;
-        }
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.dom.IDOMPosition#getNextSiblingNode()
-	 */
-	public Node getNextSiblingNode() {
-		return getSibling(true);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.dom.IDOMPosition#getPreviousSiblingNode()
-	 */
-	public Node getPreviousSiblingNode() {
-		return getSibling(false);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.dom.IDOMPosition#getContainerNode()
-	 */
-	public Node getContainerNode() {
-		return _parentNode;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.dom.IDOMPosition#getOffset()
-	 */
-	public int getOffset() {
-		if (!_last) {
-			return 0;
-		}
-        return _parentNode.getChildNodes().getLength();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.dom.IDOMPosition#isText()
-	 */
-	public boolean isText() {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.dom.IDOMPosition#handleReplacement(org.w3c.dom.Node,
-	 *      org.w3c.dom.Node)
-	 */
-	public IDOMPosition handleReplacement(Node original, Node replacement) {
-		if (original == _parentNode) {
-			return new DOMRefPosition2(replacement, _last);
-		}
-        return this;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMStyleUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMStyleUtil.java
deleted file mode 100644
index 637d6d4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMStyleUtil.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import java.util.Iterator;
-import java.util.Map;
-import java.util.StringTokenizer;
-
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-import org.w3c.dom.css.CSSStyleDeclaration;
-import org.w3c.dom.css.ElementCSSInlineStyle;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public final class DOMStyleUtil {
-	/**
-	 * @param original
-	 * @param cssProperty
-	 * @return the inline style property
-	 */
-	public static String getInlineStyleProperty(Element original,
-			String cssProperty) {
-		if (original instanceof ElementCSSInlineStyle) {
-			CSSStyleDeclaration styledecl = ((ElementCSSInlineStyle) original)
-					.getStyle();
-			if (styledecl == null) {
-				if (original.getAttribute("style") == null) {
-					return null;
-				}
-				// else mean it has style attribute.
-			}
-
-			if (styledecl != null) {
-				return styledecl.getPropertyValue(cssProperty);
-			}
-		}
-
-		// when we reach here, means we can't use the CSSStyleDeclaration API to
-		// get style, we'll take the
-		// pain to do the parsing and replacing.
-		// normally should not happen. But anyway, we need to have a fail safe
-		// path.
-
-		String oldstyle = original.getAttribute("style");
-		if (oldstyle == null || oldstyle.length() == 0) {
-			return null;
-		}
-		StringTokenizer tokenizer = new StringTokenizer(oldstyle, ";");
-
-		while (tokenizer.hasMoreTokens()) {
-			String token = tokenizer.nextToken().trim();
-			if (token.length() == 0) {
-				continue;
-			}
-			int index = token.indexOf(':');
-			if (index == -1) {
-				continue;
-			}
-			String propertyName = token.substring(0, index).trim();
-			if (cssProperty.equals(propertyName)) {
-				// ok, we found the property
-				return token.substring(index + 1).trim();
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * insert style into element
-	 * 
-	 * @param original
-	 * @param map
-	 */
-	public static void insertStyle(Element original, Map map) {
-		if (original instanceof ElementCSSInlineStyle) {
-			CSSStyleDeclaration styledecl = ((ElementCSSInlineStyle) original)
-					.getStyle();
-			if (styledecl == null) {
-				if (original.getAttribute("style") == null) {
-					original.setAttribute("style", "");
-					styledecl = ((ElementCSSInlineStyle) original).getStyle();
-				}
-			}
-
-			if (styledecl != null) {
-				for (Iterator iter = map.keySet().iterator(); iter.hasNext();) {
-					String key = (String) iter.next();
-					String value = (String) map.get(key);
-					if (value == null) {
-						styledecl.removeProperty(key);
-					} else {
-						styledecl.setProperty(key, value, null);
-					}
-				}
-
-				return;
-			}
-		}
-
-		// when we reach here, means we can't use the CSSStyleDeclaration API to
-		// change style, we'll take the
-		// pain to do the parsing and replacing.
-		// normally should not happen. But anyway, we need to have a fail safe
-		// path.
-
-		String oldstyle = original.getAttribute("style");
-		if (oldstyle == null) {
-			oldstyle = "";
-		}
-		StringTokenizer tokenizer = new StringTokenizer(oldstyle, ";");
-
-		StringBuffer buffer = new StringBuffer();
-		while (tokenizer.hasMoreTokens()) {
-			String token = tokenizer.nextToken().trim();
-			if (token.length() == 0) {
-				continue;
-			}
-			int index = token.indexOf(':');
-			if (index == -1) {
-				// wrong property? ignore.
-				buffer.append(token).append("; ");
-				continue;
-			}
-			String propertyName = token.substring(0, index).trim();
-
-			if (map.containsKey(propertyName)) {
-				String propertyValue = (String) map.remove(propertyName);
-				if (propertyValue == null) {
-					// we want to remove this css property. so don't append
-					// anything here
-				} else {
-					buffer.append(propertyName).append(": ").append(
-							propertyValue).append("; ");
-				}
-			} else {
-				buffer.append(token).append("; ");
-			}
-		}
-		// ok, we have loop through existing properties and did replacement.
-		// now _styleProperties only contain those new CSS properties we need to
-		for (Iterator iter = map.keySet().iterator(); iter.hasNext();) {
-			String key = (String) iter.next();
-			String value = (String) map.get(key);
-			if (value != null) {
-				buffer.append(key).append(": ").append(value).append("; ");
-			}
-		}
-		original.setAttribute("style", buffer.toString());
-	}
-
-	/**
-	 * @param ele
-	 * @return true if supports the style attribute
-	 */
-	public static boolean supportStyleAttribute(IDOMElement ele) {
-		CMElementDeclaration decl = CMUtil.getElementDeclaration(ele);
-		if (decl != null && decl.getAttributes().getNamedItem("style") != null) {
-			return true;
-		}
-        return false;
-	}
-	
-	private DOMStyleUtil()
-	{
-	    // util class, no external instantiation
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMUtil.java
deleted file mode 100644
index eec0a33..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/DOMUtil.java
+++ /dev/null
@@ -1,236 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMText;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public class DOMUtil {
-	private static Logger _logger = PDPlugin.getLogger(DOMUtil.class);
-
-	/**
-	 * Get a list of ancester nodes starting from the Document till the node.
-	 * 
-	 * @param node
-	 * @return
-	 */
-	private static List getAncesters(Node node) {
-		List list = new ArrayList();
-		while (node != null) {
-			list.add(node);
-			if (node instanceof Document) {
-				break;
-			}
-            node = node.getParentNode();
-		}
-		if (node == null) {
-			// if part ==null, means we didn't find a DocumentEditPart,
-			// something must be wrong.
-			return null;
-		}
-		// reverse to make it starting from the docuemnteditpart node.
-		Collections.reverse(list);
-		list.add(null); // add an null terminator.
-		return list;
-	}
-
-	/**
-	 * find the smallest common ancester of two edit part.
-	 * 
-	 * @param node1
-	 * @param node2
-	 * @return the common ancestor
-	 */
-	public static Node findCommonAncester(Node node1, Node node2) {
-		List list1 = getAncesters(node1);
-		if (list1 == null) {
-			return null;
-		}
-		List list2 = getAncesters(node2);
-		if (list2 == null) {
-			return null;
-		}
-		if (list1.get(0) != list2.get(0)) {
-			return null;
-		}
-		Node common = (Node) list1.get(0);
-		for (int i = 1;; i++) {
-			Node p1 = (Node) list1.get(i);
-			Node p2 = (Node) list2.get(i);
-			if (p1 == null || p2 == null) {
-				return common;
-			}
-			if (p1 != p2) {
-				return common;
-			}
-			common = p1;
-		}
-
-	}
-
-	/**
-	 * this method is almost same as <code>cloneNodeDeep()</code>. The
-	 * difference is that this method will try to ignore all kinds of error.
-	 * 
-	 * In SSE, if the document model enforce some kinds of validation, then the
-	 * clone may fail. During some cases, we want to ignore the validation
-	 * errors.
-	 * 
-	 * @param destDoc
-	 * @param sourceNode
-	 * @return the node
-	 */
-	public static Node cloneNodeDeepIgnoreError(Document destDoc,
-			Node sourceNode) {
-		switch (sourceNode.getNodeType()) {
-		case Node.ELEMENT_NODE:
-			Element sourceEle = (Element) sourceNode;
-			Element resultEle = destDoc.createElement(sourceEle.getTagName());
-			NamedNodeMap attrs = sourceEle.getAttributes();
-			for (int i = 0, size = attrs.getLength(); i < size; i++) {
-				Attr a = (Attr) attrs.item(i);
-				try {
-					resultEle.setAttribute(a.getName(), a.getValue());
-				} catch (Exception ex) {
-					// ignore
-					_logger.info("Exception", ex);
-				}
-			}
-			NodeList children = sourceEle.getChildNodes();
-			for (int i = 0, size = children.getLength(); i < size; i++) {
-				Node n = children.item(i);
-				Node d = cloneNodeDeepIgnoreError(destDoc, n);
-				if (d != null) {
-					try {
-						resultEle.appendChild(d);
-					} catch (Exception ex) {
-						// ignore
-						_logger.info("Exception", ex);
-					}
-				}
-			}
-			return resultEle;
-		case Node.TEXT_NODE:
-			Text txt = destDoc.createTextNode(sourceNode.getNodeValue());
-			if (txt instanceof IDOMText && sourceNode instanceof IDOMText) {
-				try {
-					((IDOMText) txt).setSource(((IDOMText) sourceNode)
-							.getSource());
-				} catch (Exception ex) {
-					// ignore
-				}
-			}
-			return txt;
-		case Node.CDATA_SECTION_NODE:
-			return destDoc.createCDATASection(sourceNode.getNodeValue());
-		default:
-			return null; // not support.
-		}
-	}
-
-	/**
-	 * @param destDoc
-	 * @param sourceNode
-	 * @return the node
-	 */
-	public static Node cloneNodeDeep(Document destDoc, Node sourceNode) {
-		switch (sourceNode.getNodeType()) {
-		case Node.ELEMENT_NODE:
-			Element sourceEle = (Element) sourceNode;
-			Element resultEle = destDoc.createElement(sourceEle.getTagName());
-			NamedNodeMap attrs = sourceEle.getAttributes();
-			for (int i = 0, size = attrs.getLength(); i < size; i++) {
-				Attr a = (Attr) attrs.item(i);
-				resultEle.setAttribute(a.getName(), a.getValue());
-			}
-			NodeList children = sourceEle.getChildNodes();
-			for (int i = 0, size = children.getLength(); i < size; i++) {
-				Node n = children.item(i);
-				Node d = cloneNodeDeep(destDoc, n);
-				if (d != null) {
-					resultEle.appendChild(d);
-				}
-			}
-			return resultEle;
-		case Node.TEXT_NODE:
-			Text txt = destDoc.createTextNode(sourceNode.getNodeValue());
-			if (txt instanceof IDOMText && sourceNode instanceof IDOMText) {
-				try {
-					((IDOMText) txt).setSource(((IDOMText) sourceNode)
-							.getSource());
-				} catch (Exception ex) {
-					// ignore
-					_logger.info("Exception", ex);
-				}
-			}
-			return txt;
-		case Node.CDATA_SECTION_NODE:
-			return destDoc.createCDATASection(sourceNode.getNodeValue());
-		default:
-			return null; // not support.
-		}
-	}
-
-	/**
-	 * check whether the ancester relationship exist for the two nodes.
-	 * 
-	 * @param ancester
-	 * @param child
-	 * @return true if ancester is an ancestor of child
-	 */
-	public static boolean isAncester(Node ancester, Node child) {
-		while (child != null) {
-			if (child == ancester) {
-				return true;
-			}
-			child = child.getParentNode();
-		}
-		return false;
-	}
-
-	/**
-	 * insert the node at specified position.
-	 * 
-	 * @param domPosition 
-	 * @param node 
-	 * @return null if fail, otherwise return the inserted node.
-	 */
-	public static Node insertNode(IDOMPosition domPosition, Node node) {
-		IDOMPosition position = DOMPositionHelper.splitText(domPosition);
-		if (position == null || position.getContainerNode() == null) {
-			return null;
-		}
-		if (position.getNextSiblingNode() == null) {
-			position.getContainerNode().appendChild(node);
-		} else {
-			position.getContainerNode().insertBefore(node,
-					position.getNextSiblingNode());
-		}
-
-		return node;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/EditHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/EditHelper.java
deleted file mode 100644
index e8e2171..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/EditHelper.java
+++ /dev/null
@@ -1,504 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import java.util.List;
-import java.util.Stack;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.commands.range.WorkNode;
-import org.eclipse.jst.pagedesigner.parts.TextEditPart;
-import org.eclipse.jst.pagedesigner.utils.HTMLUtil;
-import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.IMovementMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.InlineEditingNavigationMediator;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRefPosition;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public class EditHelper {
-//	public final static boolean INNER_DEBUG = false;
-
-	private final static int OUT_OF_LEFT = 1;
-
-	private final static int LEFT_NAME = 2;
-
-	/**
-	 * indicates a position in the middle
-	 */
-	public final static int IN_MIDDLE = 3;
-
-	private final static int RIGHT_NAME = 4;
-
-	private final static int OUT_OF_RIGHT = 5;
-
-	private static final EditHelper _instance = new EditHelper();
-
-	//private static Logger _log = PDPlugin.getLogger(EditHelper.class);
-
-	private EditHelper() {
-        //  no external instantiation
-	}
-
-	/**
-	 * Move operation position infront of next non-blank and non-transparent
-	 * char. The caller should ensure position's container node is not
-	 * tranparent text node.
-	 * 
-	 * @param position
-	 * @param forward
-	 * @param forEmpty
-	 * @return the offset
-	 */
-	public int getTextNextOffset(IDOMPosition position, boolean forward,
-			boolean forEmpty) {
-		EditValidateUtil.validPosition(position);
-		Assert.isTrue(!EditModelQuery.isTransparentText(position
-				.getContainerNode()));
-		Text text = (Text) position.getContainerNode();
-		int offset = position.getOffset();
-		String data = text.getNodeValue();
-		if (forward) {
-			while (offset < data.length()
-					&& HTMLUtil.isHTMLWhitespace(data.charAt(offset))) {
-				offset++;
-			}
-		} else {
-			while (offset > 0
-					&& HTMLUtil.isHTMLWhitespace(data.charAt(offset - 1))) {
-				offset--;
-			}
-		}
-		return offset;
-
-	}
-
-	/**
-	 * @return the singleton instance
-	 */
-	public static EditHelper getInstance() {
-		return _instance;
-	}
-
-	/**
-	 * This caret from current operation postion to next position, this method
-	 * will convert DesignPosition in to DOMPosition, then call dom function to
-	 * move dom position. Here we might insert some complex rules to see whether
-	 * move is valid.
-	 * 
-	 * @param action
-	 * @param currentPosition
-	 * @param forward
-	 * @return the dom position
-	 */
-	public static DesignPosition moveToNextEditPosition(int action,
-			DesignPosition currentPosition, boolean forward) {
-		IDOMPosition position;
-		position = DOMPositionHelper.toDOMPosition(currentPosition);
-		position = moveToNextEditPosition(position, forward,
-				new InlineEditingNavigationMediator(
-						new ActionData(action, null)));
-		if (position == null) {
-			return currentPosition;
-		}
-
-		EditValidateUtil.validPosition(position);
-		return DOMPositionHelper.toDesignPosition(position);
-	}
-
-	/**
-	 * Move operation position to next edit position. We may need rule to valid
-	 * it based on operation ID and direction. We need to pack transparent
-	 * string.
-	 * 
-	 * @param currentPosition
-	 * @param forward
-	 * @param validator
-	 * @return the dom position
-	 */
-	public static IDOMPosition moveToNextEditPosition(
-			IDOMPosition currentPosition, boolean forward,
-			IMovementMediator validator) {
-		IDOMPosition result = null;
-		CaretMoveIterator moveIterator = new CaretMoveIterator(null, validator,
-				currentPosition, forward);
-		if ((result = moveIterator.moveToNextEditPosition(currentPosition,
-				forward, validator)) == null) {
-			result = currentPosition;
-		}
-		return result;
-	}
-
-	/**
-	 * Delete a node, in case it is 'body' or 'html', it won't perform delete.
-	 * 
-	 * @param node
-	 * @return the node
-	 */
-	public static Node deleteNode(Node node) {
-		if (node == null || node.getNodeName() == null) {
-			return null;
-		}
-		String name = node.getLocalName();
-
-		if (name != null
-				&& (name.equalsIgnoreCase(IHTMLConstants.TAG_BODY)
-						|| name.equalsIgnoreCase(IHTMLConstants.TAG_HEAD) || name
-						.equalsIgnoreCase(IHTMLConstants.TAG_HTML))) {
-			return null;
-		}
-		Node parent = node.getParentNode();
-		name = parent.getNodeName();
-		if (parent != null
-				&& name != null
-				&& parent.getNodeName().equalsIgnoreCase(
-						IHTMLConstants.TAG_HEAD)) {
-			return null;
-		}
-		return parent.removeChild(node);
-	}
-
-	/**
-	 * Order the IDOMPositions in a range in ascending order.
-	 * 
-	 * @param range
-	 * @return the dom range
-	 */
-	public static DOMRange normal(DOMRange range) {
-		EditValidateUtil.validRange(range);
-		IDOMPosition p1 = range.getStartPosition();
-		IDOMPosition p2 = range.getEndPosition();
-		if (EditModelQuery.getIndexedRegionLocation(p1) > EditModelQuery
-				.getIndexedRegionLocation(p2)) {
-			return new DOMRange(p2, p1);
-		}
-        return range;
-	}
-
-	/**
-	 * Move position in to node from its outside, the node should be breakble.
-	 * 
-	 * @param node
-	 * @param validator 
-	 * @param forward
-	 * @return the dom position
-	 */
-	public static IDOMPosition moveInto(Node node, IMovementMediator validator,
-			boolean forward) {
-		CaretMoveIterator moveIterator = new CaretMoveIterator(null, validator,
-				new DOMRefPosition(node, !forward), forward);
-		return moveIterator.moveIn(node);
-	}
-
-	/**
-	 * Convert a DomRefPosition into DOMPosition.
-	 * 
-	 * @param position
-	 * @return the dom position
-	 */
-	public static IDOMPosition ensureDOMPosition(IDOMPosition position) {
-		if (position instanceof DOMRefPosition) {
-			return new DOMPosition(position.getContainerNode(), position
-					.getOffset());
-		}
-		return position;
-	}
-
-	/**
-	 * @param currentNode
-	 * @param pos1
-	 * @param pos2
-	 * @param top
-	 * @param workNode
-	 */
-	public void processText(Text currentNode, final int pos1, final int pos2,
-			Node top, Stack workNode) {
-		// the text could be tranparent, or 0 length.
-		Assert.isTrue(pos1 <= pos2);
-		if (pos1 == pos2) {
-			return;
-		}
-		// int left = EditModelQuery.getNodeStartIndex(currentNode);
-		// int right = EditModelQuery.getNodeEndIndex(currentNode);
-		int location1 = getLocation(currentNode, pos1, false);
-		int location2 = getLocation(currentNode, pos2, false);
-		if (location1 <= IN_MIDDLE && location2 >= IN_MIDDLE) {
-			workNode.push(new WorkNode(currentNode, pos1, pos2));
-		}
-	}
-
-	/**
-	 * @param currentNode
-	 * @param pos1
-	 * @param pos2
-	 * @param top
-	 * @param result
-	 */
-	public void collectNodes(Node currentNode, final int pos1, final int pos2,
-			Node top, Stack result) {
-		Assert.isTrue(pos1 <= pos2);
-		if (pos1 == pos2) {
-			return;
-		}
-		if (EditModelQuery.isText(currentNode)) {
-			processText((Text) currentNode, pos1, pos2, top, result);
-		} else {
-			int location1 = getLocation(currentNode, pos1, false);
-			int location2 = getLocation(currentNode, pos2, false);
-			if (location1 < IN_MIDDLE && location2 > IN_MIDDLE) {
-				// TODO: push the node into result.--
-				result.push(new WorkNode(currentNode, pos1, pos2));
-			} else if (location1 <= IN_MIDDLE && location2 >= IN_MIDDLE) {
-				if (currentNode.hasChildNodes()) {
-					Node child = currentNode.getFirstChild();
-					Stack myResult = new Stack();
-					while (child != null) {
-						collectNodes(child, pos1, pos2, top, myResult);
-						child = child.getNextSibling();
-					}
-					if (location1 < IN_MIDDLE && location2 >= IN_MIDDLE
-							|| location1 <= IN_MIDDLE && location2 > IN_MIDDLE) {
-						WorkNode workNode = new WorkNode(currentNode, pos1,
-								pos2);
-						while (myResult.size() > 0) {
-							WorkNode w = (WorkNode) myResult.remove(0);
-							if (w.getNode().getParentNode() == workNode
-									.getNode()) {
-								w.setParent(workNode);
-							}
-							result.push(w);
-						}
-						// TODO: push parent into result.--
-						result.push(workNode);
-					}
-				} else {
-					if (!(location1 == IN_MIDDLE && location2 == IN_MIDDLE)) {
-						// TODO: push this node into result.
-						result.push(new WorkNode(currentNode, pos1, pos2));
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * @param currentNode
-	 * @param pos
-	 * @param isOffset
-	 * @return the location
-	 */
-	public int getLocation(Node currentNode, int pos, boolean isOffset) {
-		if (EditModelQuery.getInstance().isSingleRegionNode(currentNode)) {
-			// if (EditModelQuery.isText(currentNode))
-			{
-
-				int left = EditModelQuery.getNodeStartIndex(currentNode);
-				int right = EditModelQuery.getNodeEndIndex(currentNode);
-				if (isOffset) {
-					pos += left;
-				}
-				if (pos <= left) {
-					return OUT_OF_LEFT;
-				} else if (left < pos && pos < right) {
-					return IN_MIDDLE;
-				} else {
-					return OUT_OF_RIGHT;
-				}
-			}
-		}
-        int left = EditModelQuery.getNodeStartIndex(currentNode);
-        int left1 = EditModelQuery.getNodeStartNameEndIndex(currentNode);
-        int right = EditModelQuery.getNodeEndNameStartIndex(currentNode);
-        int right1 = EditModelQuery.getNodeEndIndex(currentNode);
-        if (isOffset) {
-        	pos += left;
-        }
-        if (pos <= left) {
-        	return OUT_OF_LEFT;
-        } else if (left < pos && pos < left1) {
-        	return LEFT_NAME;
-        } else if (left1 <= pos && pos <= right) {
-        	return IN_MIDDLE;
-        } else if (right < pos && pos < right1) {
-        	return RIGHT_NAME;
-        } else {
-        	return OUT_OF_RIGHT;
-        }
-
-	}
-
-    // TODO: dead?
-//	private Node cutCurrentNode(int pos[], Node currentNode,
-//			IDOMPosition position) {
-//		// at right edge
-//		int curpos = EditModelQuery.getIndexedRegionLocation(position);
-//		if (pos[0] <= curpos) {
-//			pos[1] = EditModelQuery.getNodeStartIndex(currentNode);
-//			currentNode = deleteNode(currentNode);
-//			if (INNER_DEBUG) {
-//				_log.info("cut:" + currentNode);
-//			}
-//			return currentNode;
-//		} else if (pos[1] >= curpos) {
-//			pos[0] = EditModelQuery.getNodeEndIndex(currentNode);
-//			currentNode = deleteNode(currentNode);
-//			if (INNER_DEBUG) {
-//				_log.info("cut:" + currentNode);
-//			}
-//			return currentNode;
-//		}
-//		return null;
-//	}
-
-    //TODO: dead?
-//	private int getPos(DOMRange range, boolean forStart) {
-//		if (forStart) {
-//			return EditModelQuery.getIndexedRegionLocation(range
-//					.getStartPosition());
-//		} else {
-//			return EditModelQuery.getIndexedRegionLocation(range
-//					.getEndPosition());
-//		}
-//	}
-
-	/**
-	 * @param position
-	 * @param forward
-	 * @return the edit part for position
-	 */
-	public EditPart getEditPart(DesignPosition position, boolean forward) {
-		if (position instanceof DesignRefPosition) {
-			return ((DesignRefPosition) position).getRefPart();
-		}
-		EditPart container = position.getContainerPart();
-		if (container instanceof TextEditPart) {
-			return container;
-		}
-		if (container != null) {
-			List children = container.getChildren();
-			for (int i = 0, n = children.size(); i < n; i++) {
-				if (i == position.getOffset()) {
-					int index = (forward) ? i - 1 : i + 1;
-					if (index < 0) {
-						index = 0;
-					}
-					if (index >= children.size()) {
-						index = children.size() - 1;
-					}
-
-					return (EditPart) children.get(index);
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param position
-	 * @return the resulting dom position
-	 */
-	public static IDOMPosition splitNode(IDOMPosition position) {
-		if (EditValidateUtil.validPosition(position)) {
-			Node container = null;
-			// Avoid to split tag at its edge
-			if (position.getOffset() > 0) {
-				if (position.isText()) {
-					container = position.getContainerNode();
-					if (position.getOffset() < ((Text) container).getLength()) {
-						position = DOMPositionHelper.splitText(position);
-					} else {
-						// position = new
-						// DOMRefPosition(position.getContainerNode(), true);
-					}
-				} else {
-					if (position.getNextSiblingNode() != null) {
-						container = position.getContainerNode();
-						Node parent = container.getParentNode();
-
-						Document document = EditModelQuery
-								.getDocumentNode(container);
-						Node newContainer = document.createElement(container
-								.getNodeName());
-						Node node = position.getPreviousSiblingNode();
-						Node refNode = null;
-						while (node != null) {
-							Node prev = node.getPreviousSibling();
-							node = node.getParentNode().removeChild(node);
-
-							newContainer.insertBefore(node, refNode);
-							refNode = node;
-							node = prev;
-						}
-						parent.insertBefore(newContainer, container);
-						// set the newContainer node align attribute to the
-						// original align attribue
-						// copy nodes under container node to container node's
-						// parent node
-						if (container.getNodeName().equalsIgnoreCase(
-								IHTMLConstants.TAG_P)) {
-							Element pNode = (Element) container;
-							String align = pNode
-									.getAttribute(IHTMLConstants.ATTR_ALIGN);
-							if (align != null && !"".equalsIgnoreCase(align)) {
-								((Element) newContainer).setAttribute(
-										IHTMLConstants.ATTR_ALIGN, align);
-							}
-							NodeList nodeList = pNode.getChildNodes();
-							for (int i = 0, size = nodeList.getLength(); i < size; i++) {
-								Node tempNode = nodeList.item(i);
-								parent.insertBefore(tempNode, container);
-							}
-						}
-						return new DOMRefPosition(newContainer, true);
-					}
-//                    position = new
-//                    DOMRefPosition(position.getContainerNode(), true);
-				}
-			} else {
-				// container = position.getContainerNode();
-				// position = new DOMRefPosition(container, false);
-			}
-		}
-		return position;
-	}
-
-	/**
-	 * @param position 
-	 * @return the position of this 'position' in relative to it's container.
-	 */
-	public static int getLocation(IDOMPosition position) {
-		if (position.getOffset() == 0) {
-			return -1;
-		}
-        if (position.isText()) {
-        	if (position.getOffset() == ((Text) position.getContainerNode())
-        			.getLength()) {
-        		return 1;
-        	}
-            return 0;
-        }
-        if (position.getOffset() == position.getContainerNode()
-        		.getChildNodes().getLength()) {
-        	return 1;
-        }
-        return 0;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/EditModelQuery.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/EditModelQuery.java
deleted file mode 100644
index 54668b1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/EditModelQuery.java
+++ /dev/null
@@ -1,1840 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Vector;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.gef.EditPart;
-import org.eclipse.jface.text.TextSelection;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.parts.HTMLEditPartsFactory;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.utils.HTMLUtil;
-import org.eclipse.jst.pagedesigner.validation.caret.Target;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.swt.SWT;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public final class EditModelQuery {
-	private static Logger _log = PDPlugin.getLogger(EditModelQuery.class);
-
-	private static EditModelQuery _instance;
-
-	private static final int START_INDEX_BEFORE_TAG = 1;
-
-	private static final int END_INDEX_WITHIN_TAG = 2;
-
-	private static final HashSet SPECIAL_EMPTY_CHARS = new HashSet();
-
-	/**
-	 * Maps unicode Characters to html equivalents
-	 */
-	public static final HashMap CHAR_NODE_MAP = new HashMap();
-
-	// Cursor can't go outside of these container.
-	private static final HashSet HTML_CONSTRAINED_CONTAINERS = new HashSet();
-
-	/**
-	 * HTML tags that control style
-	 */
-	public static final HashSet HTML_STYLE_NODES = new HashSet();
-
-	static final HashSet UNREMOVEBLE_TAGS = new HashSet();
-
-	// Nodes that can hold other nodes.
-	static final String[] HTML_CONTAINER_NODES = {
-	//
-			IHTMLConstants.TAG_BODY, //
-			IHTMLConstants.TAG_HTML, //
-			IHTMLConstants.TAG_SPAN, //
-			IHTMLConstants.TAG_FORM, //
-			IHTMLConstants.TAG_P,//
-			IHTMLConstants.TAG_SPAN,//
-			IHTMLConstants.TAG_DIV,//
-			IHTMLConstants.TAG_LI,//
-			IHTMLConstants.TAG_OL,//
-			IHTMLConstants.TAG_UL //
-	};
-
-	static final String[] NON_HTML_CONTAINER_NODES = {
-			IJSFConstants.TAG_VIEW, //
-			IJSFConstants.TAG_PANELGRID, //
-			IJSFConstants.TAG_PANELGROUP, //
-			IJSFConstants.TAG_SUBVIEW };
-	static {
-		UNREMOVEBLE_TAGS.add(IHTMLConstants.TAG_HTML);
-		UNREMOVEBLE_TAGS.add(IHTMLConstants.TAG_HEAD);
-		UNREMOVEBLE_TAGS.add(IHTMLConstants.TAG_BODY);
-		EditModelQuery.CHAR_NODE_MAP.put(new Character(SWT.CR),
-				IHTMLConstants.TAG_BR);
-		EditModelQuery.CHAR_NODE_MAP.put(new Character(SWT.LF),
-				IHTMLConstants.TAG_BR);
-		EditModelQuery.SPECIAL_EMPTY_CHARS.add(" ");
-		EditModelQuery.SPECIAL_EMPTY_CHARS.add("\t");
-		EditModelQuery.SPECIAL_EMPTY_CHARS.add("\r");
-		EditModelQuery.SPECIAL_EMPTY_CHARS.add("\n");
-		EditModelQuery.HTML_CONSTRAINED_CONTAINERS.add(IHTMLConstants.TAG_TD);
-		EditModelQuery.HTML_CONSTRAINED_CONTAINERS.add(IHTMLConstants.TAG_TR);
-		EditModelQuery.HTML_CONSTRAINED_CONTAINERS
-				.add(IHTMLConstants.TAG_TABLE);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_B);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_EM);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_H1);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_H2);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_H3);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_H4);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_H5);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_H6);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_A);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_U);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_I);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_S);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_STRONG);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_TT);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_BIG);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_SMALL);
-		EditModelQuery.HTML_STYLE_NODES.add(IHTMLConstants.TAG_FONT);
-	}
-
-	private EditModelQuery() {
-        // no  external instantiation
-	}
-
-	/**
-	 * @return the singleton instance
-	 */
-	public static EditModelQuery getInstance() {
-		if (_instance == null) {
-			_instance = new EditModelQuery();
-		}
-		return _instance;
-	}
-
-	/**
-	 * Get previous sibling, or if sibling is null then get previous neighbor.
-	 * 
-	 * @param node
-	 * @return the node
-	 */
-	public Node getPreviousNeighbor(Node node) {
-		if (!EditValidateUtil.validNode(node)) {
-			return null;
-		}
-		while (node != null && node.getNodeType() != Node.DOCUMENT_NODE
-				&& node.getPreviousSibling() == null) {
-			node = node.getParentNode();
-		}
-		return (node != null && node.getNodeType() != Node.DOCUMENT_NODE) ? node
-				.getPreviousSibling()
-				: null;
-	}
-
-	/**
-	 * Get privous sibling, or if sibling is null then get previous neighor's
-	 * rightmost child, which is adjacent to 'node'.
-	 * 
-	 * @param node
-	 * @return the node
-	 */
-	public Node getPreviousLeafNeighbor(Node node) {
-		return getLastLeafChild(getPreviousNeighbor(node));
-	}
-
-	/**
-	 * Get next sibling, or if sibling is null get next neighbor.
-	 * 
-	 * @param node
-	 * @return the node
-	 */
-	public Node getNextNeighbor(Node node) {
-		if (!EditValidateUtil.validNode(node)) {
-			return null;
-		}
-
-		while (node != null && node.getNodeType() != Node.DOCUMENT_NODE
-				&& node.getNextSibling() == null) {
-			node = node.getParentNode();
-		}
-		return (node != null && node.getNodeType() != Node.DOCUMENT_NODE) ? node
-				.getNextSibling()
-				: null;
-	}
-
-	/**
-	 * Get next sibling, or if sibling is null get next neighbor's leftmost leaf
-	 * child which will be adjacent to 'node'.
-	 * 
-	 * @param node
-	 * @return the node
-	 */
-	public Node getNextLeafNeighbor(Node node) {
-		return getFirstLeafChild(getNextNeighbor(node));
-	}
-
-	/**
-	 * Get node's rightmost leaf child.
-	 * 
-	 * @param node
-	 * @return the node
-	 */
-	private Node getLastLeafChild(Node node) {
-		if (node == null) {
-			return null;
-		}
-		if (node.getLastChild() != null) {
-			return getLastLeafChild(node.getLastChild());
-		}
-        return node;
-	}
-
-	/**
-	 * Get node's leftmost leaf child.
-	 * 
-	 * @param node
-	 * @return the node
-	 */
-	private Node getFirstLeafChild(Node node) {
-		if (node == null) {
-			return null;
-		}
-
-		if (node.getFirstChild() != null) {
-			return getFirstLeafChild(node.getFirstChild());
-		}
-        return node;
-	}
-
-	/**
-	 * To see if node is within a indexed region that is started from 'start',
-	 * ended at 'end'
-	 */
-	static boolean within(int start, int end, Node theNode) {
-		return getNodeStartIndex(theNode) >= start
-				&& getNodeEndIndex(theNode) <= end;
-	}
-
-	/**
-	 * To see whether the 'position' is within indexed location (start, end)
-	 * 
-	 * @param start
-	 * @param end
-	 * @param position
-	 * @return
-	 */
-	 boolean within(int start, int end, IDOMPosition position) {
-		int pos = getIndexedRegionLocation(position);
-		return start <= pos && pos <= end;
-	}
-
-	/**
-	 * To see whether the 'theNode' is not within indexed region (start, end)
-	 * 
-	 * @param start
-	 * @param end
-	 * @param theNode
-	 * @return
-	 */
-	static boolean outOf(int start, int end, Node theNode) {
-		if (getNodeLenth(theNode) > 0) {
-			return getNodeStartIndex(theNode) >= end
-					|| getNodeEndIndex(theNode) <= start;
-		}
-        return !((getNodeStartIndex(theNode) >= start && getNodeEndIndex(theNode) <= end));
-	}
-
-	/**
-	 * Determine whether the position is at node's edge. When the offset is at
-	 * edge, it is in the leftmost or rightmost offset of node's region.
-	 * 
-	 * @param position 
-	 * @param forward 
-	 * @return true if at edge
-	 */
-	boolean atEdge(IDOMPosition position, boolean forward) {
-		Node node = position.getContainerNode();
-		int offset = position.getOffset();
-		if (forward) {
-			if (EditModelQuery.isText(node)) {
-				return offset == node.getNodeValue().length();
-			}
-            return offset == node.getChildNodes().getLength();
-		}
-        return offset == 0;
-	}
-
-	/**
-	 * Get node's neighbor on the node tree, if forward, then get next,
-	 * otherwise go backward.
-	 * 
-	 * @param node
-	 * @param forward
-	 * @return the node
-	 */
-	Node getNeighbor(Node node, boolean forward) {
-		if (forward) {
-			return getNextNeighbor(node);
-		}
-        return getPreviousNeighbor(node);
-	}
-
-	/**
-	 * Get neighbor which is descendent of root.
-	 * 
-	 * @param node
-	 * @param root
-	 * @return the node
-	 */
-	Node getPreviousNeighbor(Node node, Node root) {
-		if (!EditValidateUtil.validNode(node)) {
-			return null;
-		}
-		while (node != null && node != root
-				&& node.getNodeType() != Node.DOCUMENT_NODE
-				&& node.getPreviousSibling() == null) {
-			node = node.getParentNode();
-		}
-		return (node != null && node != root && node.getNodeType() != Node.DOCUMENT_NODE) ? node
-				.getPreviousSibling()
-				: null;
-	}
-
-	/**
-	 * Get neighbor which is descendent of root.
-	 * 
-	 * @param node
-	 * @param root
-	 * @return the node
-	 */
-	Node getNextNeighbor(Node node, Node root) {
-		if (!EditValidateUtil.validNode(node)) {
-			return null;
-		}
-
-		while (node != null && node != root
-				&& node.getNodeType() != Node.DOCUMENT_NODE
-				&& node.getNextSibling() == null) {
-			node = node.getParentNode();
-		}
-		return (node != null && node != root && node.getNodeType() != Node.DOCUMENT_NODE) ? node
-				.getNextSibling()
-				: null;
-	}
-
-	/**
-	 * Get neighbor which is descendent of root.
-	 * 
-	 * @param node
-	 * @param forward
-	 * @param root
-	 * @return the node
-	 */
-	 Node getNeighbor(Node node, boolean forward, Node root) {
-		Assert.isTrue(root != null);
-		if (forward) {
-			return getNextNeighbor(node, root);
-		}
-        return getPreviousNeighbor(node, root);
-	}
-
-	/**
-	 * Get node's leaf child which is adjacent to 'node', according to
-	 * 'forward', it will search backward or forward.
-	 * 
-	 * @param node
-	 * @param forward
-	 * @return the node
-	 */
-	Node getLeafNeighbor(Node node, boolean forward) {
-		if (node == null) {
-			return null;
-		}
-		if (forward) {
-			return getNextLeafNeighbor(node);
-		}
-        return getPreviousLeafNeighbor(node);
-	}
-
-	/**
-	 * Get neighbor's leaf child, which is adjacent to 'node'
-	 * 
-	 * @param node
-	 * @param childIndex
-	 * @param forward
-	 * @return the node
-	 */
-	 Node getLeafNeighbor(Node node, int childIndex, boolean forward) {
-		if (node == null) {
-			return null;
-		}
-		Node neighbor = getNeighbor(node, childIndex, forward);
-		if (neighbor != null) {
-			if (forward) {
-				return getFirstLeafChild(neighbor);
-			}
-            return getLastLeafChild(neighbor);
-		}
-		return null;
-	}
-
-	/**
-	 * First try sibling, if it retruns null, try search neighbor.
-	 * 
-	 * @param parent
-	 * @param childIndex
-	 * @param forward
-	 * @return the node
-	 */
-	 Node getNeighbor(Node parent, int childIndex, boolean forward) {
-		if (!EditValidateUtil.validNode(parent)) {
-			return null;
-		}
-
-		NodeList nodeList = parent.getChildNodes();
-		if (nodeList != null && nodeList.getLength() > 0) {
-			if (nodeList.getLength() < childIndex) {
-				return null;
-			}
-			Node childNode = null;
-			if (!forward) {
-				--childIndex;
-			}
-			childNode = nodeList.item(childIndex);
-			if (childNode != null) {
-				return childNode;
-			}
-            return getNeighbor(parent, forward);
-		}
-        if (parent.getNodeType() == Node.TEXT_NODE) {
-        	return getNeighbor(parent, forward);
-        }
-        return null;
-	}
-
-	/**
-	 * To see whether the textSelection start and end are on the same.
-	 * 
-	 * @param model
-	 * @param textSelection
-	 * @return the node
-	 */
-	 static boolean isSame(IStructuredModel model,
-			TextSelection textSelection) {
-		if (model != null && textSelection != null) {
-			int t1 = textSelection.getOffset();
-			int t2 = textSelection.getLength() + t1;
-			return model.getIndexedRegion(t1) == model.getIndexedRegion(t2);
-		}
-		return false;
-	}
-
-	/**
-	 * To see if the range and text selection covered the same range.
-	 * 
-	 * @param model
-	 * @param range
-	 * @param textSelection
-	 * @return true if same
-	 */
-	static boolean isSame(IStructuredModel model, DesignRange range,
-			TextSelection textSelection) {
-		if (model != null && range != null && textSelection != null) {
-			int t1 = textSelection.getOffset();
-			int t2 = textSelection.getLength() + t1;
-			int r1 = getIndexedRegionLocation(DOMRangeHelper.toDOMRange(range)
-					.getStartPosition());
-			int r2 = getIndexedRegionLocation(DOMRangeHelper.toDOMRange(range)
-					.getEndPosition());
-			return (model.getIndexedRegion(t1) == model.getIndexedRegion(r1) && //
-					model.getIndexedRegion(t2) == model.getIndexedRegion(r2))
-					|| (model.getIndexedRegion(t2) == model
-							.getIndexedRegion(r1) && //
-					model.getIndexedRegion(t1) == model.getIndexedRegion(r2));
-		}
-		return false;
-	}
-
-	/**
-	 * To see whether the selection is single point.
-	 * 
-	 * @param textSelection
-	 * @return true if same point
-	 */
-	 static boolean isSamePoint(TextSelection textSelection) {
-		return textSelection.getLength() == 0;
-	}
-
-	/**
-	 * To see whether two IDOMPosition are pointed to a same location.
-	 * 
-	 * @param p1
-	 * @param p2
-	 * @return true if same
-	 */
-	public static boolean isSame(IDOMPosition p1, IDOMPosition p2) {
-		if (p1 == p2
-				|| (p1.getContainerNode() == p2.getContainerNode() && p1
-						.getOffset() == p2.getOffset())) {
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * To see whether the range's start and end position are pointed to a same
-	 * location.
-	 * 
-	 * @param range
-	 * @return true if is same
-	 */
-	public static boolean isSame(DOMRange range) {
-		EditValidateUtil.validRange(range);
-		return isSame(range.getStartPosition(), range.getEndPosition());
-	}
-
-	/**
-	 * @param range
-	 * @return true if same
-	 */
-	public static boolean isSame(DesignRange range) {
-		return isSame(range.getStartPosition(), range.getEndPosition());
-	}
-
-	/**
-	 * @param p1
-	 * @param p2
-	 * @return true if same
-	 */
-	public static boolean isSame(DesignPosition p1, DesignPosition p2) {
-		if (p1 == p2) {
-			return true;
-		}
-		if (p1.getContainerNode() == p2.getContainerNode()
-				&& p1.getOffset() == p2.getOffset()) {
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * @param p1
-	 * @param p2
-	 * @return true if p1 and p2 are within same text node
-	 */
-	final boolean isWithinSameText(IDOMPosition p1, IDOMPosition p2) {
-		if (p1 == null || p2 == null) {
-			return false;
-		}
-		return p1.isText() && p2.isText()
-				&& p1.getContainerNode() == p2.getContainerNode();
-	}
-
-	/**
-	 * Get the node absolute start location in its residing IStructuredModel.
-	 * 
-	 * @param p
-	 * @return the location
-	 */
-	public static int getIndexedRegionLocation(IDOMPosition p) {
-		if (!EditValidateUtil.validPosition(p)) {
-			return -1;
-		}
-		Node parent = p.getContainerNode();
-		if (p.isText()) {
-			return ((IndexedRegion) parent).getStartOffset() + p.getOffset();
-		}
-        int index = p.getOffset();
-        if (!parent.hasChildNodes()) {
-        	// Element:
-        	if (!isDocument(parent)) {
-        		IStructuredDocumentRegion region = ((IDOMNode) parent)
-        				.getStartStructuredDocumentRegion();
-        		return region.getEnd();
-        	}
-            // Document node:
-            int offset = ((IndexedRegion) parent).getStartOffset();
-            return offset;
-        }
-        NodeList children = parent.getChildNodes();
-        // After rightmost child
-        if (children.getLength() == index) {
-        	if (!isDocument(parent)) {
-        		int pos = getNodeEndNameStartIndex(parent);
-        		return pos;
-        	}
-            int offset = ((IndexedRegion) parent).getEndOffset();
-            return offset;
-        }
-        Node node = children.item(index);
-        return ((IndexedRegion) node).getStartOffset();
-	}
-
-	/**
-	 * To determine whether the position is at the edge of a node. TODO: temp
-	 * func for later combination
-	 * @param nodePos 
-	 * 
-	 * @param position
-	 * @param left 
-	 * @return true if linked
-	 */
-	boolean isLinked(IDOMPosition nodePos, IDOMPosition position,
-			boolean left) {
-		int index = getIndexedRegionLocation(position);
-		if (left) {
-			int pos = getIndexedRegionLocation(nodePos);
-			return pos == index;
-		}
-        Node node = null;
-        int end;
-        if (nodePos.isText()) {
-        	node = nodePos.getContainerNode();
-        	end = ((IndexedRegion) node).getEndOffset();
-        } else {
-        	node = nodePos.getNextSiblingNode();
-        	Assert.isTrue(node != null);
-        	end = ((IndexedRegion) node).getEndOffset();
-        }
-        return end == index;
-	}
-
-	/**
-	 * To see if the location is at the node's indexed pos, posType can be
-	 * START_INDEX_BEFORE_TAG, END_INDEX_WITHIN_TAG When location is at these
-	 * two position, webtools returns the container tag name, so we need to know
-	 * these.
-	 * 
-	 * @param location
-	 * @param node
-	 * @return true if at edge
-	 */
-	boolean isAtNodeNameEdge(int location, Node node, int posType) {
-		int start = getNodeEndNameStartIndex(node);
-		return location == start;
-	}
-
-	/**
-	 * @param location
-	 * @param node
-	 * @return true if at edge
-	 */
-	public boolean isAtNodeNameEdge(int location, Node node) {
-		return isAtNodeNameEdge(location, node, START_INDEX_BEFORE_TAG)
-				|| isAtNodeNameEdge(location, node, END_INDEX_WITHIN_TAG);
-	}
-
-	/**
-	 * If text only contains chars '\r' or '\n', it is considered to be
-	 * transparent.
-	 * 
-	 * @param node
-	 * @return true if transparent text
-	 */
-	 public static boolean isTransparentText(Node node) {
-		// should valid non null?
-		Assert.isTrue(node != null);
-		if (node == null || !isText(node)) {
-			return false;
-		}
-		if (!EditValidateUtil.validText(node)) {
-			return false;
-		}
-
-		Text text = (Text) node;
-		if (text.getLength() == 0) {
-			return true;
-		}
-		String value = text.getNodeValue();
-		int i = 0;
-		while (i < value.length() && HTMLUtil.isHTMLWhitespace(value.charAt(i))) {
-			i++;
-		}
-		return i == value.length();
-	}
-
-	/**
-	 * Get node index in its parent's children.
-	 * 
-	 * @param node
-	 * @return the node index or -1 if not found
-	 */
-	 static int getNodeIndex(Node node) {
-		EditValidateUtil.validNode(node);
-		Node parent = node.getParentNode();
-		int index = 0;
-		for (Node child = parent.getFirstChild(); child != null; child = child
-				.getNextSibling()) {
-			if (child == node) {
-				return index;
-			}
-			index++;
-		}
-		return -1; // error
-	}
-
-	/**
-	 * If parent has more than one children of which each node's localName is
-	 * the same as of 'node', return the index of 'node' in the same type
-	 * children list.
-	 * 
-	 * @param node
-	 * @return the index
-	 */
-	 public int getSameTypeNodeIndex(Node node) {
-		EditValidateUtil.validNode(node);
-		int i = 0;
-		while (node != null) {
-			Node sibling = node.getPreviousSibling();
-			if (sibling != null && sibling.getLocalName() != null
-					&& sibling.getLocalName().equals(node.getLocalName())) {
-				i++;
-			}
-			node = sibling;
-		}
-		return i; // error
-	}
-
-	/**
-	 * Start from position, skip transparent chars, and returns the first
-	 * non-transparent char's index. based on 'forward', go previously or next .
-	 * 
-	 * @param value
-	 * @param position
-	 * @param forward
-	 * @return the position
-	 */
-	 int getNextConcretePosition(String value, int position,
-			boolean forward) {
-		if (value == null) {
-			return -1;
-		}
-		if (value.length() == 0) {
-			return 0;
-		}
-		// validate
-		Assert.isTrue(position >= 0 && position <= value.length());
-		int i = -1;
-		if (forward) {
-			i = position;
-			while (i < value.length()
-					&& (value.charAt(i) == SWT.CR || value.charAt(i) == SWT.LF)) {
-				i++;
-			}
-			return i;
-		}
-        i = position - 1;
-        while (i >= 0
-        		&& (value.charAt(i) == SWT.CR || value.charAt(i) == SWT.LF)) {
-        	i--;
-        }
-        return i + 1;
-	}
-
-	/**
-	 * Get two nodes' lowest common ancestor.
-	 * 
-	 * @param node1
-	 * @param node2
-	 * @return the node
-	 */
-	 public Node getCommonAncestor(Node node1, Node node2) {
-		if (node1 == null || node2 == null) {
-			return null;
-		}
-
-		for (Node na = node1; na != null; na = na.getParentNode()) {
-			for (Node ta = node2; ta != null; ta = ta.getParentNode()) {
-				if (ta == na)
-					return ta;
-			}
-		}
-		return null; // not found
-	}
-
-	/**
-	 * Get lowest common ancestor of two IDOMPositions' container nodes..
-	 * 
-	 * @param p1
-	 * @param p2
-	 * @return the nodeh
-	 */
-	public Node getCommonAncestor(IDOMPosition p1, IDOMPosition p2) {
-		Node n1 = p1.getContainerNode();
-		Node n2 = p2.getContainerNode();
-		return getCommonAncestor(n1, n2);
-	}
-
-	/**
-	 * Get lowest ancestor of a 'node' which is block type.
-	 * 
-	 * @param node
-	 * @return the node
-	 */
-	 Node getBlockAncestor(Node node) {
-		if (!EditValidateUtil.validNode(node)) {
-			return null;
-		}
-		while (node != null && isChild(IHTMLConstants.TAG_BODY, node, true)) {
-			if (isBlockNode(node)) {
-				return node;
-			}
-			node = node.getParentNode();
-		}
-		return null;
-	}
-
-	/**
-	 * To see whether a node is block type.
-	 * 
-	 * @param node
-	 * @return true if is a block node
-	 */
-	public static boolean isBlockNode(Node node) {
-		return !isInline(node);
-	}
-
-	/**
-	 * @param node
-	 * @return true if is table cell
-	 */
-	static boolean isTableCell(Node node) {
-		if (node instanceof INodeNotifier) {
-			Object adapter = ((INodeNotifier) node)
-					.getAdapterFor(ICSSStyle.class);
-			if (adapter != null) {
-				ICSSStyle style = (ICSSStyle) adapter;
-				String display = style.getDisplay();
-				return display.equalsIgnoreCase(ICSSPropertyID.VAL_TABLE_CELL);
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * To see if a node's display type is inline.
-	 * 
-	 * @param refNode 
-	 * @return true if is inline
-	 */
-	public static boolean isInline(Node refNode) {
-		Node node = refNode;
-		EditPart part = Target.resolvePart(node);
-		if (part instanceof ElementEditPart) {
-			node = ((ElementEditPart) part).getTagConvert().getResultElement();
-		}
-		if (isText(node)) {
-			return true;
-		} else if (node instanceof INodeNotifier) {
-			Object adapter = ((INodeNotifier) node)
-					.getAdapterFor(ICSSStyle.class);
-			if (adapter != null) {
-				ICSSStyle style = (ICSSStyle) adapter;
-				String display = style.getDisplay();
-				return (display.equalsIgnoreCase(ICSSPropertyID.VAL_INLINE)
-						|| //
-						display
-								.equalsIgnoreCase(ICSSPropertyID.VAL_INLINE_TABLE)
-						|| //
-						display.equalsIgnoreCase(ICSSPropertyID.VAL_COMPACT) || //
-				display.equalsIgnoreCase(ICSSPropertyID.VAL_RUN_IN));
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @param node
-	 * @return true if is list item
-	 */
-	public static boolean isListItem(Node node) {
-		if (node instanceof INodeNotifier) {
-			Object adapter = ((INodeNotifier) node)
-					.getAdapterFor(ICSSStyle.class);
-			if (adapter != null) {
-				ICSSStyle style = (ICSSStyle) adapter;
-				String display = style.getDisplay();
-				return (display.equalsIgnoreCase(ICSSPropertyID.VAL_LIST_ITEM));
-			}
-		}
-		return false;
-	}
-
-	/**
-     * The net effect of this method is that (subject to flags), true
-     * is returned if 'node' is the descendant (not really a child)
-     * of a tag with a local name in the list of 'names'.
-     * 
-     * TODO C.B: I hate method.  Need to rename and possibly rewrite
-     * 
-	 * @param names -- check this list for valid local names
-	 * @param node -- the node to check
-	 * @param ignoreCase -- if true, each node name has toLowerCase applied to
-     * it before checking for it names.  NOTE: this assumes that names is already
-     * in lowercase.  TODO: this is crappy assumption
-	 * @param noSame -- if true, then node is skipped and only its parent nodes are
-     * checked
-	 * @return true if the local name of node or one of its parents
-     * is in the array of Strings called names.
-	 */
-	public static boolean isChild(final String names[], Node node,
-			boolean ignoreCase, boolean noSame) {
-		if (node == null) {
-			return false;
-		}
-		if (noSame) {
-			node = node.getParentNode();
-		}
-        
-        final List namesAsList = Arrays.asList(names);
-        
-		while (node != null && !isDocument(node)) {
-			String nodeName = node.getLocalName();
-
-			if (nodeName != null)
-            {
-			    if (ignoreCase)
-                {
-			        nodeName = nodeName.toLowerCase();
-                }
-                
-                if (namesAsList.contains(nodeName))
-                {
-                    return true;
-                }
-			}
-            Node oldNode = node;
-			node = node.getParentNode();
-            if (oldNode == node)
-            {
-                throw new IllegalStateException("Infinite loop discovered in DOM tree");
-            }
-		}
-		return false;
-	}
-
-	/**
-	 * Determine whether a node is a child of node that is named as 'name', if
-	 * the node itself is named as 'name' return true also.
-	 * 
-	 * @param name
-	 * @param node
-	 * @param ignoreCase 
-	 * @return true if is child
-	 */
-	public static boolean isChild(String name, Node node, boolean ignoreCase) {
-		if (node == null) {
-			return false;
-		}
-
-		while (node != null && node.getNodeType() != Node.DOCUMENT_NODE) {
-			String nodeName = node.getLocalName();
-			if (nodeName != null
-					&& (ignoreCase && name.equalsIgnoreCase(nodeName) || !ignoreCase
-							&& name.equalsIgnoreCase(nodeName))) {
-				return true;
-			}
-			node = node.getParentNode();
-		}
-		return false;
-	}
-
-	/**
-	 * To see whether 'node' is 'ancestor's child.
-	 * 
-	 * @param ancestor
-	 * @param node
-	 * @return true if is child
-	 */
-	public static boolean isChild(Node ancestor, Node node) {
-		if (node == null || ancestor == null) {
-			return false;
-		}
-
-		if (isDocument(ancestor)) {
-			return true;
-		}
-		while (node != null && !isDocument(ancestor)) {
-			if (node == null) {
-				break;
-			}
-			if (node == ancestor) {
-				return true;
-			}
-			node = node.getParentNode();
-		}
-		return false;
-	}
-
-	/**
-	 * Get next sibling node to position's container node.
-	 * 
-	 * @param position
-	 * @return the node
-	 */
-	Node getNextSibling(IDOMPosition position) {
-		if (position.isText()) {
-			return position.getContainerNode().getNextSibling();
-		}
-        return position.getNextSiblingNode();
-	}
-
-	/**
-	 * Get previous sibling node to position's container node.
-	 * 
-	 * @param position
-	 * @return the node
-	 */
-	Node getPreviousSibling(IDOMPosition position) {
-		if (position.isText()) {
-			return position.getContainerNode().getPreviousSibling();
-		}
-        return position.getPreviousSiblingNode();
-	}
-
-	/**
-	 * Get position's container node's parent.
-	 * 
-	 * @param position
-	 * @return the parent node
-	 */
-	Node getParent(IDOMPosition position) {
-		if (position.isText()) {
-			return position.getContainerNode().getParentNode();
-		}
-        return position.getContainerNode();
-	}
-
-	/**
-	 * Get node's sibling according to 'forward' direction
-	 * 
-	 * @param node
-	 * @param forward
-	 * @return the node
-	 */
-	public Node getSibling(Node node, boolean forward) {
-		EditValidateUtil.validNode(node);
-		if (forward) {
-			return node.getNextSibling();
-		}
-        return node.getPreviousSibling();
-	}
-
-	/**
-	 * Get position's container node's sibling.
-	 * 
-	 * @param position
-	 * @param forward
-	 * @return the node
-	 */
-	public Node getSibling(IDOMPosition position, boolean forward) {
-		if (forward) {
-			return getNextSibling(position);
-		}
-        return getPreviousSibling(position);
-	}
-
-	/**
-	 * Get position's container node's editable items number. this is temp
-	 * functions for future use.
-	 * 
-	 * @param position
-	 * @return the size
-	 */
-	int getSize(IDOMPosition position) {
-		EditValidateUtil.validPosition(position);
-		if (position.isText()) {
-			return ((Text) position.getContainerNode()).getLength();
-		}
-        if (position.getContainerNode().hasChildNodes()) {
-        	return position.getContainerNode().getChildNodes().getLength();
-        }
-        return 0;
-	}
-
-	/**
-	 * Valid position and return text, if it contains text node.
-	 * 
-	 * @param position
-	 * @return the text
-	 */
-	public Text getText(IDOMPosition position) {
-		if (position.isText()) {
-			if (position.getContainerNode() != null) {
-				return (Text) position.getContainerNode();
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param node
-	 * @return the document for  node
-	 */
-	public static Document getDocumentNode(Node node) {
-		if (node != null) {
-			return isDocument(node) ? (Document) node : node.getOwnerDocument();
-		}
-		return null;
-	}
-
-	/**
-	 * To see whether a node is empty, here we can insert rules to see whether
-	 * it is empty, for delete operation, it could be deleted.
-	 * 
-	 * @param node
-	 * @return true if node empty
-	 */
-	static boolean isEmptyNode(Node node) {
-		if (node.getNodeType() == Node.TEXT_NODE) {
-			return isTransparentText(node);
-		}
-		if (node.getChildNodes() == null
-				|| node.getChildNodes().getLength() == 0) {
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * To see whther a node is text node.
-	 * 
-	 * @param node
-	 * @return true if the node is a text node
-	 */
-	public static boolean isText(Node node) {
-		return node != null && node.getNodeType() == Node.TEXT_NODE;
-	}
-
-	/**
-	 * To see whether a node is Document node.
-	 * 
-	 * @param node
-	 * @return true if the node is a doc node
-	 */
-	public static boolean isDocument(Node node) {
-		return node != null && node.getNodeType() == Node.DOCUMENT_NODE;
-	}
-
-	/**
-	 * Get style from parent node. from first paret 'firstF', we will traverse
-	 * the tree up untile reaching Document node, get all style node's, we may
-	 * insert rules here to stop the search at a before paricular node. Style
-	 * nodes could <b>, <u>...
-	 * 
-	 * @param children
-	 * @param firstF
-	 */
-	void assignFather(Vector children, Node firstF) {
-		if (children.size() == 0) {
-			return;
-		}
-		if (firstF != null && !isDocument(firstF)) {
-			String name = firstF.getNodeName();
-			// To see whether it is a style node that is our anticipated node.
-			if (name != null && HTML_STYLE_NODES.contains(name.toLowerCase())) {
-				Node newParent = firstF.cloneNode(false);
-				while (children.size() > 0) {
-					newParent.appendChild((Node) children.remove(0));
-				}
-				children.add(newParent);
-			}
-			assignFather(children, firstF.getParentNode());
-		}
-	}
-
-	/**
-	 * Get a node that is at Indexed position 'pos' in 'model'.
-	 * 
-	 * @param model
-	 * @param pos
-	 * @return the
-	 */
-	IndexedRegion getPosNode(IStructuredModel model, int pos) {
-		IndexedRegion inode = model.getIndexedRegion(pos);
-		return inode;
-	}
-
-	/**
-	 * If the pos is at right edge within container.
-	 * 
-	 * @param node
-	 * @param pos
-	 * @return true is at right edge
-	 */
-	boolean isAtRightMostWithin(Node node, int pos) {
-		return getNodeEndNameStartIndex(node) == pos;
-	}
-
-	/**
-	 * Create the node, if 'refNode' is null, then position is at the edge of
-	 * 'container'. otherwize calculate refNode's related index in its parent's
-	 * children list and return DOMPosition.
-	 * 
-	 * @param container
-	 * @param refNode
-	 * @param forward  
-	 * @return the dom position
-	 */
-	IDOMPosition createDomposition(Node container, Node refNode,
-			boolean forward) {
-		if (refNode == null) {
-			if (forward && container.hasChildNodes()) {
-				return new DOMPosition(container, container.getChildNodes()
-						.getLength());
-			}
-            return new DOMPosition(container, 0);
-		}
-        Assert.isTrue(refNode.getParentNode() == container);
-        int index = getNodeIndex(refNode);
-        if (!forward) {
-        	index++;
-        }
-        return new DOMPosition(container, index);
-	}
-
-	/**
-	 * @param fModel
-	 * @param textSelection
-	 * @return the design range
-	 */
-	static DesignRange convertToDesignRange(IStructuredModel fModel,
-			TextSelection textSelection) {
-		int start = textSelection.getOffset();
-		int end = textSelection.getLength() + start;
-		IDOMPosition startDomPos = EditModelQuery.getInstance()
-				.createDomposition((IDOMModel) fModel, start, false);
-		IDOMPosition endDomPos = EditModelQuery.getInstance()
-				.createDomposition((IDOMModel) fModel, end, false);
-		if (startDomPos == null) {
-			startDomPos = endDomPos;
-		} else if (endDomPos == null) {
-			endDomPos = startDomPos;
-		}
-		if (startDomPos != null) {
-			DesignPosition startPos = null, endPos = null;
-			startPos = DOMPositionHelper.toDesignPosition(startDomPos);
-			endPos = DOMPositionHelper.toDesignPosition(endDomPos);
-			if (startPos != null) {
-				return new DesignRange(startPos, endPos);
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Create IDOMPosition based on Indexed 'position' in model. If node at
-	 * position is text, use position to calculate DOMPosition offset,
-	 * otherwize, simply create position pointed to container's children list's
-	 * edge.
-	 * 
-	 * @param model
-	 * @param position
-	 * @param adjust 
-	 * @return the dom position
-	 */
-	public IDOMPosition createDomposition(IDOMModel model, int position,
-			boolean adjust) {
-		return createDomposition1(model, position, adjust);
-	}
-
-	/**
-	 * Create IDOMPosition based on Indexed 'position' in model. If node at
-	 * position is text, use position to calculate DOMPosition offset,
-	 * otherwize, simply create position pointed to container's children list's
-	 * edge.
-	 * 
-	 * @param model
-	 * @param position
-	 * @param adjust 
-	 * @return the dom position
-	 */
-	public IDOMPosition createDomposition1(IDOMModel model, int position,
-			boolean adjust) {
-		try {
-			// get the container
-			Object object = getPosNode(model, position);
-			if (object == null && position > 0) {
-				// The end of file?
-				object = getPosNode(model, position - 1);
-			}
-			Node container = null;
-			if (object == null) {
-				// empty file?
-				return new DOMPosition(model.getDocument(), 0);
-			}
-			container = (Node) object;
-			Object oppNode = getPosNode(model, position - 1);
-			if (oppNode != null
-					&& !EditModelQuery.isChild((Node) oppNode, container)
-					&& //
-					!EditModelQuery.isInline(container)
-					&& EditModelQuery.isInline((Node) oppNode)) {
-				container = (Node) oppNode;
-			}
-			int location = EditHelper.getInstance().getLocation(container,
-					position, false);
-			IDOMPosition result = null;
-			switch (location) {
-			case 1:
-			case 2:
-				result = new DOMRefPosition(container, false);
-				break;
-			case 4:
-			case 5:
-				result = new DOMRefPosition(container, true);
-				break;
-			case 3:
-				if (EditModelQuery.isText(container)) {
-					result = new DOMPosition(container, position
-							- EditModelQuery.getNodeStartIndex(container));
-				} else {
-					result = new DOMPosition(container, container
-							.getChildNodes().getLength());
-				}
-			}
-			return result;
-		} catch (Exception e) {
-			// "Error in position creation"
-			_log.error("Error.EditModelQuery.0" + e); //$NON-NLS-1$
-			return null;
-		}
-	}
-
-	/**
-	 * Calculate node's Indexed length in model.
-	 * 
-	 * @param node
-	 * @return the node length
-	 */
-	public static int getNodeLenth(Node node) {
-		if (node != null
-               && EditValidateUtil.validNode(node)) {
-			return ((IndexedRegion) node).getEndOffset()
-					- ((IndexedRegion) node).getStartOffset();
-		}
-        return 0;
-	}
-
-	/**
-	 * Return 'node' indexed start position Example: |<a></a>, the position is
-	 * indicated by '|'
-	 * 
-	 * @param node
-	 * @return the start index
-	 */
-	public static int getNodeStartIndex(Node node) {
-		if (EditValidateUtil.validNode(node) && node instanceof IndexedRegion) {
-			return ((IndexedRegion) node).getStartOffset();
-		}
-		return -1;
-	}
-
-	/**
-	 * Return 'node' indexed end position Example: <a></a>|, the position is
-	 * indicated by '|'
-	 * 
-	 * @param node
-	 * @return the end index
-	 */
-	public static int getNodeEndIndex(Node node) {
-		if (EditValidateUtil.validNode(node) && node instanceof IndexedRegion) {
-			return ((IndexedRegion) node).getEndOffset();
-		}
-		return -1;
-	}
-
-	/**
-	 * Get node at indexed position.
-	 * 
-	 * @param model 
-	 * @param position
-	 * @return the node at position
-	 */
-	static Node getNodeAt(IStructuredModel model, int position) {
-		try {
-			IndexedRegion region = model.getIndexedRegion(position);
-			if (region instanceof Node) {
-				return (Node) region;
-			}
-			return null;
-		} catch (Exception e) {
-			// "Error in region node creation"
-			_log.error("Error.EditModelQuery.1", e); //$NON-NLS-1$
-			return null;
-		}
-	}
-
-	/**
-	 * Return 'node' indexed start name's end position Example: <a>|aaa </a>,
-	 * the position is indicated by '|'
-	 * 
-	 * @param node
-	 * @return the index
-	 */
-	public static int getNodeStartNameEndIndex(Node node) {
-		if (isText(node)) {
-			return getNodeStartIndex(node);
-		}
-		if (EditValidateUtil.validNode(node) && node instanceof IDOMNode) {
-			IStructuredDocumentRegion region = ((IDOMNode) node)
-					.getStartStructuredDocumentRegion();
-			if (region != null) {
-				return region.getEndOffset();
-			}
-			// else
-			// {
-			// // if (node.hasChildNodes())
-			// // {
-			// // // Node should always have start name, so this part should
-			// never reach,
-			// // // the assert is for inner debug.
-			// // Assert.isTrue(false);
-			// // return getNodeStartIndex(node);
-			// // }
-			// }
-		}
-		// This should never happen.
-		return getNodeStartIndex(node);
-	}
-
-	/**
-	 * Return 'node' indexed end name' start position Example: <a>aaa| </a>, the
-	 * position is indicated by '|' If node is <a /> style or there is no </a>
-	 * to pair with <a>, the function return -1.
-	 * 
-	 * @param node
-	 * @return the start index
-	 */
-	public static int getNodeEndNameStartIndex(Node node) {
-		if (isText(node)) {
-			return getNodeEndIndex(node);
-		}
-		if (EditValidateUtil.validNode(node) && node instanceof IDOMNode) {
-			IStructuredDocumentRegion region = ((IDOMNode) node)
-					.getEndStructuredDocumentRegion();
-			if (region != null) {
-				return region.getStartOffset();
-			}
-			// else
-			// {
-			// if (node.hasChildNodes())
-			// {
-			// return getNodeEndIndex(node);
-			// }
-			// }
-		}
-		return getNodeEndIndex(node);
-	}
-
-	/**
-	 * To see if a node is <a/>style.
-	 * 
-	 * @param node
-	 * @return the single region node
-	 */
-	public boolean isSingleRegionNode(Node node) {
-		if (getNodeEndNameStartIndex(node) == getNodeEndIndex(node)
-				&& !node.hasChildNodes()) {
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * To see if a node has child that is not transparent child only.
-	 * 
-	 * @param node
-	 * @return true if node has transparent children
-	 */
-	boolean hasNonTransparentChild(Node node) {
-        NodeList children = node.getChildNodes();
-        for (int i = 0, n = children.getLength(); i < n; i++) {
-        	Object child = children.item(i);
-        	if (isText((Node) child)) {
-        		if (!isTransparentText((Node) child)) {
-        			return true;
-        		}
-        	} else {
-        		return true;
-        	}
-        }
-		return false;
-	}
-
-	/**
-	 * To see if a node has child that is not transparent child only.
-	 * 
-	 * @param node
-	 * @param excludes 
-	 * @return true if has transparent child
-	 */
-	public boolean hasNonTransparentChild(Node node, String[] excludes) {
-		if (!node.hasChildNodes()) {
-			return false;
-		}
-        NodeList children = node.getChildNodes();
-        for (int i = 0, n = children.getLength(); i < n; i++) {
-        	Object child = children.item(i);
-        	if (isText((Node) child)) {
-        		if (!isTransparentText((Node) child)) {
-        			return true;
-        		}
-        	} else if (!Arrays.asList(excludes).contains(
-        			((Node) child).getLocalName())) {
-        		return true;
-        	}
-        }
-		return false;
-	}
-
-	/**
-	 * To see whether tag has whitespace char.
-	 * 
-	 * @param node
-	 * @return true if has whitespace neighbor
-	 */
-	public boolean hasWhitespaceNeighbor(Node node) {
-		node = getNeighbor(node, true);
-		if (isWidget(node)) {
-			return false;
-		}
-        node = getFirstLeafChild(node);
-        return isTransparentText(node);
-
-	}
-
-	/**
-	 * @param host
-	 * @return true if host is a widget
-	 */
-	public static boolean isWidget(Object host) {
-		boolean result = false;
-		EditPart part = null;
-		if (host instanceof EditPart) {
-			part = (EditPart) host;
-		} else if (host instanceof Node) {
-			part = Target.resolvePart((Node) host);
-			if (part == null) {
-				part = new HTMLEditPartsFactory(
-						(IDOMDocument) getDocumentNode((Node) host))
-						.createEditPart(null, host);
-			}
-		}
-		if (part instanceof NodeEditPart) {
-			result = ((NodeEditPart) part).isWidget();
-		}
-		return result;
-	}
-
-	/**
-	 * To combind whitespace chars, only one whitespace string should be create.
-	 * 
-	 * @param node
-	 * @return true if node is  redundant whitespace
-	 */
-	boolean isRedundantWightspaces(Node node) {
-		if (isTransparentText(node) && hasWhitespaceNeighbor(node)) {
-			return true;
-		}
-        return false;
-	}
-
-	/**
-	 * @param node
-	 * @param names
-	 * @param ignoreCase
-	 * @return true if node has ancestors in the name list
-	 * TODO: bad practice
-	 */
-	public static boolean hasAncestor(Node node, String names[],
-			boolean ignoreCase) {
-		Assert.isTrue(names != null);
-		while (node != null && !EditModelQuery.isDocument(node)) {
-			if (isElement(node))
-				if (containItem(names, node, ignoreCase)) {
-					return true;
-				}
-			node = node.getParentNode();
-		}
-		return false;
-	}
-
-	/**
-	 * To see if 'node' has ancestor that has name as 'name'
-	 * 
-	 * @param node
-	 * @param name
-	 * @param ignoreCase
-	 * @return true if node has the named ancestor
-	 */
-	public static boolean hasAncestor(Node node, String name, boolean ignoreCase) {
-		Assert.isTrue(name != null);
-		while (node != null && !EditModelQuery.isDocument(node)) {
-			if (node.getNodeName() != null)
-				if ((ignoreCase && name.equalsIgnoreCase(node.getNodeName())) || //
-						(!ignoreCase && name.equals(node.getNodeName()))) {
-					return true;
-				}
-			node = node.getParentNode();
-		}
-		return false;
-	}
-
-	/**
-	 * To see if 'node' has direct ancestors that has names listed in 'name[]'
-	 * 
-	 * @param node
-	 * @param top
-	 * @param ignoreCase
-	 * @return the list of ancestors
-	 */
-	public static List getAncestors(Node node, String top, boolean ignoreCase) {
-		List result = new ArrayList();
-		Assert.isTrue(node != null);
-		while (node != null && !EditModelQuery.isDocument(node)) {
-			result.add(node);
-			String name = node.getLocalName();
-			if (ignoreCase && top.equalsIgnoreCase(name) || //
-					(!ignoreCase && top.equals(name))) {
-				break;
-			}
-			node = node.getParentNode();
-		}
-		return result;
-	}
-
-	/**
-	 * Copy old node's children to newNode.If the newNode is the father of the
-	 * old node,then the old node's children will be inserted before the old
-	 * node,otherwise,the old node's children just append to the newNode.
-	 * 
-	 * @param old
-	 * @param newNode
-	 */
-	public static void copyChildren(Node old, Node newNode) {
-		Node child = old.getFirstChild();
-		while (child != null) {
-			Node next = child.getNextSibling();
-			child = old.removeChild(child);
-			if (old.getParentNode() == newNode) {
-				newNode.insertBefore(child, old);
-			} else {
-				newNode.appendChild(child);
-			}
-			child = next;
-		}
-	}
-
-	/**
-	 * @param node
-	 * @return true if node is an element
-	 */
-	private static boolean isElement(Node node) {
-		return node.getNodeType() == Node.ELEMENT_NODE;
-	}
-
-	/**
-	 * Return a offspring of ancestor, the offsprint has a name listed in
-	 * childrenNames.
-	 * 
-	 * @param ancestor
-	 * @param childrenNames
-	 * @param maxLevelToSearch
-	 *            the max level from ancestor to the offspring in family tree.
-	 * @param ignoreCase
-	 * @return the node
-	 */
-	public static Node getChild(Node ancestor, String childrenNames[],
-			int maxLevelToSearch, boolean ignoreCase) {
-		if (ancestor == null || maxLevelToSearch < 0) {
-			return null;
-		}
-        if (ancestor.getLocalName() != null
-        		&& ignoreCase
-        		&& Arrays.asList(childrenNames).contains(
-        				ancestor.getLocalName().toLowerCase())
-        		|| !ignoreCase
-        		&& Arrays.asList(childrenNames).contains(
-        				ancestor.getLocalName())) {
-        	return ancestor;
-        }
-		NodeList children = ancestor.getChildNodes();
-		for (int i = 0, n = children.getLength(); i < n; i++) {
-			Node result = getChild(children.item(i), childrenNames,
-					maxLevelToSearch - 1, ignoreCase);
-			if (result != null) {
-				return result;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Return a offspring of ancestor, the nodes on the tree are type of
-	 * DeferredElementImpl, the offsprint has a name listed in childrenNames.
-	 * 
-	 * @param ancestor
-	 * @param childrenNames
-	 * @param maxLevelToSearch
-	 *            the max level from ancestor to the offspring in family tree.
-	 * @param ignoreCase
-	 * @return the node
-	 */
-	static Node getChildDeferredNode(Node ancestor,
-			String childrenNames[], int maxLevelToSearch, boolean ignoreCase) {
-		if (ancestor == null || maxLevelToSearch < 0) {
-			return null;
-		}
-        String nodeName = ancestor.getNodeName();
-        if (nodeName != null && ignoreCase
-        		&& Arrays.asList(childrenNames).contains(nodeName)
-        		|| !ignoreCase
-        		&& Arrays.asList(childrenNames).contains(nodeName)) {
-        	return ancestor;
-        }
-		NodeList children = ancestor.getChildNodes();
-		for (int i = 0, n = children.getLength(); i < n; i++) {
-			Node result = getChildDeferredNode(children.item(i), childrenNames,
-					maxLevelToSearch - 1, ignoreCase);
-			if (result != null) {
-				return result;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param node
-	 * @return if has tranparent node only
-	 */
-	public static boolean hasTransparentNodeOnly(Node node) {
-		NodeList children = node.getChildNodes();
-		for (int i = 0, n = children.getLength(); i < n; i++) {
-			if (!EditModelQuery.isTransparentText(children.item(i))) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * @param name
-	 * @param node
-	 * @param ignoreCase
-	 * @return the node
-	 */
-	public static Node getParent(String name, Node node, boolean ignoreCase) {
-		if (node == null) {
-			return null;
-		}
-
-		while (node != null && node.getNodeType() != Node.DOCUMENT_NODE) {
-			String nodeName = node.getLocalName();
-			if (nodeName != null
-					&& (ignoreCase && name.equalsIgnoreCase(nodeName) || !ignoreCase
-							&& name.equalsIgnoreCase(nodeName))) {
-				return node;
-			}
-			node = node.getParentNode();
-		}
-		return null;
-	}
-
-	/**
-	 * get Elements with the same localName as the input localName under the
-	 * rootNode,it is a recursive computation.
-	 * 
-	 * @param rootNode
-	 * @param localName
-	 * @param caseSensitive
-	 * @param list
-	 *            The input list to hold the matched elements.
-	 */
-	public static void getElementByLocalName(Node rootNode, String localName,
-			boolean caseSensitive, List list) {
-		if (list == null) {
-			return;
-		}
-		NodeList nodeList = rootNode.getChildNodes();
-		if (nodeList != null && nodeList.getLength() > 0) {
-			for (int i = 0, size = nodeList.getLength(); i < size; i++) {
-				Node node = nodeList.item(i);
-				if (node.getNodeType() == Node.ELEMENT_NODE) {
-					String nodeLocalName = node.getLocalName();
-					if (caseSensitive && localName.equals(nodeLocalName)) {
-						list.add(node);
-					} else if (!caseSensitive
-							&& localName.equalsIgnoreCase(nodeLocalName)) {
-						list.add(node);
-					}
-					getElementByLocalName(node, localName, true, list);
-				}
-
-			}
-		}
-	}
-
-	/**
-	 * @param tags
-	 * @param node
-	 * @param ignoreCase
-	 * @return the true if contains item
-	 */
-	public static boolean containItem(String[] tags, Node node,
-			boolean ignoreCase) {
-		if (ignoreCase) {
-			for (int i = 0, size = tags.length; i < size; i++) {
-				if (tags[i] == null) {
-					continue;
-				}
-				if (tags[i].equalsIgnoreCase(node.getNodeName())) {
-					return true;
-				}
-			}
-		} else {
-			for (int i = 0, size = tags.length; i < size; i++) {
-				if (tags[i] == null) {
-					continue;
-				}
-				if (tags[i].equals(node.getNodeName())) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/EditValidateUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/EditValidateUtil.java
deleted file mode 100644
index 46409de..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/EditValidateUtil.java
+++ /dev/null
@@ -1,385 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRefPosition;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * This class is used for debug purpose, and can be used to test some invalid
- * status in the functions. Generally all the methods here will throw exception
- * when invalid status happens.
- * 
- * @author mengbo
- */
-public final class EditValidateUtil {
-	private static final Logger _logger = PDPlugin
-			.getLogger(EditValidateUtil.class);
-
-	private static final boolean ALERT = false;
-
-	private static final boolean REPORT = false;
-
-	/**
-	 * A valid position means container node, offset are all valid.
-	 * 
-	 * @param position
-	 * @return true if the position is valid
-	 */
-	public static boolean validPosition(IDOMPosition position) {
-		try {
-			boolean result = true;
-			Assert.isTrue(position != null
-					&& position.getContainerNode() != null
-					&& position.getOffset() >= 0);
-			Node container = position.getContainerNode();
-			result &= validNode(container);
-			int offset = position.getOffset();
-			if (position.isText()) {
-				int length = ((Text) container).getLength();
-				Assert.isTrue(offset <= length);
-			} else {
-				if (position instanceof DOMPosition && offset > 0) {
-					Assert.isTrue(container.hasChildNodes()
-							&& container.getChildNodes().getLength() >= offset);
-				}
-			}
-			return result;
-		} catch (Exception e) {
-			// "error", "Error in validPosition"
-			if (ALERT) {
-				PDPlugin
-						.getAlerts()
-						.confirm(
-								"Alert.EditValidateUtil.Title", "Alert.EditValidateUtil.Position", e); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			if (REPORT) {
-				// "Invalid position:"
-				_logger.error("Error.EditValidateUtil.Position", e); //$NON-NLS-1$
-			}
-			return false;
-		}
-	}
-
-	/**
-	 * @param position
-	 * @return true if position is valid
-	 */
-	public static boolean validPosition(DesignPosition position) {
-		try {
-			boolean result = true;
-			Assert.isTrue(position != null
-					&& position.getContainerPart() != null
-					&& position.getContainerNode() != null
-					&& position.getOffset() >= 0);
-			Node container = position.getContainerNode();
-			result &= validNode(container);
-			int offset = position.getOffset();
-			if (EditModelQuery.isText(container)) {
-				int length = ((Text) container).getLength();
-				Assert.isTrue(offset <= length);
-			} else {
-				if (position instanceof DesignRefPosition && offset > 0) {
-					Assert.isTrue(container.hasChildNodes()
-							&& container.getChildNodes().getLength() >= offset);
-				}
-			}
-			return result;
-		} catch (Exception e) {
-			// "error", "Error in validPosition"
-			if (ALERT) {
-				PDPlugin
-						.getAlerts()
-						.confirm(
-								"Alert.EditValidateUtil.Title", "Alert.EditValidateUtil.Position", e); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			if (REPORT) {
-				// "Invalid position:"
-				_logger.error("Error.EditValidateUtil.Position", e); //$NON-NLS-1$
-			}
-			return false;
-		}
-	}
-
-	/**
-	 * Valid node is TextNode and it's valid node.
-	 * 
-	 * @param node
-	 * @return true if node is valid
-	 */
-	public static boolean validText(Node node) {
-		try {
-			boolean result = true;
-			Assert.isTrue(node.getNodeType() == Node.TEXT_NODE);
-			Assert.isTrue(((Text) node).getData() != null);
-			result &= validNode(node);
-			return result;
-		} catch (Exception e) {
-			// "Error", "Error in validText"
-			if (ALERT) {
-				PDPlugin
-						.getAlerts()
-						.confirm(
-								"Alert.EditValidateUtil.Title", "Alert.EditValidateUtil.Text", e); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			if (REPORT) {
-				// "Invalid Text:"
-				_logger.error("Error.EditValidateUtil.Text", e); //$NON-NLS-1$
-			}
-			return false;
-		}
-	}
-
-	/**
-	 * A valid node is resided in the model tree
-	 * 
-	 * @param node
-	 * @return true if node is valid
-	 */
-	public static boolean validNode(Node node) {
-		try {
-			Assert.isTrue(node instanceof IDOMNode);
-			Assert.isTrue((node.getNodeType() == Node.DOCUMENT_NODE)
-					|| (node.getParentNode() != null));
-			// What's this?
-			return true;
-		} catch (Exception e) {
-			// "Error", "Error in validNode"
-			if (ALERT) {
-				PDPlugin
-						.getAlerts()
-						.confirm(
-								"Alert.EditValidateUtil.Title", "Alert.EditValidateUtil.Node", e); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			if (REPORT) {
-				// "Invalid node:"
-				_logger.error("Error.EditValidateUtil.Node", e); //$NON-NLS-1$
-			}
-			return false;
-		}
-	}
-
-	/**
-	 * A valid DOMRange contains valid IDOMPosition, and it should not be within
-	 * node like 'HEAD'. The later one might not be suitble to valid in this
-	 * util, it should be checked by some edit valid helper.
-	 * 
-	 * @param range
-	 * @return true if range is valid
-	 */
-	public static boolean validRange(DOMRange range) {
-		try {
-			// TODO: never read EditModelQuery modelQuery = EditModelQuery.getInstance();
-			boolean result = true;
-			IDOMPosition start = range.getStartPosition();
-			IDOMPosition end = range.getEndPosition();
-			result &= validPosition(start);
-			result &= validPosition(end);
-            // TODO: never read
-//			Node startContainer = start.getContainerNode();
-//			Node endContainer = end.getContainerNode();
-			// Assert.isTrue(isValidForEditing(modelQuery.getCommonAncestor(startContainer,
-			// endContainer)));
-			return result;
-		} catch (Exception e) {
-			// "Error", "Error in validRange"
-			if (ALERT) {
-				PDPlugin
-						.getAlerts()
-						.confirm(
-								"Alert.EditValidateUtil.Title", "Alert.EditValidateUtil.Range", e); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			if (REPORT) {
-				// "Invalid Range:"
-				_logger.error("Error.EditValidateUtil.Range", e); //$NON-NLS-1$
-			}
-			return false;
-		}
-	}
-
-	/**
-	 * @param text
-	 * @param index
-	 * @return true if the index is valid
-	 */
-	public static boolean validStringIndex(Node text, int index) {
-		try {
-			Assert.isTrue(index >= 0 && ((Text) text).getLength() >= index);
-			return validText(text);
-		} catch (Exception e) {
-			// "Error", "Error in validStringIndex"
-			if (ALERT) {
-				PDPlugin
-						.getAlerts()
-						.confirm(
-								"Alert.EditValidateUtil.Title", "Alert.EditValidateUtil.StringIndex", e); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			if (REPORT) {
-				// "Invalid Index in String:"
-				_logger.error("Error.EditValidateUtil.StringIndex", e); //$NON-NLS-1$
-			}
-			return false;
-		}
-	}
-
-	/**
-	 * @param text
-	 * @param index
-	 * @param offset
-	 * @return true if the index offset is valid
-	 */
-	public static boolean validStringIndexOffset(Node text, int index,
-			int offset) {
-		try {
-			Assert.isTrue(index >= 0 && (index + offset) >= 0
-					&& ((Text) text).getLength() >= (index + offset)
-					&& ((Text) text).getLength() >= index);
-			return validText(text);
-		} catch (Exception e) {
-			// "error", "Error in validStringIndex"
-			if (ALERT) {
-				PDPlugin
-						.getAlerts()
-						.confirm(
-								"Alert.EditValidateUtil.Title", "Alert.EditValidateUtil.IndexOffset", e); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			if (REPORT) {
-				// "Invalid index or offset in String:"
-				_logger.error("Error.EditValidateUtil.IndexOffset", e); //$NON-NLS-1$
-			}
-			return false;
-		}
-	}
-
-//	private static void dumpPosition(String message, IDOMPosition position,
-//			boolean forward) {
-		// for future internal debug
-		// message(message);
-		// _logger.debug("vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv");
-		// if (position != null)
-		// {
-		// Node container = position.getContainerNode();
-		// Node node = null;
-		// String text = null;
-		// if (getContainerLength(container) > 0)
-		// {
-		// if (!position.isText())
-		// {
-		// int index = forward ? position.getOffset() : position.getOffset() -
-		// 1;
-		// node = container.getChildNodes().item(index);
-		// }
-		// else
-		// {
-		// int index = forward ? position.getOffset() : position.getOffset() -
-		// 1;
-		// if (index >= 0 && index < getContainerLength(container))
-		// {
-		// text = ((Text) container).substringData(index, 1);
-		// }
-		// else
-		// {
-		// text = null;
-		// }
-		// }
-		// }
-		// _logger.debug("DOMPosition type?:" + (position instanceof
-		// DOMPosition) + " container name: " +
-		// position.getContainerNode().getLocalName() + " offset:" +
-		// position.getOffset()
-		// + " length:" + getContainerLength(position.getContainerNode()));
-		// if (node != null)
-		// {
-		// _logger.debug("node to operate:" + node.getLocalName());
-		// }
-		// if (text != null)
-		// {
-		// _logger.debug("text to operate:\"" + text + "\" length:" +
-		// text.length());
-		// }
-		// }
-		// _logger.debug("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^");
-//	}
-	
-	/**
-	 * @param pos
-	 * @param forward
-	 * @return true if the position if vallid for editing relative to forward (true) or backward  (false)
-	 */
-	public static boolean isValidForEditing(IDOMPosition pos, boolean forward) {
-		if (pos == null) {
-			return false;
-		}
-		if (pos.isText()) {
-			return true;
-		}
-        Node container = pos.getContainerNode();
-        // only head can't be edited
-        if (EditModelQuery.isChild(IHTMLConstants.TAG_HEAD, container,
-        		true)) {
-        	return false;
-        }
-        Node sibling = EditModelQuery.getInstance().getSibling(pos,
-        		forward);
-        if (sibling != null) {
-        	if (EditModelQuery.isText(sibling)) {
-        		return true;
-        	}
-        	Assert.isTrue(sibling.getLocalName() != null);
-        	if (EditModelQuery.UNREMOVEBLE_TAGS.contains(sibling
-        			.getLocalName().toLowerCase())) {
-        		return false;
-        	}
-        }
-        return true;
-	}
-
-	/**
-	 * @param node
-	 * @return true if node is valid for editing
-	 */
-	public static boolean isValidForEditing(Node node) {
-		if (EditModelQuery.isChild(IHTMLConstants.TAG_HEAD, node, true)) {
-			return false;
-		}
-		return true;
-	}
-
-	private EditValidateUtil()
-	{
-	    // do nothing
-	}
-	// Reserved for inner use.
-	//
-	// private static void errorNotice()
-	// {
-	// try
-	// {
-	// // FileInputStream fileau = new
-	// FileInputStream("C:\\WINNT\\Media\\ringout.wav");
-	// // AudioStream as = new AudioStream(fileau);
-	// // AudioPlayer.player.start(as);
-	// }
-	// catch (Exception e)
-	// {
-	// System.out.println("error in file open");
-	// }
-	//
-	// }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/IDOMPosition.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/IDOMPosition.java
deleted file mode 100644
index fa3169d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/IDOMPosition.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import org.w3c.dom.Node;
-
-/**
- * An IDOMPosition represents a position in the DOM tree. There are multiple
- * ways of identify a position in the tree, such as by saying a offset in
- * parent, or before/after a particular node.
- * 
- * NOTE: IDOMPosition and its child class should be implemented as literal. that
- * is, they should not be changed after it is constructed.
- * 
- * @author mengbo
- */
-public interface IDOMPosition {
-	/**
-	 * 
-	 * @param forward
-	 *            if true, same as getNextSiblingNode(), if false, same as
-	 *            getPreviousSiblingNode
-	 * @return the sibling
-	 */
-	public Node getSibling(boolean forward);
-
-	/**
-	 * @return the next sibling node
-	 */
-	public Node getNextSiblingNode();
-
-	/**
-	 * @return the previous sibling node
-	 */
-	public Node getPreviousSiblingNode();
-
-	/**
-	 * @return the container node
-	 */
-	public Node getContainerNode();
-
-	/**
-	 * @return the offset
-	 */
-	public int getOffset();
-
-	/**
-	 * @return true if is text
-	 */
-	public boolean isText();
-
-	/**
-	 * "original" has been replace by "replacement" in the model. If this
-	 * replacement will affect this IDOMPosition, then this method should return
-	 * a new position that is valid after the replacement. If this replacement
-	 * won't affect this position, then the original position should be
-	 * returned.
-	 * 
-	 * @param original
-	 * @param replacement
-	 * @return the dom position
-	 */
-	public IDOMPosition handleReplacement(Node original, Node replacement);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/IDOMRefPosition.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/IDOMRefPosition.java
deleted file mode 100644
index 5a841df..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/IDOMRefPosition.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import org.w3c.dom.Node;
-
-/**
- * A IDOMRefPosition locate a position by reference a node in the dom tree. It
- * mean a position after node, before a node, or before anything in a node, or
- * after anything in a node.
- * 
- * @author mengbo
- * @version 1.5
- */
-public interface IDOMRefPosition extends IDOMPosition {
-	/**
-	 * 
-	 * @return the reference (wrapped) node
-	 */
-	public Node getReferenceNode();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/ValidatorSupport.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/ValidatorSupport.java
deleted file mode 100644
index 19fda90..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/ValidatorSupport.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom;
-
-import javax.xml.namespace.QName;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.pagedesigner.adapters.IBodyInfo;
-import org.eclipse.jst.pagedesigner.adapters.internal.BodyInfo;
-import org.eclipse.jst.pagedesigner.editors.palette.TagToolPaletteEntry;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.PaletteItemManager;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.TaglibPaletteDrawer;
-import org.eclipse.jst.pagedesigner.utils.CommandUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * Simple utility class.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class ValidatorSupport 
-{
-	/**
-	 * Equivalent to checkContainer(position new QName[]{qname}
-	 * 
-	 * @param position
-	 * @param qname
-	 * @return true if the tag identified by qname is found as a parent
-     * of position.
-	 */
-	public static boolean checkContainer(IDOMPosition position, QName qname) {
-		return checkContainer(position, new QName[] { qname });
-	}
-
-	/**
-	 * Check for any of the containers listed in qname starting from qname and working
-	 * up the DOM parent chain.
-	 * 
-	 * @param position
-	 * @param qname
-	 * @return true if one of the tags identified by qname is found as a parent
-	 * of position.
-	 */
-	public static boolean checkContainer(IDOMPosition position, QName qname[]) {
-		Node node = position.getContainerNode();
-		while (node != null) {
-			if (node instanceof Text) {
-				node = node.getParentNode();
-				continue;
-			}
-			if (node instanceof Element) {
-				Element ele = (Element) node;
-				String url = CMUtil.getElementNamespaceURI(ele);
-				String tag = ele.getLocalName();
-
-				for (int i = 0; i < qname.length; i++) {
-					if (tag.equalsIgnoreCase(qname[i].getLocalPart())) {
-						if (url == null) {
-							// this means something wrong. To be error tolerant,
-							// we treat it
-							// as if url is same
-							return true;
-						} else if (url.equalsIgnoreCase(qname[i].getNamespaceURI())) {
-							return true;
-						}
-					}
-				}
-
-				node = node.getParentNode();
-				continue;
-			}
-			break;
-		}
-		return false;
-	}
-
-	/**
-	 * @param position
-	 * @param container
-	 * @param customizationData 
-	 * @return the new dom position for the inserted container or null if could
-	 * not insert
-	 */
-	public static IDOMPosition insertContainer(IDOMPosition position,
-			QName container, IAdaptable customizationData) {
-		final TaglibPaletteDrawer category = 
-		    PaletteItemManager.getCurrentInstance().findCategoryByURI
-		        (container.getNamespaceURI());
-		if (category != null){
-			final TagToolPaletteEntry tagItem = 
-			    category.getTagPaletteEntryByTagName(container.getLocalPart());
-			final IDOMModel model = 
-			    ((IDOMNode) position.getContainerNode()).getModel();
-			final Element form = CommandUtil.excuteInsertion
-			    (tagItem, model, position, customizationData);
-			if (form != null) {
-				DOMPosition pos = new DOMPosition(form, 0);
-				return pos;
-			}
-		}
-        return null;
-	}
-
-	/**
-	 * @return the body info
-	 */
-	public static IBodyInfo getBodyInfo() {
-	    //TODO: change this to be meta-data driven.
-		return BodyInfo.getInstance();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/html/ColStructure.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/html/ColStructure.java
deleted file mode 100644
index 2f4f9c1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/html/ColStructure.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom.html;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class ColStructure implements Comparable {
-	private final int _column;
-
-	private final int _colSpan;
-
-	/**
-	 * @param column
-	 * @param colSpan
-	 */
-	public ColStructure(int column, int colSpan) {
-		this._column = column;
-		this._colSpan = colSpan;
-	}
-
-	/**
-	 * @return the column span
-	 */
-	public int getColSpan() {
-		return _colSpan;
-	}
-
-	/**
-	 * @return the column
-	 */
-	public int getColumn() {
-		return _column;
-	}
-
-	public int compareTo(Object o) {
-		ColStructure cs = (ColStructure) o;
-		if (this._column > cs.getColumn()) {
-			return 1;
-		} else if (this._column == cs.getColumn()) {
-			return 0;
-		} else {
-			return -1;
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/html/TableChildElementPosition.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/html/TableChildElementPosition.java
deleted file mode 100644
index 1b290ef..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/html/TableChildElementPosition.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom.html;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableChildElementPosition {
-	private int _rowIndex = -10;
-
-	private int _columnIndex = -10;
-
-	/**
-	 * @return Returns the _columnIndex.
-	 */
-	public int getColumnIndex() {
-		return _columnIndex;
-	}
-
-	/**
-	 * @param index
-	 *            The _columnIndex to set.
-	 */
-	public void setColumnIndex(int index) {
-		_columnIndex = index;
-	}
-
-	/**
-	 * @return Returns the _rowIndex.
-	 */
-	public int getRowIndex() {
-		return _rowIndex;
-	}
-
-	/**
-	 * @param index
-	 *            The _rowIndex to set.
-	 */
-	public void setRowIndex(int index) {
-		_rowIndex = index;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/html/TableUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/html/TableUtil.java
deleted file mode 100644
index 70216e0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dom/html/TableUtil.java
+++ /dev/null
@@ -1,531 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.dom.html;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableUtil {
-	private Element _fakeCell = null;
-
-	private Element _table = null;
-
-	private List[] _trCellLists = null;
-
-	/**
-	 * judge whether there is rowspan>1 cell in the tr
-	 * 
-	 * @param tr
-	 *            TR element in a table
-	 * @return true if there is rowspan>1 cell in the tr
-	 */
-	public static boolean hasRowSpanElement(Element tr) {
-		List list = DOMUtil.getElementChildren(tr);
-		Iterator itr = list.iterator();
-		while (itr.hasNext()) {
-			Element ele = (Element) itr.next();
-			int value = DOMUtil.getIntAttributeIgnoreCase(ele,
-					IHTMLConstants.ATTR_ROWSPAN, 1);
-			if (value > 1) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * judge whether a tr is affected by row span cell in the previous trs.
-	 * 
-	 * @param trList
-	 *            list holds all tr elements in a table
-	 * @param tr
-	 * @param index
-	 *            tr index in the DOM tree
-	 * @return true if tr is affected by row span cell in the previous trs
-	 */
-	public static boolean isAffectedByRowSpan(List trList, Element tr, int index) {
-		Node parent = tr.getParentNode();
-		int dex = index;
-		while (--dex >= 0) {
-			Element preTr = (Element) trList.get(dex);
-			if (preTr.getParentNode() != parent) {
-				break;
-			}
-            int maxRowSpan = countMaxRowSpan(preTr);
-            if (maxRowSpan > (index - dex)) {
-            	return true;
-            }
-		}
-		return false;
-	}
-
-	/**
-	 * count all tr in the table
-	 * 
-	 * @param element
-	 *            table
-	 * @param list
-	 *            list to hold tr elements
-	 */
-	public static void getTrElements(Element element, List list) {
-		NodeList nodeList = element.getChildNodes();
-		for (int i = 0, size = nodeList.getLength(); i < size; i++) {
-			Node node = nodeList.item(i);
-			if (node.getNodeType() == Node.ELEMENT_NODE) {
-				Element ele = (Element) node;
-				if (ele.getNodeName().equalsIgnoreCase(IHTMLConstants.TAG_TR)) {
-					list.add(ele);
-				} else if (ele.getNodeName().equalsIgnoreCase(
-						IHTMLConstants.TAG_THEAD)
-						|| ele.getNodeName().equalsIgnoreCase(
-								IHTMLConstants.TAG_TBODY)
-						|| ele.getNodeName().equalsIgnoreCase(
-								IHTMLConstants.TAG_TFOOT)) {
-					getTrElements(ele, list);
-				}
-			}
-
-		}
-	}
-
-	/**
-	 * count row index in the code DOM tree according to the display index
-	 * 
-	 * @param table
-	 * @param displayIndex
-	 * @return the row index
-	 */
-	public static int countRowIndexInDOMTree(Element table, int displayIndex) {
-
-		int footRows = countSectionRows(table, IHTMLConstants.TAG_TFOOT);
-		if (footRows == 0) {
-			return displayIndex;
-		}
-		int headRows = countSectionRows(table, IHTMLConstants.TAG_THEAD);
-		List list = new ArrayList();
-		getTrElements(table, list);
-		int bodyRows = list.size() - headRows - footRows;
-		// if display index is in TFOOT area
-		if (displayIndex >= (list.size() - footRows)) {
-			int index = displayIndex - bodyRows;
-			return index;
-		}
-		// if display index is in TBODY area
-		else if (displayIndex >= headRows) {
-			int index = displayIndex + footRows;
-			return index;
-		}
-		// if display index is in THEAD area
-		else {
-			return displayIndex;
-		}
-	}
-
-	/**
-	 * get row count in the specified section
-	 * 
-	 * @param table
-	 * @param sectionName
-	 *            child element name of table, like THEAD or TFOOT
-	 * @return the row count in the section
-	 */
-	public static int countSectionRows(Element table, String sectionName) {
-		NodeList nodeList = table.getChildNodes();
-		for (int i = 0, size = nodeList.getLength(); i < size; i++) {
-			Node node = nodeList.item(i);
-			if (node.getNodeType() == Node.ELEMENT_NODE) {
-				Element ele = (Element) node;
-				if (node.getNodeName().equalsIgnoreCase(sectionName)) {
-					List list = DOMUtil.getChildElementsByTagIgnoreCase(ele,
-							IHTMLConstants.TAG_TR);
-					if (list != null) {
-						return list.size();
-					}
-				}
-			}
-
-		}
-		return 0;
-	}
-
-	/**
-	 * constructor
-	 * 
-	 * @param table
-	 */
-	public TableUtil(Element table) {
-		this._table = table;
-		this._trCellLists = fillTrCells();
-	}
-
-	/**
-	 * get tr cells list
-	 * 
-	 * @return the list of tr cells
-	 */
-	public List[] getTrCellLists() {
-		return this._trCellLists;
-	}
-
-	/**
-	 * calculate row and column index for tr or td/th
-	 * 
-	 * @param node
-	 *            tr or td/th
-	 * @return the position
-	 */
-	public TableChildElementPosition getPosition(Node node) {
-		TableChildElementPosition position = new TableChildElementPosition();
-		String tagName = node.getLocalName();
-		if (IHTMLConstants.TAG_TR.equalsIgnoreCase(tagName)) {
-			List list = new ArrayList();
-			getTrElements(this._table, list);
-			for (int i = 0, size = list.size(); i < size; i++) {
-				Element tr = (Element) list.get(i);
-				if (tr == node) {
-					position.setRowIndex(i);
-					break;
-				}
-			}
-		} else if (IHTMLConstants.TAG_TD.equalsIgnoreCase(tagName)
-				|| IHTMLConstants.TAG_TH.equalsIgnoreCase(tagName)) {
-			Element tr = (Element) node.getParentNode();
-			TableChildElementPosition pos = getPosition(tr);
-			position.setRowIndex(pos.getRowIndex());
-			List[] lists = getTrCellLists();
-			List list = lists[pos.getRowIndex()];
-			for (int i = 0, size = list.size(); i < size; i++) {
-				Element td = (Element) list.get(i);
-				if (td == node) {
-					position.setColumnIndex(i);
-					break;
-				}
-			}
-		} else {
-			boolean hasTDParent = false;
-			Node childBackup = node;
-			while (!IHTMLConstants.TAG_TABLE.equalsIgnoreCase(childBackup
-					.getParentNode().getLocalName())) {
-				childBackup = childBackup.getParentNode();
-				String localName = childBackup.getLocalName();
-				if (IHTMLConstants.TAG_TD.equalsIgnoreCase(localName)
-						|| IHTMLConstants.TAG_TH.equalsIgnoreCase(localName)) {
-					hasTDParent = true;
-					break;
-				}
-			}
-			if (hasTDParent) {
-				position = getPosition(childBackup);
-			}
-		}
-		return position;
-	}
-
-	/**
-	 * get column count
-	 * 
-	 * @return the column count
-	 */
-	public int getColumnCount() {
-		List[] lists = this._trCellLists;
-		if (lists != null) {
-			int max = 0;
-			for (int i = 0, size = lists.length; i < size; i++) {
-				List list = lists[i];
-				if (list.size() > max) {
-					max = list.size();
-				}
-			}
-			return max;
-		}
-		return 0;
-	}
-
-	/**
-	 * judge whether there is columnspan>1 cell in the column
-	 * 
-	 * @param columnIndex
-	 *            column index in a table
-	 * @return true if there is columnspan>1 cell in the column
-	 */
-	public boolean hasColumnSpanElement(int columnIndex) {
-		List cells = getColumnCells(columnIndex);
-		if (cells != null) {
-			Iterator itr = cells.iterator();
-			while (itr.hasNext()) {
-				Element cell = (Element) itr.next();
-				int value = DOMUtil.getIntAttributeIgnoreCase(cell,
-						IHTMLConstants.ATTR_COLSPAN, 1);
-				if (value > 1) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * judge whether the column has cell affected by column span cell in
-	 * privious columns
-	 * 
-	 * @param columnIndex
-	 * @return true if the column has cell affected by column span cell in
-     * privious columns 
-	 */
-	public boolean isAffectedByColSpan(int columnIndex) {
-		int index = columnIndex;
-		while (--index >= 0) {
-			List cells = getColumnCells(index);
-			int max = countMaxColSpan(cells);
-			if (max > (columnIndex - index)) {
-				return true;
-			}
-		}
-
-		return false;
-	}
-
-	/**
-	 * get cells in the specified column of the table
-	 * 
-	 * @param columnIndex
-	 * @return the column cells
-	 */
-	public List getColumnCells(int columnIndex) {
-		List list = new ArrayList();
-
-		List[] lists = this._trCellLists;
-		for (int i = 0; i < lists.length; i++) {
-			List tempList = lists[i];
-			if (tempList.size() <= columnIndex) {
-				continue;
-			}
-			list.add(tempList.get(columnIndex));
-		}
-		return list;
-	}
-
-	/**
-	 * count max row span in the tr
-	 * 
-	 * @param tr
-	 * @return
-	 */
-	private static int countMaxRowSpan(Element tr) {
-		List list = DOMUtil.getElementChildren(tr);
-		int max = countMaxValue(list, IHTMLConstants.ATTR_ROWSPAN);
-		return max;
-	}
-
-	/**
-	 * count max attr value
-	 * 
-	 * @param list
-	 * @param attr
-	 * @return
-	 */
-	private static int countMaxValue(List list, String attr) {
-		int max = 1;
-		Iterator itr = list.iterator();
-		while (itr.hasNext()) {
-			Element ele = (Element) itr.next();
-			int value = DOMUtil.getIntAttributeIgnoreCase(ele, attr, 1);
-			if (value > max) {
-				max = value;
-			}
-		}
-		return max;
-	}
-
-	/**
-	 * count max col span in a column
-	 * 
-	 * @param list
-	 * @return
-	 */
-	private int countMaxColSpan(List list) {
-		int max = countMaxValue(list, IHTMLConstants.ATTR_COLSPAN);
-		return max;
-	}
-
-	/**
-	 * get fake element to fill tr cell
-	 * 
-	 * @return
-	 */
-	private Element getFakeElement() {
-		if (_fakeCell != null) {
-			return _fakeCell;
-		}
-		_fakeCell = this._table.getOwnerDocument().createElement("fake");
-		return _fakeCell;
-	}
-
-	/**
-	 * initial every tr cells according to th and td under each tr element
-	 * 
-	 * @param trList
-	 * @return
-	 */
-	private List[] initialTrCells(List trList) {
-		int size = trList.size();
-		List[] lists = new ArrayList[size];
-
-		if (trList != null) {
-			for (int i = 0, n = trList.size(); i < n; i++) {
-				lists[i] = new ArrayList();
-				Element tr = (Element) trList.get(i);
-				List domCells = DOMUtil.getElementChildren(tr);
-				Iterator itr = domCells.iterator();
-				while (itr.hasNext()) {
-					Element cell = (Element) itr.next();
-					lists[i].add(cell);
-					int colSpan = DOMUtil.getIntAttributeIgnoreCase(cell,
-							IHTMLConstants.ATTR_COLSPAN, 1);
-					while (--colSpan > 0) {
-						Element fakeElement = getFakeElement();
-						lists[i].add(fakeElement);
-					}
-				}
-			}
-
-		}
-
-		return lists;
-
-	}
-
-	/**
-	 * after initial tr cells,fill tr with fake cells if necessary.
-	 * 
-	 * @return
-	 */
-	private List[] fillTrCells() {
-		List list = new ArrayList();
-		getTrElements(this._table, list);
-
-		List[] lists = initialTrCells(list);
-		int size = lists.length;
-
-		int headRows = countSectionRows(this._table, IHTMLConstants.TAG_THEAD);
-		if (headRows > 0) {
-			List[] headList = new ArrayList[headRows];
-			for (int i = 0; i < headRows; i++) {
-				headList[i] = lists[i];
-			}
-			fillSectionTrCells(headList);
-		}
-
-		int footRows = countSectionRows(this._table, IHTMLConstants.TAG_TFOOT);
-		if (footRows > 0) {
-			List[] footList = new ArrayList[footRows];
-			for (int i = 0; i < footRows; i++) {
-				footList[i] = lists[headRows + i];
-			}
-			fillSectionTrCells(footList);
-		}
-
-		int bodyRows = size - headRows - footRows;
-		if (bodyRows > 0) {
-			int bodyCount = 1;
-			int k = 0;
-			List bodys = new ArrayList();
-			Element tr = (Element) list.get(headRows + footRows);
-			Node node = tr.getParentNode();
-			for (int i = 1; i < bodyRows; i++) {
-				Element tempTr = (Element) list.get(headRows + footRows + i);
-				if (tempTr.getParentNode() != node) {
-					node = tempTr.getParentNode();
-					bodys.add(new Integer(i - k));
-					k = i;
-					bodyCount++;
-				}
-			}
-			bodys.add(new Integer(bodyRows - k));
-
-			for (int j = 0; j < bodyCount; j++) {
-				int num = ((Integer) bodys.get(j)).intValue();
-				List[] bodyList = new ArrayList[num];
-				int m = headRows + footRows;
-
-				for (int i = 0; i < num; i++) {
-					bodyList[i] = lists[m + i];
-				}
-				fillSectionTrCells(bodyList);
-				m = m + num;
-			}
-
-		}
-
-		return lists;
-	}
-
-	/**
-	 * fill tr cells under each table section,like THEAD,TFOOT,TBODY.
-	 * 
-	 * @param lists
-	 */
-	private void fillSectionTrCells(List[] lists) {
-		Element cell = null;
-
-		if (lists != null) {
-			for (int i = 1, size = lists.length; i < size; i++) {
-				List insertPoints = new ArrayList();
-
-				for (int j = 0; j < i; j++) {
-					List list = lists[j];
-					for (int column = 0; column < list.size(); column++) {
-						cell = (Element) list.get(column);
-						if (cell.getTagName().equalsIgnoreCase("fake")) {
-							continue;
-						}
-						int rowSpan = DOMUtil.getIntAttributeIgnoreCase(cell,
-								IHTMLConstants.ATTR_ROWSPAN, 1);
-						if (rowSpan > (i - j)) {
-							int colSpan = DOMUtil.getIntAttributeIgnoreCase(
-									cell, IHTMLConstants.ATTR_COLSPAN, 1);
-							insertPoints.add(new ColStructure(column, colSpan));
-						}
-					}
-				}
-				// there are fake column cell need to be inserted into this tr
-				if (insertPoints.size() > 0) {
-					Collections.sort(insertPoints);
-					List trCells = lists[i];
-
-					Iterator itr = insertPoints.iterator();
-					while (itr.hasNext()) {
-						ColStructure cls = (ColStructure) itr.next();
-						int loop = cls.getColSpan();
-						int column = cls.getColumn();
-						while (loop-- != 0) {
-							trCells.add(column++, getFakeElement());
-						}
-
-					}
-				}
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/DTManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/DTManager.java
deleted file mode 100644
index f62e2a5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/DTManager.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager;
-
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.pagedesigner.converter.ConverterFactoryRegistry;
-import org.eclipse.jst.pagedesigner.converter.IConverterFactory;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.internal.DTTagConverterFactory;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.w3c.dom.Element;
-
-/**
- * DTManager is the top-level entry point for design-time (DT) services, such
- * as tag converters and design-time information.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public class DTManager {
-
-	private static DTManager instance;
-	private IDTInfoFactory _dtInfoFactory;
-
-	private DTManager() {
-        // no external instantiation
-	}
-
-	/**
-	 * Gets the singleton DTManager instance.
-	 * 
-	 * @return The singleton DTManager instance.
-	 */
-	public static synchronized DTManager getInstance() {
-		if (instance == null) {
-			instance = new DTManager();
-		}
-		return instance;
-	}
-
-	/**
-	 * Gets an ITagConverter instance for the specified Element and mode.
-	 * 
-	 * @param element Element instance for which to locate and return an
-	 * ITagConverter instance.
-	 * @param mode Mode flag (use IConverterFactory constants).
-	 * @param document Target IDOMDocument instance.
-	 * @return An ITagConverter instance for the specified Element and mode.
-	 */
-	public ITagConverter getTagConverter(Element element, int mode, IDOMDocument document) {
-		ITagConverter tagConverter = null;
-		String nsURI = CMUtil.getElementNamespaceURI(element);
-		//try MD-driven approach
-		IConverterFactory tagConverterFactory = getTagConverterFactory(nsURI);
-		if (tagConverterFactory != null) {
-			tagConverter = tagConverterFactory.createConverter(element, mode);
-			if (tagConverter != null) {
-				tagConverter.setDestDocument(document);
-			} else {
-				//fallback to contributed (non-MD-driven) approach
-				tagConverter = ConverterFactoryRegistry.getInstance().createTagConverter(element, mode, document);
-			}
-		}
-		return tagConverter;
-	}
-
-	/**
-	 * Gets an IConverterFactory instance for the specified namespace URI.
-	 * 
-	 * @param nsURI Namespace URI.
-	 * @return An IConverterFactory instance for the specified namespace URI.
-	 */
-	protected IConverterFactory getTagConverterFactory(String nsURI) {
-		//TODO: future - expand to first look for registered factories
-		return new DTTagConverterFactory();
-	}
-
-	/**
-	 * Gets an IDTInfo instance for the specified Element.
-	 * 
-	 * @param element Element instance for which to locate and return IDTInfo
-	 * instance.
-	 * @return An IDTInfo instance for the specified Element.
-	 */
-	public IDTInfo getDTInfo(Element element) {
-		IDTInfo dtInfo = null;
-		String nsURI = CMUtil.getElementNamespaceURI(element);
-		IDTInfoFactory dtInfoFactory = getDTInfoFactory(nsURI);
-		if (dtInfoFactory != null) {
-			dtInfo = dtInfoFactory.getDTInfo(element);
-		}
-		return dtInfo;
-	}
-
-	/**
-	 * Gets an IDTInfoFactory instance for the specified namespace URI.
-	 * 
-	 * @param nsURI Namespace URI.
-	 * @return An IDTInfoFactory instance for the specified namespace URI.
-	 */
-	protected IDTInfoFactory getDTInfoFactory(String nsURI) {
-		if (_dtInfoFactory == null) {
-			_dtInfoFactory = new DefaultDTInfoFactory();
-		}
-		return _dtInfoFactory;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/DefaultDTInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/DefaultDTInfo.java
deleted file mode 100644
index 6d57cfc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/DefaultDTInfo.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo;
-
-/**
- * Default IDTInfo implementation.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public class DefaultDTInfo implements IDTInfo {
-
-	private DTInfo dtInfo = null;
-	private Trait trait = null;
-
-	/**
-	 * Constructs an instance that wraps the specified DTInfo instance.
-	 * 
-	 * @param dtInfo DTInfo (EMF model object) instance.
-	 * @param trait Trait instance that was queried to load this data.
-	 */
-	public DefaultDTInfo(DTInfo dtInfo, Trait trait) {
-		this.dtInfo = dtInfo;
-		this.trait = trait;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.internal.provisional.IDTInfo#getTagConvertInfo()
-	 */
-	public TagConvertInfo getTagConvertInfo() {
-		return dtInfo.getTagConvertInfo();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.internal.provisional.IDTInfo#getTagDecorateInfos()
-	 */
-	public List getTagDecorateInfos() {
-		return dtInfo.getTagDecorateInfos();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.internal.provisional.IDTInfo#getTagDecorateInfo(java.lang.String)
-	 */
-	public TagDecorateInfo getTagDecorateInfo(String id) {
-		TagDecorateInfo tdInfo = null;
-		EList tdInfos = dtInfo.getTagDecorateInfos();
-		Iterator itTDInfos = tdInfos.iterator();
-		while (itTDInfos.hasNext()) {
-			TagDecorateInfo curTDInfo = (TagDecorateInfo)itTDInfos.next();
-			if (curTDInfo.getId().equals(id)) {
-				tdInfo = curTDInfo;
-				break;
-			}
-		}
-		return tdInfo;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.internal.provisional.IDTInfo#getTrait()
-	 */
-	public Trait getTrait() {
-		return trait;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/DefaultDTInfoFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/DefaultDTInfoFactory.java
deleted file mode 100644
index 1a37ec6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/DefaultDTInfoFactory.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo;
-import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-
-/**
- * Default IDTInfoFactory implementation.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public class DefaultDTInfoFactory implements IDTInfoFactory {
-
-	/**
-	 * Key (in metadata) of IDTInfo trait.
-	 */
-	public static final String DTINFO_TRAIT_KEY = "dt-info";
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.internal.provisional.IDTInfoFactory#getDTInfo(org.w3c.dom.Element)
-	 */
-	public IDTInfo getDTInfo(Element element) {
-		IDTInfo dtInfo = null;
-		String nsURI = CMUtil.getElementNamespaceURI(element);
-		IProject project = getProject(element);
-		if (project != null) {
-			ITaglibDomainMetaDataModelContext context = TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(project, nsURI);
-			if (context != null) {
-				Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(context, element.getLocalName(), DTINFO_TRAIT_KEY);
-				if (trait != null) {
-					DTInfo dtInfoModelObject = (DTInfo)trait.getValue();
-					if (dtInfoModelObject != null) {
-						dtInfo = new DefaultDTInfo(dtInfoModelObject, trait);
-					}
-				}
-			}
-		}
-		return dtInfo;
-	}
-
-	/**
-	 * Gets the IProject instance that contains the model of the specified
-	 * Element.
-	 * 
-	 * @param element Element instance.
-	 * @return IProject instance that contains the model of the specified
-	 * Element.
-	 */
-	protected IProject getProject(Element element) {
-		IProject project = null;
-		if (element instanceof IDOMNode) {
-			IDOMModel model = ((IDOMNode)element).getModel();
-			if (model != null) {
-				project = StructuredModelUtil.getProjectFor(model);
-			}
-		}
-		return project;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/IDTInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/IDTInfo.java
deleted file mode 100644
index 9ce9e07..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/IDTInfo.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager;
-
-import java.util.List;
-
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo;
-
-/**
- * Encapsulates design-time (DT) information.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public interface IDTInfo {
-
-	/**
-	 * Gets the encapsulated TagConvertInfo instance.
-	 * 
-	 * @return TagConvertInfo instance.
-	 */
-	public TagConvertInfo getTagConvertInfo();
-
-	/**
-	 * Gets the collection of encapsulated TagDecorateInfo instances.
-	 * 
-	 * @return Collection of TagDecorateInfo instances.
-	 */
-	public List getTagDecorateInfos();
-
-	/**
-	 * Gets an encapsulated TagDecorateInfo instance matching specified ID.
-	 * 
-	 * @param id ID of desired TagDecorateInfo instance.
-	 * @return TagDecorateInfo instance matching specified ID.
-	 */
-	public TagDecorateInfo getTagDecorateInfo(String id);
-
-	/**
-	 * Gets the Trait instance that was queried to load the metadata.
-	 * 
-	 * @return Trait instance that was queried to load the metadata.
-	 */
-	public Trait getTrait();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/IDTInfoFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/IDTInfoFactory.java
deleted file mode 100644
index 80f3b6d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/IDTInfoFactory.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager;
-
-import org.w3c.dom.Element;
-
-/**
- * Factory that provides IDTInfo instances.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public interface IDTInfoFactory {
-
-	/**
-	 * Gets an IDTInfo instance for the specified Element.
-	 * 
-	 * @param element Element instance for which to locate and return IDTInfo
-	 * instance.
-	 * @return An IDTInfo instance for the specified Element.
-	 */
-	public IDTInfo getDTInfo(Element element);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/AbstractTagConverterContext.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/AbstractTagConverterContext.java
deleted file mode 100644
index b37242b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/AbstractTagConverterContext.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter;
-
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * Abstract ITagConverter implementation of ITagConverterContext.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public abstract class AbstractTagConverterContext implements ITagConverterContext {
-
-	/**
-	 * ITagConverter instance.
-	 */
-	protected ITagConverter tagConverter;
-
-	/**
-	 * Instantiates an instance for the specified ITagConverter instance. 
-	 * @param tagConverter ITagConverter instance.
-	 */
-	public AbstractTagConverterContext(ITagConverter tagConverter) {
-		this.tagConverter = tagConverter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterContext#addChild(org.w3c.dom.Node, org.eclipse.jst.pagedesigner.converter.ConvertPosition)
-	 */
-	public abstract void addChild(Node childNode, ConvertPosition position);
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterContext#copyChildren(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public abstract void copyChildren(Element srcElement, Element destElement);
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterContext#createElement(java.lang.String)
-	 */
-	public abstract Element createElement(String tag);
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterContext#createText(java.lang.String)
-	 */
-	public abstract Text createText(String content);
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterContext#getHostElement()
-	 */
-	public Element getHostElement() {
-		Element element = null;
-		if (tagConverter != null) {
-			element = tagConverter.getHostElement(); 
-		}
-		return element;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/IOutputRenderer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/IOutputRenderer.java
deleted file mode 100644
index 30263d7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/IOutputRenderer.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter;
-
-import org.w3c.dom.Element;
-
-/**
- * Produces output rendering for ITagConverter instances.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public interface IOutputRenderer {
-
-	/**
-	 * Uses the ITagConverterContext argument to produce output rendering.
-	 * 
-	 * @param tagConverterContext ITagConverterContext instance providing
-	 * ITagConverter-specific context and functionality.
-	 * @return Element instance representing top Element in resulting output
-	 * tree.
-	 * 
-     * TODO: let's parameterize the return type either with a generic type
-     * or with Object so that sub-classes can co-vary
-	 */
-	public Element render(ITagConverterContext tagConverterContext);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITagConverterContext.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITagConverterContext.java
deleted file mode 100644
index b857c4e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITagConverterContext.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter;
-
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * Represents ITagConverter-specific context and functionality.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public interface ITagConverterContext {
-
-	/**
-	 * Gets ITagConverter instance's host Element instance.
-	 * 
-	 * @return ITagConverter instance's host Element instance.
-	 */
-	public Element getHostElement();
-
-	/**
-	 * Creates an Element instance to be used in ITagConverter's Document
-	 * instance.
-	 * 
-	 * @param tag Name of element to be created.
-	 * @return Element instance to be used in ITagConverter's Document
-	 * instance.
-	 */
-	public Element createElement(String tag);
-
-	/**
-	 * Creates a Text node instance to be used in ITagConverter's Document
-	 * instance.
-	 * 
-	 * @param content Textual content of the created text node.
-	 * @return Text node instance to be used in ITagConverter's Document
-	 * instance.
-	 */
-	public Text createText(String content);
-
-	/**
-	 * Adds a child Node instance to ITagConverter's collection of Nodes
-	 * requiring subsequent processing.
-	 * 
-	 * @param childNode Child Node instance requiring subsequent processing.
-	 * @param position ConvertPosition instance describing child Node
-	 * instance's position, relative to another Node instance.
-	 */
-	public void addChild(Node childNode, ConvertPosition position);
-
-	/**
-	 * Add all child Element instances of srcElement to ITagConverter's
-	 * collection of Nodes requiring subsequent processing.
-	 * 
-	 * @param srcElement Source Element instance from which child Elements are
-	 * copied.
-	 * @param destElement Destination Element instance to which child Elements
-	 * will be relative.
-	 */
-	public void copyChildren(Element srcElement, Element destElement);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITagConverterDecorator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITagConverterDecorator.java
deleted file mode 100644
index 713245f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITagConverterDecorator.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter;
-
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-
-/**
- * Decorates an ITagConverter instance as appropriate (generally
- * client-specific decoration performed after tag conversion).
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public interface ITagConverterDecorator {
-
-	/**
-	 * Decorates the ITagConverter instance as appropriate.
-	 * 
-	 * @param tagConverter ITagConverter instance to be decorated.
-	 */
-	public void decorate(ITagConverter tagConverter);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITransformOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITransformOperation.java
deleted file mode 100644
index dfb847a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITransformOperation.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter;
-
-import java.util.List;
-
-import org.w3c.dom.Element;
-
-/**
- * Defines an operation used during transformation of input Element instances
- * to output Element instances.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- * 
- * TODO: as with ITransformer, I'd like to consider
- * ITransfomOperation<SRC, RESULT>
- */
-public interface ITransformOperation {
-
-	/**
-	 * Transforms an input element instance to an output Element instance.
-	 * 
-	 * @param srcElement Original input Element instance.
-	 * @param curElement Current Element instance.
-	 * @return Resulting transformed Element instance.
-	 */
-	public Element transform(Element srcElement, Element curElement);
-
-	/**
-	 * Sets the ITagConverterContext instance allowing access to context and
-	 * functionality of the current ITagConverter instance.
-	 * 
-	 * @param tagConverterContext ITagConverterContext instance allowing access
-	 * to context and functionality of the current ITagConverter instance.
-     * 
-	 */
-	public void setTagConverterContext(ITagConverterContext tagConverterContext);
-
-	/**
-	 * Appends a child ITransformOperation instance.
-	 * 
-	 * @param operation Child ITransformOperation instance to be appended.
-	 */
-	public void appendChildOperation(ITransformOperation operation);
-
-	/**
-	 * Gets collection of child ITransformOperation instances.
-	 * 
-	 * @return Collection of child ITransformOperation instances (may be null).
-	 */
-	public List getChildOperations();
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITransformer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITransformer.java
deleted file mode 100644
index 49e99f2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/ITransformer.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter;
-
-import org.w3c.dom.Element;
-
-/**
- * Transforms an original input Element instance to an output Element instance
- * by invoking a collection of ITransformOperation instances.  
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public interface ITransformer {
-
-	/**
-	 * Appends an ITransformOperation instance to the collection.
-	 * 
-	 * @param operation ITransformOperation instance to be appended.
-     * API: does this need to be on the interface or could it be pushed
-     * into the instance constructor (i.e. factory).
-	 */
-	public void appendTransformOperation(ITransformOperation operation);
-
-	/**
-	 * Transforms an original input Element instance to an output Element
-	 * instance, typically by invoking each ITransformOperation instance in
-	 * this instance's collection.
-	 * 
-	 * @param srcElement Original input Element instance.
-	 * @return Transformed output Element instance.
-	 * 
-     * TODO: I'd like to consider templating the generic ITransformer
-     * interface to ITransformer<I,O> and making this a normative instance
-     * case of ITransformer<Element, Element>
-	 */
-	public Element transform(Element srcElement);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTHTMLOutputRenderer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTHTMLOutputRenderer.java
deleted file mode 100644
index b546750..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTHTMLOutputRenderer.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.internal;
-
-import java.util.Iterator;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jst.pagedesigner.dtmanager.DTManager;
-import org.eclipse.jst.pagedesigner.dtmanager.IDTInfo;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.IOutputRenderer;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterContext;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformer;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.TransformOperationFactory;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo;
-import org.w3c.dom.Element;
-
-/**
- * Design-time metadata-driven HTML IOutputRenderer implementation.
- * 
- * @author Ian Trimble - Oracle
- */
-public class DTHTMLOutputRenderer implements IOutputRenderer {
-
-	private ITagConverterContext tagConverterContext;
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.IOutputRenderer#render(org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterContext)
-	 */
-	public Element render(ITagConverterContext newTagConverterContext) {
-		this.tagConverterContext = newTagConverterContext;
-		Element srcElement = newTagConverterContext.getHostElement();
-		Element resultElement = null;
-		if (srcElement != null) {
-			ITransformer transformer = createTransformerFromDTInfo(srcElement);
-			if (transformer != null) {
-				resultElement = transformer.transform(srcElement);
-			}
-		}
-		return resultElement;
-	}
-
-	/**
-	 * Configures and returns an ITransformer instance for the specified source
-	 * Element.
-	 * 
-	 * @param element Element for which to configure and return an ITransformer
-	 * instance.
-	 * @return Configured ITransformer instance for the specified Element.
-	 */
-	protected ITransformer createTransformerFromDTInfo(Element element) {
-		ITransformer transformer = null;
-		DTManager dtManager = DTManager.getInstance();
-		IDTInfo dtInfo = dtManager.getDTInfo(element);
-		if (dtInfo != null) {
-			TagConvertInfo tcInfo = dtInfo.getTagConvertInfo();
-			if (tcInfo != null) {
-				transformer = new DefaultTransformer(tagConverterContext);
-				EList operations = tcInfo.getOperations();
-				if (!appendOperationsToTransformer(transformer, operations, dtInfo)) {
-					transformer = null;
-				}
-			}
-		}
-		return transformer;
-	}
-
-	private boolean appendOperationsToTransformer(ITransformer transformer, EList operations, IDTInfo dtInfo) {
-		Iterator itOperations = operations.iterator();
-		while (itOperations.hasNext()) {
-			Operation operation = (Operation)itOperations.next();
-			ITransformOperation currentTransformOperation = null;
-			String opID = operation.getId();
-			String[] params = getParamsArray(operation);
-			currentTransformOperation =
-				TransformOperationFactory.getInstance().getTransformOperation(opID, params);
-			if (currentTransformOperation != null) {
-				transformer.appendTransformOperation(currentTransformOperation);
-				EList childOperations = operation.getOperations();
-				if (childOperations != null && childOperations.size() > 0) {
-					if (!appendChildOperations(currentTransformOperation, childOperations, dtInfo)) {
-						return false;
-					}
-				}
-			} else {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	private boolean appendChildOperations(ITransformOperation parentOperation, EList operations, IDTInfo dtInfo) {
-		Iterator itOperations = operations.iterator();
-		while (itOperations.hasNext()) {
-			Operation operation = (Operation)itOperations.next();
-			ITransformOperation currentTransformOperation = null;
-			String opID = operation.getId();
-			String[] params = getParamsArray(operation);
-			currentTransformOperation =
-				TransformOperationFactory.getInstance().getTransformOperation(opID, params);
-			if (currentTransformOperation != null) {
-				parentOperation.appendChildOperation(currentTransformOperation);
-				EList childOperations = operation.getOperations();
-				if (childOperations != null && childOperations.size() > 0) {
-					if (!appendChildOperations(currentTransformOperation, childOperations, dtInfo)) {
-						return false;
-					}
-				}
-				
-			} else {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	private String[] getParamsArray(Operation operation) {
-		EList paramsList = operation.getParameters();
-		if (paramsList != null) {
-			Iterator itParamsList = paramsList.iterator();
-			String[] paramsArray = new String[paramsList.size()];
-			int index = 0;
-			while (itParamsList.hasNext()) {
-				Parameter param = (Parameter)itParamsList.next();
-				paramsArray[index++] = param.getValue();
-			}
-			return paramsArray;
-		}
-		//fall through - no params
-		return new String[0];
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTTagConverter.java
deleted file mode 100644
index f0d5099..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTTagConverter.java
+++ /dev/null
@@ -1,467 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.internal;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.converter.IDOMFactory;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo;
-import org.eclipse.jst.pagedesigner.editors.palette.TagImageManager;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-/**
- * Design-Time metadata-driven tag converter.
- * 
- * @author Ian Trimble - Oracle
- */
-public class DTTagConverter implements
-	ITagConverter, ITagEditInfo, INodeAdapter, IDOMFactory {
-
-	private Element hostElement;
-	private Element resultElement;
-	private Image visualImage;
-	private ImageDescriptor visualImageDescriptor;
-	private IDOMDocument destDocument;
-	private List childNodeList = Collections.EMPTY_LIST;
-	private NodeConvertPositionMap childVisualPositionMap;
-	private List nonVisualChildElementList = Collections.EMPTY_LIST;
-	private boolean isMultiLevel = false;
-	private boolean isVisualByHTML = true;
-	private boolean isWidget = false;
-	private int mode;
-	private int minHeight;
-	private int minWidth;
-	private boolean needBorderDecorator = false;
-	private boolean needTableDecorator = false;
-
-	/**
-	 * Constructs an instance for the specified source Element.
-	 * 
-	 * @param hostElement Source Element instance.
-	 */
-	public DTTagConverter(Element hostElement) {
-		this.hostElement = hostElement;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#convertRefresh(java.lang.Object)
-	 */
-	public void convertRefresh(Object context) {
-		childNodeList = new ArrayList();
-		childVisualPositionMap = new NodeConvertPositionMap();
-		nonVisualChildElementList = new ArrayList();
-		resultElement = new DTHTMLOutputRenderer().render(new DTTagConverterContext(this));
-		new DTTagConverterDecorator().decorate(this);
-		if (resultElement instanceof INodeNotifier) {
-			((INodeNotifier)resultElement).addAdapter(this);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#dispose()
-	 */
-	public void dispose() {
-		visualImage = null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#getChildModeList()
-	 */
-	public List getChildModeList() {
-		//need to reset the NodeConvertPositionMap at this time
-		childVisualPositionMap.reset();
-		return childNodeList;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#getChildVisualPosition(org.w3c.dom.Node)
-	 */
-	public ConvertPosition getChildVisualPosition(Node childModel) {
-		return childVisualPositionMap.get(childModel);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#getHostElement()
-	 */
-	public Element getHostElement() {
-		return hostElement;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#getNonVisualChildren()
-	 */
-	public List getNonVisualChildren() {
-		return nonVisualChildElementList;
-	}
-
-	/**
-	 * Sets the result Element instance; allows decorators to set an "unknown
-	 * tag" Element when tag conversion has not produced a result.
-	 * 
-	 * @param resultElement Result Element instance to be set.
-	 */
-	public void setResultElement(Element resultElement) {
-		this.resultElement = resultElement;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#getResultElement()
-	 */
-	public Element getResultElement() {
-		return resultElement;
-	}
-
-	/**
-	 * Sets the visual Image instance.
-	 * 
-	 * @param visualImage Visual Image instance.
-	 */
-	public void setVisualImage(Image visualImage) {
-		this.visualImage = visualImage;
-	}
-
-	/**
-	 * Sets the visual ImageDescriptor instance.
-	 * 
-	 * @param imageDescriptor Visual ImageDescriptor instance.
-	 */
-	public void setVisualImageDescriptor(ImageDescriptor imageDescriptor) {
-		this.visualImageDescriptor = imageDescriptor;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#getVisualImage()
-	 */
-	public Image getVisualImage() {
-		if (visualImage == null && visualImageDescriptor != null) {
-			visualImage = TagImageManager.getOrCreateImage(visualImageDescriptor);
-		}
-		return visualImage;
-	}
-
-	/**
-	 * Sets the "isMultiLevel" flag; allows decorators to manipulate this
-	 * setting.
-	 * 
-	 * @param isMultiLevel Sets the "isMultiLevel" flag to true or false.
-	 */
-	public void setMultiLevel(boolean isMultiLevel) {
-		this.isMultiLevel = isMultiLevel;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isMultiLevel()
-	 */
-	public boolean isMultiLevel() {
-		return isMultiLevel;
-	}
-
-	/**
-	 * Sets the "isVisualByHTML" flag; allows decorators to manipulate this
-	 * setting.
-	 * 
-	 * @param isVisualByHTML Sets the "isVisualByHTML" flag to true or false.
-	 */
-	public void setVisualByHTML(boolean isVisualByHTML) {
-		this.isVisualByHTML = isVisualByHTML;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isVisualByHTML()
-	 */
-	public boolean isVisualByHTML() {
-		return isVisualByHTML;
-	}
-
-	/**
-	 * Sets the "isWidget" flag; allows decorators to manipulate this setting.
-	 * 
-	 * @param isWidget Sets the "isWidget" flag to true or false.
-	 */
-	public void setWidget(boolean isWidget) {
-		this.isWidget = isWidget;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#isWidget()
-	 */
-	public boolean isWidget() {
-		return isWidget;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#setDestDocument(org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument)
-	 */
-	public void setDestDocument(IDOMDocument destDocument) {
-		this.destDocument = destDocument;
-	}
-
-	/**
-	 * Gets the IDOMDocument instance on which new Nodes are created.
-	 * 
-	 * @return IDOMDocument instance.
-	 */
-	public IDOMDocument getDestDocument() {
-		IDOMDocument document = null;
-		if (destDocument != null) {
-			document = destDocument;
-		} else {
-			document = (IDOMDocument)hostElement.getOwnerDocument();
-		}
-		return document;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.ITagConverter#setMode(int)
-	 */
-	public void setMode(int mode) {
-		this.mode = mode;
-	}
-
-	/**
-	 * Gets this instance's "mode", as set by setMode(int mode).
-	 * 
-	 * @return This instance's "mode".
-	 */
-	public int getMode() {
-		return mode;
-	}
-
-	/**
-	 * Sets the desired minimum height of the visual representation; allows
-	 * decorators to manipulate this setting.
-	 * 
-	 * @param minHeight The desired minimum height of the visual
-	 * representation.
-	 */
-	public void setMinHeight(int minHeight) {
-		this.minHeight = minHeight;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#getMinHeight()
-	 */
-	public int getMinHeight() {
-		return minHeight;
-	}
-
-	/**
-	 * Sets the desired minimum width of the visual representation; allows
-	 * decorators to manipulate this setting.
-	 * 
-	 * @param minWidth The desired minimum width of the visual
-	 * representation.
-	 */
-	public void setMinWidth(int minWidth) {
-		this.minWidth = minWidth;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#getMinWidth()
-	 */
-	public int getMinWidth() {
-		return minWidth;
-	}
-
-	/**
-	 * Sets the "needBorderDecorator" flag; allows decorators to manipulate
-	 * this setting.
-	 * 
-	 * @param needBorderDecorator Sets the "needBorderDecorator" flag to true
-	 * or false.
-	 */
-	public void setNeedBorderDecorator(boolean needBorderDecorator) {
-		this.needBorderDecorator = needBorderDecorator;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#needBorderDecorator()
-	 */
-	public boolean needBorderDecorator() {
-		return needBorderDecorator;
-	}
-
-	/**
-	 * Sets the "needTableDecorator" flag; allows decorators to manipulate
-	 * this setting.
-	 * 
-	 * @param needTableDecorator Sets the "needTableDecorator" flag to true
-	 * or false.
-	 */
-	public void setNeedTableDecorator(boolean needTableDecorator) {
-		this.needTableDecorator = needTableDecorator;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.css2.style.ITagEditInfo#needTableDecorator()
-	 */
-	public boolean needTableDecorator() {
-		return needTableDecorator;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#isAdapterForType(java.lang.Object)
-	 */
-	public boolean isAdapterForType(Object type) {
-		if (type == ITagEditInfo.class) {
-			return true;
-		}
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#notifyChanged(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier, int, java.lang.Object, java.lang.Object, java.lang.Object, int)
-	 */
-	public void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-		//do nothing
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.IDOMFactory#createElement(java.lang.String)
-	 */
-	public Element createElement(String tag) {
-		return getDestDocument().createElement(tag);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.IDOMFactory#createText(java.lang.String)
-	 */
-	public Text createText(String content) {
-		return getDestDocument().createTextNode(content);
-	}
-
-	/**
-	 * Adds a child Node to the collection of Nodes requiring subsequent tag
-	 * conversion.
-	 * 
-	 * @param childNode Node instance to be added.
-	 * @param position ConvertPosition instance describing indexed position
-	 * relative to another Node in the Document.
-	 */
-	public void addChild(Node childNode, ConvertPosition position) {
-		childNodeList.add(childNode);
-		childVisualPositionMap.put(childNode, position);
-	}
-
-	/**
-	 * Adds all child Nodes to the collection of Nodes requiring subsequent tag
-	 * conversion.
-	 * 
-	 * @param srcElement Source Element for which all child Nodes should be
-	 * added.
-	 * @param destElement Element to which added Nodes are relative.
-	 */
-	public void copyChildren(Element srcElement, Element destElement) {
-		int index = 0;
-		NodeList childNodes = srcElement.getChildNodes();
-		for (int i = 0; i < childNodes.getLength(); i++) {
-			Node curNode = childNodes.item(i); 
-			if (
-					curNode.getNodeType() == Node.ELEMENT_NODE ||
-					curNode.getNodeType() == Node.TEXT_NODE ||
-					curNode.getNodeType() == Node.CDATA_SECTION_NODE) {
-				addChild(curNode, new ConvertPosition(destElement, index++));
-			}
-		}
-	}
-
-	/**
-	 * Adds a non-visual child Element to the collection of non-visual
-	 * children (subsequently retrieved via a call to "getNonVisualChildren".
-	 * 
-	 * @param childElement Child Element to be added.
-	 */
-	public void addNonVisualChildElement(Element childElement) {
-		nonVisualChildElementList.add(childElement);
-	}
-
-	/**
-	 * Supports multiple ConvertPosition instances associated with a single
-	 * Node instance.
-	 */
-	private class NodeConvertPositionMap {
-
-		private Map mapOfConvertPositions = new HashMap();
-		private Map mapOfIndexes = new HashMap();
-
-		/**
-		 * Puts a ConvertPosition instance for the specified Node instance into
-		 * the map.
-		 * 
-		 * @param node Node instance for which the ConvertPosition is to be
-		 * applied.
-		 * @param convertPosition ConvertPosition instance for the specified
-		 * Node instance.
-		 */
-		public void put(Node node, ConvertPosition convertPosition) {
-			List convertPositions = (List)mapOfConvertPositions.get(node);
-			if (convertPositions == null) {
-				convertPositions = new ArrayList();
-				mapOfConvertPositions.put(node, convertPositions);
-			}
-			convertPositions.add(convertPosition);
-		}
-
-		/**
-		 * Gets the current ConvertPosition instance for the specified Node
-		 * instance. Note that each time this is called without a reset having
-		 * occurred, the next ConvertPosition instance mapped to the Node
-		 * instance is returned.
-		 * 
-		 * @param node Node instance for which a ConvertPosition instance is
-		 * being requested.
-		 * @return the current ConvertPosition instance for the specified Node
-		 * instance.
-		 */
-		public ConvertPosition get(Node node) {
-			ConvertPosition convertPosition = null;
-			List convertPositions = (List)mapOfConvertPositions.get(node);
-			if (convertPositions != null) {
-				int index;
-				Object obj = mapOfIndexes.get(node);
-				if (obj != null) {
-					index = ((Integer)obj).intValue();
-				} else {
-					index = 0;
-				}
-				convertPosition = (ConvertPosition)convertPositions.get(index);
-				mapOfIndexes.put(node, new Integer(++index));
-			}
-			return convertPosition;
-		}
-
-		/**
-		 * Resets the concept of "current" ConvertPosition instance for all
-		 * Node instances. Typically called when the List of child Nodes is
-		 * retrieved.
-		 */
-		public void reset() {
-			mapOfIndexes.clear();
-		}
-
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTTagConverterContext.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTTagConverterContext.java
deleted file mode 100644
index aa60bff..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTTagConverterContext.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.internal;
-
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.AbstractTagConverterContext;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * Design-time tag converter implementation of ITagConverterContext.
- * 
- * @author Ian Trimble - Oracle
- */
-public class DTTagConverterContext extends AbstractTagConverterContext {
-
-	/**
-	 * Constructs an instance for the specified DTTagConverter instance.
-	 * 
-	 * @param tagConverter DTTagConverter instance.
-	 */
-	public DTTagConverterContext(DTTagConverter tagConverter) {
-		super(tagConverter);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterContext#createElement(java.lang.String)
-	 */
-	public Element createElement(String tag) {
-		Element element = null;
-		if (tagConverter != null) {
-			element = ((DTTagConverter)tagConverter).createElement(tag);
-		}
-		return element;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterContext#createText(java.lang.String)
-	 */
-	public Text createText(String content) {
-		Text text = null;
-		if (tagConverter != null) {
-			text = ((DTTagConverter)tagConverter).createText(content);
-		}
-		return text;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterContext#addChild(org.w3c.dom.Node, org.eclipse.jst.pagedesigner.converter.ConvertPosition)
-	 */
-	public void addChild(Node childNode, ConvertPosition position) {
-		if (tagConverter != null) {
-			((DTTagConverter)tagConverter).addChild(childNode, position);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterContext#copyChildren(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public void copyChildren(Element srcElement, Element destElement) {
-		if (tagConverter != null) {
-			((DTTagConverter)tagConverter).copyChildren(srcElement, destElement);
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTTagConverterDecorator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTTagConverterDecorator.java
deleted file mode 100644
index 59d6683..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTTagConverterDecorator.java
+++ /dev/null
@@ -1,270 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.internal;
-
-import java.net.URL;
-
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathConstants;
-import javax.xml.xpath.XPathExpressionException;
-import javax.xml.xpath.XPathFactory;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.internal.IImageDescriptorProvider;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider;
-import org.eclipse.jst.jsf.common.metadata.internal.IResourceURLProvider;
-import org.eclipse.jst.pagedesigner.converter.IConverterFactory;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.eclipse.jst.pagedesigner.dtmanager.DTManager;
-import org.eclipse.jst.pagedesigner.dtmanager.IDTInfo;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterDecorator;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo;
-import org.eclipse.jst.pagedesigner.preview.PageExpressionContext;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-/**
- * ITagConverterDecorator implementation for DTTagConverter.
- * 
- * @author Ian Trimble - Oracle
- */
-public class DTTagConverterDecorator implements ITagConverterDecorator {
-
-	private static final String DECORATE_INFO_ID_DESIGN = "vpd-decorate-design"; //$NON-NLS-1$
-	private static final String DECORATE_INFO_ID_PREVIEW = "vpd-decorate-preview"; //$NON-NLS-1$
-	private static final String MD_PLUGIN_LOCATION = "$metadata-plugin-location$"; //$NON-NLS-1$
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterDecorator#decorate(org.eclipse.jst.pagedesigner.converter.ITagConverter)
-	 */
-	public void decorate(ITagConverter tagConverter) {
-		if (!(tagConverter instanceof DTTagConverter)) {
-			throw new IllegalArgumentException("ITagConverter argument must be an instance of DTTagConverter"); //$NON-NLS-1$
-		}
-		DTTagConverter dtTagConverter = (DTTagConverter)tagConverter;
-
-		if (dtTagConverter.getMode() == IConverterFactory.MODE_DESIGNER) {
-			decorateFromDTInfo(dtTagConverter, DECORATE_INFO_ID_DESIGN);
-		} else if (dtTagConverter.getMode() == IConverterFactory.MODE_PREVIEW) {
-			decorateFromDTInfo(dtTagConverter, DECORATE_INFO_ID_PREVIEW);
-		}
-
-		if (tagConverter.getResultElement() == null && tagConverter.isVisualByHTML()) {
-			createUnknownTagRepresentation(dtTagConverter);
-		}
-	}
-
-	/**
-	 * Performs decoration of the specified DTTagConverter instance from
-	 * IDTInfo (metadata) for the specified (by ID) TagDecorateInfo.
-	 * 
-	 * @param dtTagConverter DTTagConverter instance.
-	 * @param tagDecorateInfoID ID of the TagDecorateInfo to be located in
-	 * metadata.
-	 */
-	protected void decorateFromDTInfo(DTTagConverter dtTagConverter, String tagDecorateInfoID) {
-		Element srcElement = dtTagConverter.getHostElement();
-		DTManager dtManager = DTManager.getInstance();
-		IDTInfo dtInfo = dtManager.getDTInfo(srcElement);
-		if (dtInfo != null) {
-			TagDecorateInfo tdInfo = dtInfo.getTagDecorateInfo(tagDecorateInfoID);
-			if (tdInfo != null) {
-				dtTagConverter.setMultiLevel(tdInfo.isMultiLevel());
-				dtTagConverter.setNeedBorderDecorator(tdInfo.isNeedBorderDecorator());
-				dtTagConverter.setNeedTableDecorator(tdInfo.isNeedTableDecorator());
-				if (tdInfo.isNonVisual()) {
-					setNonVisual(dtTagConverter, dtInfo, tdInfo.getNonVisualImagePath());
-				}
-				if (tdInfo.isResolveChildText()) {
-					resolveChildText(dtTagConverter.getResultElement(), dtInfo);
-				}
-				if (tdInfo.isSetNonVisualChildElements()) {
-					setNonVisualChildElements(dtTagConverter, srcElement);
-				}
-				dtTagConverter.setWidget(tdInfo.isWidget());
-				dtTagConverter.setMinHeight(tdInfo.getMinHeight());
-				dtTagConverter.setMinWidth(tdInfo.getMinWidth());
-				ResolveAttributeValue resAttrValue = tdInfo.getResolveAttributeValue();
-				if (resAttrValue != null) {
-					String attributeName = resAttrValue.getAttributeName();
-					if (attributeName != null && attributeName.length() > 0) {
-						resolveAttributeValue(dtTagConverter.getResultElement(), attributeName, dtInfo);
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Creates a visual representation result Element for an unknown tag.
-	 * 
-	 * @param dtTagConverter DTTagConverter instance.
-	 */
-	protected void createUnknownTagRepresentation(DTTagConverter dtTagConverter) {
-		Element element = dtTagConverter.createElement("span"); //$NON-NLS-1$
-		element.setAttribute("style", "color:red;font-weight:bold;"); //$NON-NLS-1$ //$NON-NLS-2$
-		Text text = dtTagConverter.createText("<" + dtTagConverter.getHostElement().getTagName() + "/>"); //$NON-NLS-1$ //$NON-NLS-2$
-		element.appendChild(text);
-		dtTagConverter.setResultElement(element);
-		dtTagConverter.setWidget(true);
-	}
-
-	/**
-	 * Adds child Elements of the specified source Element to the specified
-	 * DTTagConverter instance's collection of non-visual children.
-	 * 
-	 * @param dtTagConverter DTTagConverter instance.
-	 * @param srcElement Source Element for which child Elements are to be
-	 * added.
-	 */
-	protected void setNonVisualChildElements(DTTagConverter dtTagConverter, Element srcElement) {
-		NodeList childNodes = srcElement.getChildNodes();
-		for (int i = 0; i < childNodes.getLength(); i++) {
-			Node curNode = childNodes.item(i);
-			if (curNode.getNodeType() == Node.ELEMENT_NODE) {
-				dtTagConverter.addNonVisualChildElement((Element)curNode);
-			}
-		}
-	}
-
-	/**
-	 * Performs simple EL resolution for the child Text Node of the specified
-	 * source Element instance.
-	 * 
-	 * @param srcElement Source Element for which child Text Node EL resolution
-	 * is to be performed.
-	 * @param dtInfo IDTInfo instance.
-	 */
-	protected void resolveChildText(Element srcElement, IDTInfo dtInfo) {
-		if (srcElement != null) {
-			NodeList childNodes = srcElement.getChildNodes();
-			for (int i = 0; i < childNodes.getLength(); i++) {
-				Node childNode = childNodes.item(i);
-				if (childNode.getNodeType() == Node.TEXT_NODE) {
-					Text textNode = (Text)childNode;
-					String textNodeValue = textNode.getNodeValue();
-					try {
-						String newTextNodeValue;
-						if (textNodeValue.contains(MD_PLUGIN_LOCATION)) {
-							newTextNodeValue = resolveMDPluginLocation(textNodeValue, dtInfo);
-						} else {
-							newTextNodeValue = (String)PageExpressionContext.getCurrent().evaluateExpression(textNodeValue, String.class, null);
-						}
-						if (newTextNodeValue != null && !textNodeValue.equals(newTextNodeValue)) {
-							textNode.setNodeValue(newTextNodeValue);
-						}
-					} catch(Exception ex) {
-						//ignore - could not resolve, do not change existing value
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Performs simple EL resolution for the value of the specified attribute
-	 * of the specified Element.
-	 * 
-	 * @param srcElement Source Element instance.
-	 * @param attributeName Name of attribute for which the value should be
-	 * resolved.
-	 * @param dtInfo IDTInfo instance.
-	 */
-	protected void resolveAttributeValue(Element srcElement, String attributeName, IDTInfo dtInfo) {
-		if (srcElement != null) {
-			Element targetElement = srcElement;
-			String targetAttributeName = attributeName;
-			//determine if attributeName is XPath and re-target as appropriate
-			if (attributeName.contains("/")) { //$NON-NLS-1$
-				int lastSlashPos = attributeName.lastIndexOf("/"); //$NON-NLS-1$
-				String xPathExpression = attributeName.substring(0, lastSlashPos);
-				XPath xPath = XPathFactory.newInstance().newXPath();
-				try {
-					Object resultObject = xPath.evaluate(xPathExpression, srcElement, XPathConstants.NODE);
-					if (resultObject instanceof Element) {
-						targetElement = (Element)resultObject;
-						targetAttributeName = attributeName.substring(lastSlashPos + 1);
-					}
-				} catch(XPathExpressionException xee) {
-					//could not evaluate - leave targetElement and targetAttributeName unchanged
-				}
-			}
-			String oldAttributeValue = targetElement.getAttribute(targetAttributeName);
-			if (oldAttributeValue != null && oldAttributeValue.length() > 0) {
-				try {
-					String newAttributeValue;
-					if (oldAttributeValue.contains(MD_PLUGIN_LOCATION)) {
-						newAttributeValue = resolveMDPluginLocation(oldAttributeValue, dtInfo);
-					} else {
-						newAttributeValue = (String)PageExpressionContext.getCurrent().evaluateExpression(oldAttributeValue, String.class, null);
-					}
-					if (newAttributeValue != null && !oldAttributeValue.equals(newAttributeValue)) {
-						targetElement.setAttribute(targetAttributeName, newAttributeValue);
-					}
-				} catch(Exception ex) {
-					//ignore - could not resolve, do not change existing value
-				}
-			}
-		}
-	}
-
-	/**
-	 * Resolves any instance of MD_PLUGIN_LOCATION in input String.
-	 * 
-	 * @param input Input String.
-	 * @param dtInfo IDTInfo instance.
-	 * @return Input String with any instance of MD_PLUGIN_LOCATION resolved.
-	 */
-	protected String resolveMDPluginLocation(String input, IDTInfo dtInfo) {
-		String output = input;
-		if (input != null && input.contains(MD_PLUGIN_LOCATION)) {
-			int tokenStart = input.indexOf(MD_PLUGIN_LOCATION);
-			int tokenEnd = tokenStart + MD_PLUGIN_LOCATION.length();
-			String prefix = input.substring(0, tokenStart);
-			String suffix = input.substring(tokenEnd);
-			Trait trait = dtInfo.getTrait();
-			IMetaDataSourceModelProvider mdSourceModelProvider = trait.getSourceModelProvider();
-			IResourceURLProvider resourceURLProvider = (IResourceURLProvider)mdSourceModelProvider.getAdapter(IResourceURLProvider.class);
-			URL url = resourceURLProvider.getResourceURL("/META-INF/"); //$NON-NLS-1$
-			String resolvedToken = url.toExternalForm();
-			resolvedToken = resolvedToken.substring(0, resolvedToken.length() - 10);
-			output = prefix + resolvedToken + suffix;
-		}
-		return output;
-	}
-
-	/**
-	 * Sets DTTagConverter instance as non-visual as HTML and sets the
-	 * ImageDescriptor instance that DTTagConverter will use to return an Image
-	 * for rendering.
-	 * 
-	 * @param dtTagConverter DTTagConverter instance.
-	 * @param dtInfo IDTInfo instance.
-	 * @param imagePath Image path, relative to declaring plug-in.
-	 */
-	protected void setNonVisual(DTTagConverter dtTagConverter, IDTInfo dtInfo, String imagePath) {
-		dtTagConverter.setVisualByHTML(false);
-		if (imagePath != null && imagePath.length() > 0) {
-			Trait trait = dtInfo.getTrait();
-			IImageDescriptorProvider imgDescProvider = (IImageDescriptorProvider)trait.getSourceModelProvider().getAdapter(IImageDescriptorProvider.class);
-			if (imgDescProvider != null) {
-				ImageDescriptor imageDescriptor = imgDescProvider.getImageDescriptor(imagePath);
-				dtTagConverter.setVisualImageDescriptor(imageDescriptor);
-			}
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTTagConverterFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTTagConverterFactory.java
deleted file mode 100644
index df40831..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DTTagConverterFactory.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.internal;
-
-import org.eclipse.jst.pagedesigner.converter.IConverterFactory;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.eclipse.jst.pagedesigner.dtmanager.DTManager;
-import org.eclipse.jst.pagedesigner.dtmanager.IDTInfo;
-import org.w3c.dom.Element;
-
-/**
- * Produces DTTagConverter instances.
- * 
- * @author Ian Trimble - Oracle
- */
-public class DTTagConverterFactory implements IConverterFactory {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.IConverterFactory#createConverter(org.w3c.dom.Element, int)
-	 */
-	public ITagConverter createConverter(Element element, int mode) {
-		ITagConverter tagConverter = null;
-		IDTInfo dtInfo = DTManager.getInstance().getDTInfo(element);
-		if (dtInfo != null) {
-			tagConverter = new DTTagConverter(element);
-			tagConverter.setMode(mode);
-		}
-		return tagConverter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.converter.IConverterFactory#getSupportedURI()
-	 */
-	public String getSupportedURI() {
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DefaultTransformer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DefaultTransformer.java
deleted file mode 100644
index 4e6ce62..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/internal/DefaultTransformer.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.internal;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterContext;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformer;
-import org.w3c.dom.Element;
-
-/**
- * Default ITransformer implementation.
- * 
- * @author Ian Trimble - Oracle
- */
-public class DefaultTransformer implements ITransformer {
-
-	private ITagConverterContext tagConverterContext;
-    // synchronization occurs on this object, so it must never
-    // be allowed to be null
-	private final Collection transformOperations = new ArrayList();
-
-	/**
-	 * Instantiates an instance.
-	 * 
-	 * @param context ITagConverterContext instance.
-	 */
-	public DefaultTransformer(ITagConverterContext context) {
-		this.tagConverterContext = context;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformer#appendTransformOperation(org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation)
-	 */
-	public void appendTransformOperation(ITransformOperation operation) {
-		synchronized(transformOperations) {
-			if (operation != null) {
-				operation.setTagConverterContext(tagConverterContext);
-				transformOperations.add(operation);
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.internal.provisional.ITransformer#transform(org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement) {
-		Element curElement = null;
-		if (srcElement != null) {
-			synchronized(transformOperations) {
-				if (transformOperations.size() > 0) {
-					curElement = srcElement;
-					Iterator itOperations = transformOperations.iterator();
-					while (itOperations.hasNext()) {
-						ITransformOperation operation = (ITransformOperation)itOperations.next();
-						curElement = operation.transform(srcElement, curElement);
-					}
-				}
-			}
-		}
-		return curElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/AbstractTransformOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/AbstractTransformOperation.java
deleted file mode 100644
index 82b7c0b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/AbstractTransformOperation.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITagConverterContext;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * Abstract ITransformOperation implementation. Maintains ITagConverterContext
- * instance and collection of child ITransformOperation instances.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public abstract class AbstractTransformOperation implements ITransformOperation {
-
-	/**
-	 * ITagConverterContext instance.
-	 */
-	protected ITagConverterContext tagConverterContext;
-
-	/**
-	 * Collection of child ITransformOperation instances.
-	 */
-	protected List childOperations;
-
-	private String[] params;
-
-	private String id = "<not set>";
-	
-	/**
-	 * Zero-argument constructor
-	 */
-	public AbstractTransformOperation(){
-		//
-	}
-	
-	/**
-	 * Called by TransformOperationFactory
-	 * @param params for the operation
-	 */
-	void setParameters(String[] params) {
-		if (params != null) {
-			this.params = new String[params.length];
-			System.arraycopy(params, 0, this.params, 0, params.length);
-		}
-	}
-	
-	/**
-	 * @return parameters for the operation
-	 */
-	protected String[] getParameters(){
-		return params;
-	}
-	
-	/**
-	 * Called by TransformOperationFactory
-	 * @param id for the operation
-	 */
-	void setTransformOperationID(String id){
-		this.id = id;
-	}
-	
-	/**
-	 * @return id for the operation
-	 */
-	protected String getTransformOperationID(){
-		return id;
-	}
-	
-	/**
-	 * @return Logger
-	 */
-	protected Logger getLog() {
-		return PDPlugin.getLogger(TransformOperationFactory.class);
-	}
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public abstract Element transform(Element srcElement, Element curElement);
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation#setTagConverterContext(org.eclipse.jst.pagedesigner.dtmanager.converter.internal.provisional.ITagConverterContext)
-	 */
-	public void setTagConverterContext(ITagConverterContext tagConverterContext) {
-        // API: this should really be set on construction since other methods
-        // cannot be called until it is set.
-		this.tagConverterContext = tagConverterContext;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation#appendChildOperation(org.eclipse.jst.pagedesigner.dtmanager.converter.internal.provisional.ITransformOperation)
-	 */
-	public void appendChildOperation(ITransformOperation operation) {
-		if (operation != null) {
-			if (childOperations == null) {
-				childOperations = new ArrayList();
-			}
-			operation.setTagConverterContext(tagConverterContext);
-			childOperations.add(operation);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation#getChildOperations()
-	 */
-	public List getChildOperations() {
-		return childOperations;
-	}
-
-	/**
-	 * Convenience method to execute child ITransformOperation instances.
-	 * 
-	 * @param srcElement Source Element instance.
-	 * @param curElement Current Element instance (that is being transformed).
-	 * @return New current Element instance.
-	 */
-	protected Element executeChildOperations(Element srcElement, Element curElement) {
-		Element retElement = curElement;
-		if (childOperations != null && childOperations.size() > 0) {
-			Iterator itChildOperations = childOperations.iterator();
-			while (itChildOperations.hasNext()) {
-				ITransformOperation childOperation = (ITransformOperation)itChildOperations.next();
-				retElement = childOperation.transform(srcElement, retElement);
-			}
-		}
-		return retElement;
-	}
-
-	/**
-	 * Creates a new Element.
-	 * 
-	 * @param tagName Name of Element to be created.
-	 * @return New Element instance.
-	 */
-	protected Element createElement(String tagName) {
-		ITransformOperation operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_CreateElementOperation,
-					new String[]{tagName});
-		operation.setTagConverterContext(tagConverterContext);
-		return operation.transform(null, null);
-	}
-
-	/**
-	 * Creates and appends a new child Element.
-	 * 
-	 * @param tagName Name of child Element to be created.
-	 * @param parentElement Element instance to which to append the new
-	 * Element.
-	 * @return New Element instance.
-	 */
-	protected Element appendChildElement(String tagName, Element parentElement) {
-		ITransformOperation operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_AppendChildElementOperation,
-					new String[]{tagName});
-		operation.setTagConverterContext(tagConverterContext);
-		return operation.transform(null, parentElement);
-	}
-
-	/**
-	 * Creates and appends a new child Text.
-	 * 
-	 * @param content Content of new child Text.
-	 * @param parentElement Element instance to which to append the new Text.
-	 */
-	protected void appendChildText(String content, Element parentElement) {
-		ITransformOperation operation =
-			TransformOperationFactory.getInstance().getTransformOperation(
-					TransformOperationFactory.OP_AppendChildTextOperation,
-					new String[]{content});
-		operation.setTagConverterContext(tagConverterContext);
-		operation.transform(null, parentElement);
-	}
-
-	/**
-	 * Gets collection of child Element instances who's local name matches
-	 * specified tag name.
-	 * 
-	 * @param srcNode Source Node instance.
-	 * @param tagName Tag local name.
-	 * @return Collection of child Element instances who's local name matches
-	 * specified tag name.
-	 */
-	protected List getChildElements(Node srcNode, String tagName) {
-		List childElements = new ArrayList();
-		NodeList childNodes = srcNode.getChildNodes();
-		for (int i = 0; i < childNodes.getLength(); i++) {
-			Node curNode = childNodes.item(i);
-			if (curNode.getNodeType() == Node.ELEMENT_NODE) {
-				String curNodeName = curNode.getLocalName();
-				if (curNodeName != null && curNodeName.equals(tagName)) {
-					childElements.add(curNode);
-				}
-			}
-		}
-		return childElements;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/TransformOperationFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/TransformOperationFactory.java
deleted file mode 100644
index 0c8e6ed..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/TransformOperationFactory.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.InvalidRegistryObjectException;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.IJMTConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation;
-import org.osgi.framework.Bundle;
-
-/**
- * Factory responsible for producing {@link org.eclipse.jst.pagedesigner.dtmanager.converter.ITransformOperation} instances from the <br>
- * <code>org.eclipse.jst.pagedesigner.pageDesignerExtension.tagTransformOperation</code> extensions 
- * <br>
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author Ian Trimble - Oracle
- */
-public final class TransformOperationFactory {
-	/**
-	 * AppendChildElementOperation
-	 */
-	public static final String OP_AppendChildElementOperation = PDPlugin.getPluginId()+".AppendChildElementOperation"; //$NON-NLS-1$
-	/**
-	 * AppendChildTextFromXPathOperation
-	 */
-	public static final String OP_AppendChildTextFromXPathOperation = PDPlugin.getPluginId()+".AppendChildTextFromXPathOperation"; //$NON-NLS-1$
-	/**
-	 * AppendChildTextOperation
-	 */
-	public static final String OP_AppendChildTextOperation = PDPlugin.getPluginId()+".AppendChildTextOperation"; //$NON-NLS-1$
-	/**
-	 * ConvertAttributeToTextOperation
-	 */
-	public static final String OP_ConvertAttributeToTextOperation = PDPlugin.getPluginId()+".ConvertAttributeToTextOperation"; //$NON-NLS-1$
-	/**
-	 * CopyAllAttributesOperation
-	 */
-	public static final String OP_CopyAllAttributesOperation = PDPlugin.getPluginId()+".CopyAllAttributesOperation"; //$NON-NLS-1$
-	/**
-	 * CopyAttributeOperation
-	 */
-	public static final String OP_CopyAttributeOperation = PDPlugin.getPluginId()+".CopyAttributeOperation"; //$NON-NLS-1$
-	/**
-	 * CopyAttributeWithRenameOperation
-	 */
-	public static final String OP_CopyAttributeWithRenameOperation = PDPlugin.getPluginId()+".CopyAttributeWithRenameOperation"; //$NON-NLS-1$
-	/**
-	 * CopyChildrenOperation
-	 */
-	public static final String OP_CopyChildrenOperation = PDPlugin.getPluginId()+".CopyChildrenOperation"; //$NON-NLS-1$
-	/**
-	 * CreateAttributeFromXPathOperation
-	 */
-	public static final String OP_CreateAttributeFromXPathOperation = PDPlugin.getPluginId()+".CreateAttributeFromXPathOperation"; //$NON-NLS-1$
-	/**
-	 * CreateAttributeOperation
-	 */
-	public static final String OP_CreateAttributeOperation = PDPlugin.getPluginId()+".CreateAttributeOperation"; //$NON-NLS-1$
-	/**
-	 * CreateElementOperation
-	 */
-	public static final String OP_CreateElementOperation = PDPlugin.getPluginId()+".CreateElementOperation"; //$NON-NLS-1$
-	/**
-	 * CustomTransformOperation
-	 */
-	public static final String OP_CustomTransformOperation = PDPlugin.getPluginId()+".CustomTransformOperation"; //$NON-NLS-1$
-	/**
-	 * IfNotOperation
-	 */
-	public static final String OP_IfNotOperation = PDPlugin.getPluginId()+".IfNotOperation"; //$NON-NLS-1$
-	/**
-	 * IfOperation
-	 */
-	public static final String OP_IfOperation = PDPlugin.getPluginId()+".IfOperation"; //$NON-NLS-1$
-	/**
-	 * IterateOverElementsOperation
-	 */
-	public static final String OP_IterateOverElementsOperation = PDPlugin.getPluginId()+".IterateOverElementsOperation"; //$NON-NLS-1$
-	/**
-	 * MakeParentElementCurrentOperation
-	 */
-	public static final String OP_MakeParentElementCurrentOperation = PDPlugin.getPluginId()+".MakeParentElementCurrentOperation"; //$NON-NLS-1$
-	/**
-	 * RemoveAttributeOperation
-	 */
-	public static final String OP_RemoveAttributeOperation = PDPlugin.getPluginId()+".RemoveAttributeOperation"; //$NON-NLS-1$
-	/**
-	 * RenameAttributeOperation
-	 */
-	public static final String OP_RenameAttributeOperation = PDPlugin.getPluginId()+".RenameAttributeOperation"; //$NON-NLS-1$
-
-	private static TransformOperationFactory instance;
-
-	private Logger log = PDPlugin.getLogger(TransformOperationFactory.class);
-	
-	private Map<String, Class> _tagTransformOpsRegistry;
-
-	/**
-	 * Instantiates an instance.
-	 */
-	private TransformOperationFactory() {
-		//no external instantiation
-		
-		//read extensions
-		readAllTagTransformOperations();
-	}
-
-	
-	/**
-	 * Gets the singleton instance.
-	 * 
-	 * @return The singleton instance.
-	 */
-	public static synchronized TransformOperationFactory getInstance() {
-		if (instance == null) {
-			instance = new TransformOperationFactory();
-		}
-		return instance;
-	}
-
-	/**
-	 * Gets an ITransformOperation instance for the specified operation ID and
-	 * parameters.
-	 * 
-	 * @param opID - the plugin-qualified Operation extension ID.
-	 * @param params - array of String parameters
-	 * @return ITransformOperation
-	 */
-	public ITransformOperation getTransformOperation(String opID, String[] params) {
-		Class opClass = null;
-		try {
-			opClass = _tagTransformOpsRegistry.get(opID);
-			if (opClass != null) {
-				Object opObject = opClass.newInstance();
-				if (opObject instanceof AbstractTransformOperation) {
-					((AbstractTransformOperation)opObject).setParameters(params);
-					((AbstractTransformOperation)opObject).setTransformOperationID(opID);			
-					return (AbstractTransformOperation)opObject;
-				}
-				log.error("Warning.TransformOperationFactory.NotAbstractTransformOperation", opClass.getName()); //$NON-NLS-1$
-			} else {
-				log.error("Warning.TransformOperationFactory.ExtensionNotFound", opID); //$NON-NLS-1$
-			}		
-		} catch(IllegalAccessException iae) {
-			log.error("Warning.TransformOperationFactory.IllegalAccess", opClass.getName(), iae); //$NON-NLS-1$
-		} catch(InstantiationException ie) {
-			log.error("Warning.TransformOperationFactory.Instantiation", opClass.getName(), ie); //$NON-NLS-1$
-		}
-		return null;
-	}
-	
-	/**
-	 * Reads the custom tag transform operations from WPE registry
-	 */
-	private void readAllTagTransformOperations() {
-		try {
-			_tagTransformOpsRegistry = new HashMap<String, Class>();
-			IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(PDPlugin.getPluginId(), IJMTConstants.EXTENSION_POINT_PAGEDESIGNER);
-			IExtension[] extensions = point.getExtensions();
-			for (int i=0;i < extensions.length;i++){
-				IExtension ext = extensions[i];
-				for (int j=0;j < ext.getConfigurationElements().length;j++){
-					if (ext.getConfigurationElements()[j].getName()
-							.equals(IJMTConstants.TAG_TRANSFORM_OPERATION)) {							
-						registerTransformOperation(ext.getConfigurationElements()[j]);					
-					}				
-				}
-			}
-		} catch (InvalidRegistryObjectException e) {
-			log.error("Warning.TransformOperationFactory.RegistryError", PDPlugin.getPluginId()+IJMTConstants.EXTENSION_POINT_PAGEDESIGNER+"."+IJMTConstants.TAG_TRANSFORM_OPERATION, e); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-	private void registerTransformOperation(final IConfigurationElement element) {
-	
-		final Bundle bundle = Platform.getBundle(element.getContributor().getName());        
-		final String id = element.getContributor().getName()+"."+element.getAttribute("id"); //$NON-NLS-1$ //$NON-NLS-2$
-        if (bundle != null) {
-            try {
-                final Class transformClass = bundle.loadClass(element.getAttribute("class"));                 //$NON-NLS-1$
-                // Not checking instance type here.  Class gets checked as ITransformOperation at 
-                //instantiation time...  
-                //best to log error then rather than now.
-                _tagTransformOpsRegistry.put(id, transformClass);
-            }
-            catch (Exception e) {
-                log.error("Warning.TransformOperationFactory.CannotLoadOpClass",id,  e);  //$NON-NLS-1$
-            }
-        }		
-	}
-	
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/AppendChildElementOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/AppendChildElementOperation.java
deleted file mode 100644
index 37178ef..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/AppendChildElementOperation.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation that appends a child Element and
- * optionally makes the new Element current.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class AppendChildElementOperation extends AbstractTransformOperation {
-
-	private String tagName;
-	private boolean makeChildCurrent = true;
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (getParameters().length < 1) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		} else if (getParameters().length < 2) {
-			tagName = getParameters()[0];
-		} else {
-			tagName = getParameters()[0];
-			makeChildCurrent = Boolean.valueOf(getParameters()[1]).booleanValue();			
-		}
-		
-		Assert.isNotNull(tagName);
-		Element element = null;
-		if (tagConverterContext != null && curElement != null && tagName != null && tagName.length() > 0) {
-			Element childElement = tagConverterContext.createElement(tagName);
-			curElement.appendChild(childElement);
-			if (makeChildCurrent) {
-				element = childElement;
-			} else {
-				element = curElement;
-			}
-		}
-		return element;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/AppendChildTextFromXPathOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/AppendChildTextFromXPathOperation.java
deleted file mode 100644
index b0a7391..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/AppendChildTextFromXPathOperation.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathConstants;
-import javax.xml.xpath.XPathExpressionException;
-import javax.xml.xpath.XPathFactory;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Element;
-import org.w3c.dom.Text;
-
-/**
- * ITransformOperation implementation that creates a new child Text node by
- * getting a value from the specified XPath expression.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class AppendChildTextFromXPathOperation extends AbstractTransformOperation {
-
-	private String xPathExpression;
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		
-		if (getParameters().length < 1) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		}
-		
-		xPathExpression = getParameters()[0];		
-		Assert.isNotNull(xPathExpression);
-		if (srcElement != null) {
-			XPath xPath = XPathFactory.newInstance().newXPath();
-			try {
-				Object resultObject = xPath.evaluate(xPathExpression, srcElement, XPathConstants.STRING);
-				if (tagConverterContext != null && resultObject instanceof String && curElement != null) {
-					Text childText = tagConverterContext.createText((String)resultObject);
-					curElement.appendChild(childText);
-				}
-			} catch(XPathExpressionException xee) {
-				//could not evaluate - return curElement
-			}
-		}
-		return curElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/AppendChildTextOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/AppendChildTextOperation.java
deleted file mode 100644
index 5d910c5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/AppendChildTextOperation.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Element;
-import org.w3c.dom.Text;
-
-/**
- * ITransformOperation implementation that appends a child Text.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class AppendChildTextOperation extends AbstractTransformOperation {
-
-	private String content;
-
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (getParameters().length < 1) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		}
-		
-		content = getParameters()[0];		
-		Assert.isNotNull(content);
-		
-		if (tagConverterContext != null && curElement != null && content != null && content.length() > 0) {
-			Text childText = tagConverterContext.createText(content);
-			curElement.appendChild(childText);
-		}
-		return curElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/ConvertAttributeToTextOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/ConvertAttributeToTextOperation.java
deleted file mode 100644
index 51fdd9a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/ConvertAttributeToTextOperation.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Element;
-import org.w3c.dom.Text;
-
-/**
- * ITransformOperation implementation that converts an attribute to a child
- * Text Node and optionally removes the specified attribute.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class ConvertAttributeToTextOperation extends AbstractTransformOperation {
-
-	private String attributeName;
-	private boolean removeAttribute = true;
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (getParameters().length < 1) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		} else if (getParameters().length < 2) {
-			attributeName = getParameters()[0];
-		} else {
-			attributeName = getParameters()[0];
-			removeAttribute = Boolean.valueOf(getParameters()[1]).booleanValue();
-		}		
-		
-		Assert.isNotNull(attributeName);
-		if (tagConverterContext != null && srcElement != null && curElement != null) {
-			String content = srcElement.getAttribute(attributeName);
-			if (content != null && content.length() > 0) {
-				Text text = tagConverterContext.createText(content);
-				curElement.appendChild(text);
-				if (removeAttribute) {
-					curElement.removeAttribute(attributeName);
-				}
-			}
-		}
-		return curElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CopyAllAttributesOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CopyAllAttributesOperation.java
deleted file mode 100644
index 59b13f5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CopyAllAttributesOperation.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-
-/**
- * ITransformOperation implementation that copies all attributes from the
- * source Element instance to the current Element instance.
- * 
- * @author Ian Trimble - Oracle
- */
-public class CopyAllAttributesOperation extends AbstractTransformOperation {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (srcElement != null && curElement != null) {
-			NamedNodeMap attributes = srcElement.getAttributes();
-			for (int i = 0; i < attributes.getLength(); i++) {
-				Attr attribute = (Attr)attributes.item(i);
-				curElement.setAttribute(attribute.getName(), attribute.getValue());
-			}
-		}
-		return curElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CopyAttributeOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CopyAttributeOperation.java
deleted file mode 100644
index a169436..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CopyAttributeOperation.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-
-/**
- * Copies a single attribute from the source Element instance to the current
- * Element instance, and optionally creates a new attribute on the current
- * Element instance if no such attribute exists on the source Element instance.
- * 
- * @author Ian Trimble - Oracle
- */
-public class CopyAttributeOperation extends AbstractTransformOperation {
-
-	private String attributeName;
-	private boolean create;
-	private String newAttributeValue;
-
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (getParameters().length < 1) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		} else if (getParameters().length < 3) {
-			attributeName = getParameters()[0];			
-		} else {
-			attributeName = getParameters()[0];
-			create = Boolean.valueOf(getParameters()[1]).booleanValue();
-			newAttributeValue = getParameters()[2];		
-		}
-		
-		Assert.isNotNull(attributeName);
-		if (srcElement != null && curElement != null) {
-			Attr attribute = srcElement.getAttributeNode(attributeName);
-			if (attribute != null) {
-				curElement.setAttribute(attributeName, attribute.getValue());
-			} else if (create && newAttributeValue != null) {
-				curElement.setAttribute(attributeName, newAttributeValue);
-			}
-		}
-		return curElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CopyAttributeWithRenameOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CopyAttributeWithRenameOperation.java
deleted file mode 100644
index 0a0a25b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CopyAttributeWithRenameOperation.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- * Copyright (c) 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle Corporation - initial API and implementation
- */
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-
-/**
- * Copies a single attribute from the source Element instance to the current
- * Element instance, renaming the attribute on the current Element instance.
- * 
- * @author Ian Trimble - Oracle
- */
-public class CopyAttributeWithRenameOperation extends AbstractTransformOperation {
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (getParameters().length < 2) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		}
-
-		String srcAttributeName = getParameters()[0];
-		String destAttributeName = getParameters()[1];
-		Assert.isNotNull(srcAttributeName);
-		Assert.isNotNull(destAttributeName);
-
-		if (srcElement != null && curElement != null) {
-			Attr attribute = srcElement.getAttributeNode(srcAttributeName);
-			if (attribute != null) {
-				curElement.setAttribute(destAttributeName, attribute.getValue());
-			}
-		}
-
-		return curElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CopyChildrenOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CopyChildrenOperation.java
deleted file mode 100644
index 206e595..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CopyChildrenOperation.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation that copies all child Elements as Nodes
- * requiring subsequent tag conversion.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class CopyChildrenOperation extends AbstractTransformOperation {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (tagConverterContext != null) {
-			tagConverterContext.copyChildren(srcElement, curElement);
-		}
-		return curElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CreateAttributeFromXPathOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CreateAttributeFromXPathOperation.java
deleted file mode 100644
index dc5badb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CreateAttributeFromXPathOperation.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathConstants;
-import javax.xml.xpath.XPathExpressionException;
-import javax.xml.xpath.XPathFactory;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation that creates a new attribute on the
- * current Element by getting a value from the specified XPath expression.
- * 
- * @author Ian Trimble - Oracle
- */
-public class CreateAttributeFromXPathOperation extends AbstractTransformOperation {
-
-	private String attributeName;
-	private String xPathExpression;
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		
-		if (getParameters().length < 2) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		}
-		
-		attributeName = getParameters()[0];
-		xPathExpression = getParameters()[1];				
-		Assert.isNotNull(attributeName);
-		Assert.isNotNull(xPathExpression);
-	
-		if (srcElement != null) {
-			XPath xPath = XPathFactory.newInstance().newXPath();
-			try {
-				Object resultObject = xPath.evaluate(xPathExpression, srcElement, XPathConstants.STRING);
-				if (resultObject instanceof String && curElement != null) {
-					curElement.setAttribute(attributeName, (String)resultObject);
-				}
-			} catch(XPathExpressionException xee) {
-				//could not evaluate - return curElement
-			}
-		}
-		return curElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CreateAttributeOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CreateAttributeOperation.java
deleted file mode 100644
index 7ffc0bb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CreateAttributeOperation.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation that creates a new attribute on the
- * current Element.
- * 
- * @author Ian Trimble - Oracle
- */
-public class CreateAttributeOperation extends AbstractTransformOperation {
-
-	private String attributeName;
-	private String attributeValue;
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (getParameters().length < 2) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		}
-		
-		attributeName = getParameters()[0];
-		attributeValue = getParameters()[1];		
-		Assert.isNotNull(attributeName);
-		Assert.isNotNull(attributeValue);
-	
-		if (curElement != null) {
-			curElement.setAttribute(attributeName, attributeValue);
-		}
-		return curElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CreateElementOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CreateElementOperation.java
deleted file mode 100644
index 038fec2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/CreateElementOperation.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation that creates a new Element.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class CreateElementOperation extends AbstractTransformOperation {
-
-	private String tagName;
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (getParameters().length < 1) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		} 
-		
-		tagName = getParameters()[0];
-		Assert.isNotNull(tagName);
-		
-		Element element = null;
-		if (tagConverterContext != null && tagName != null && tagName.length() > 0) {
-			element = tagConverterContext.createElement(tagName);
-		}
-		return element;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/IfNotOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/IfNotOperation.java
deleted file mode 100644
index 95c62f2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/IfNotOperation.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathConstants;
-import javax.xml.xpath.XPathExpressionException;
-import javax.xml.xpath.XPathFactory;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation that executes child ITransformOperation
- * instances if the XPath expression evaluated against the source Element
- * instance returns a "false" result.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class IfNotOperation extends AbstractTransformOperation {
-
-	private String xPathExpression;
-
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (getParameters().length < 1) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		}
-		
-		xPathExpression = getParameters()[0];
-		Assert.isNotNull(xPathExpression);
-		
-		Element retElement = curElement;
-		if (srcElement != null) {
-			XPath xPath = XPathFactory.newInstance().newXPath();
-			try {
-				Object resultObject = xPath.evaluate(xPathExpression, srcElement, XPathConstants.BOOLEAN);
-				if (!((Boolean)resultObject).booleanValue()) {
-					retElement = executeChildOperations(srcElement, retElement);
-				}
-			} catch(XPathExpressionException xee) {
-				//could not evaluate - return curElement
-			}
-		}
-		return retElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/IfOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/IfOperation.java
deleted file mode 100644
index f617e35..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/IfOperation.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathConstants;
-import javax.xml.xpath.XPathExpressionException;
-import javax.xml.xpath.XPathFactory;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation that executes child ITransformOperation
- * instances if the XPath expression evaluated against the source Element
- * instance returns a "true" result.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class IfOperation extends AbstractTransformOperation {
-
-	private String xPathExpression;
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (getParameters().length < 1) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		}
-		
-		xPathExpression = getParameters()[0];
-		Assert.isNotNull(xPathExpression);
-		
-		Element retElement = curElement;
-		if (srcElement != null) {
-			XPath xPath = XPathFactory.newInstance().newXPath();
-			try {
-				Object resultObject = xPath.evaluate(xPathExpression, srcElement, XPathConstants.BOOLEAN);
-				if (((Boolean)resultObject).booleanValue()) {
-					retElement = executeChildOperations(srcElement, retElement);
-				}
-			} catch(XPathExpressionException xee) {
-				//could not evaluate - return curElement
-			}
-		}
-		return retElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/IterateOverElementsOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/IterateOverElementsOperation.java
deleted file mode 100644
index cc4e8df..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/IterateOverElementsOperation.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.pagedesigner.dtmanager.converter.operations.internal;
-
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathConstants;
-import javax.xml.xpath.XPathExpressionException;
-import javax.xml.xpath.XPathFactory;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * ITransformOperation implementation that executes child ITransformOperation
- * instances for each Element in the NodeList returned by the XPath expression,
- * which is evaluated against the source Element.
- * 
- * <br><b>Note:</b> requires ITransformOperation.setTagConverterContext(...) to
- * have been called to provide a valid ITagConverterContext instance prior to
- * a call to the transform(...) method.
- * 
- * @author Ian Trimble - Oracle
- */
-public class IterateOverElementsOperation extends AbstractTransformOperation {
-
-	private String xPathExpression;
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (getParameters().length < 1) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		} 
-			
-		xPathExpression = getParameters()[0];		
-		Assert.isNotNull(xPathExpression);
-		
-		Element retElement = curElement;
-		if (srcElement != null) {
-			XPath xPath = XPathFactory.newInstance().newXPath();
-			try {
-				Object resultObject = xPath.evaluate(xPathExpression, srcElement, XPathConstants.NODESET);
-				if (resultObject instanceof NodeList) {
-					NodeList nodes = (NodeList)resultObject;
-					for (int i = 0; i < nodes.getLength(); i++) {
-						Node node = nodes.item(i);
-						if (node instanceof Element) {
-							retElement = executeChildOperations((Element)node, retElement);
-						}
-					}
-				}
-			} catch(XPathExpressionException xee) {
-				//could not evaluate - return curElement
-			}
-		}
-		return retElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/MakeParentElementCurrentOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/MakeParentElementCurrentOperation.java
deleted file mode 100644
index b0e32af..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/MakeParentElementCurrentOperation.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * ITransformOperation implementation that makes the current Element's parent
- * Element the new current Element.
- * 
- * @author Ian Trimble - Oracle
- */
-public class MakeParentElementCurrentOperation extends AbstractTransformOperation {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		Element resultElement = null;
-		if (curElement != null) {
-			Node parentNode = curElement.getParentNode();
-			while (parentNode != null && parentNode.getNodeType() != Node.DOCUMENT_NODE) {
-				if (parentNode.getNodeType() == Node.ELEMENT_NODE) {
-					resultElement = (Element)parentNode;
-					break;
-				}
-                parentNode = parentNode.getParentNode();
-			}
-		}
-		return resultElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/RemoveAttributeOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/RemoveAttributeOperation.java
deleted file mode 100644
index b217c6a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/RemoveAttributeOperation.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation that removes an attribute from the
- * current Element.
- * 
- * @author Ian Trimble - Oracle
- */
-public class RemoveAttributeOperation extends AbstractTransformOperation {
-
-	private String attributeName;
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (getParameters().length < 1) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		}
-		
-		attributeName = getParameters()[0];
-		Assert.isNotNull(attributeName);
-		
-		if (curElement != null) {
-			curElement.removeAttribute(attributeName);
-		}
-		return curElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/RenameAttributeOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/RenameAttributeOperation.java
deleted file mode 100644
index c924538..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/internal/RenameAttributeOperation.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Ian Trimble - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.pagedesigner.dtmanager.converter.operations.AbstractTransformOperation;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-
-/**
- * ITransformOperation implementation that renames an attribute of the current
- * Element.
- * 
- * @author Ian Trimble - Oracle
- */
-public class RenameAttributeOperation extends AbstractTransformOperation {
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.converter.operations.internal.provisional.AbstractTransformOperation#transform(org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public Element transform(Element srcElement, Element curElement) {
-		if (getParameters().length < 2) {
-			getLog().error("Warning.TransformOperationFactory.TooFewParameters", getTransformOperationID()); //$NON-NLS-1$
-			return null;
-		}
-		
-		String oldAttributeName = getParameters()[0];
-		String newAttributeName = getParameters()[1];
-		Assert.isNotNull(oldAttributeName);
-		Assert.isNotNull(newAttributeName);
-		
-		if (curElement != null) {
-			Attr oldAttribute = curElement.getAttributeNode(oldAttributeName);
-			if (oldAttribute != null) {
-				curElement.setAttribute(newAttributeName, oldAttribute.getValue());
-				curElement.removeAttribute(oldAttributeName);
-			}
-		}
-		return curElement;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/package-info.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/package-info.java
deleted file mode 100644
index 0b15e7d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/package-info.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * Basic tag conversion operations. 
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.pagedesigner.dtmanager.converter.operations;
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/package-info.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/package-info.java
deleted file mode 100644
index dd15b1b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/package-info.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * Meta-data driven tag converters. 
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.pagedesigner.dtmanager.converter;
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/DTInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/DTInfo.java
deleted file mode 100644
index ca2ce46..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/DTInfo.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>DT Info</b></em>'.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo#getTagConvertInfo <em>Tag Convert Info</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo#getTagDecorateInfos <em>Tag Decorate Infos</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getDTInfo()
- * @model
- * @generated
- */
-public interface DTInfo extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * Returns the value of the '<em><b>Tag Convert Info</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Tag Convert Info</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Tag Convert Info</em>' containment reference.
-	 * @see #setTagConvertInfo(TagConvertInfo)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getDTInfo_TagConvertInfo()
-	 * @model containment="true" required="true"
-	 *        extendedMetaData="kind='element' name='tag-convert-info'"
-	 * @generated
-	 */
-	TagConvertInfo getTagConvertInfo();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo#getTagConvertInfo <em>Tag Convert Info</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Tag Convert Info</em>' containment reference.
-	 * @see #getTagConvertInfo()
-	 * @generated
-	 */
-	void setTagConvertInfo(TagConvertInfo value);
-
-	/**
-	 * Returns the value of the '<em><b>Tag Decorate Infos</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Tag Decorate Infos</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Tag Decorate Infos</em>' containment reference list.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getDTInfo_TagDecorateInfos()
-	 * @model type="org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.provisional.TagDecorateInfo" containment="true"
-	 *        extendedMetaData="kind='element' name='tag-decorate-info'"
-	 * @generated
-	 */
-	EList getTagDecorateInfos();
-
-} // DTInfo
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/DTInfoFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/DTInfoFactory.java
deleted file mode 100644
index 71f5b13..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/DTInfoFactory.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo;
-
-import org.eclipse.emf.ecore.EFactory;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Factory</b> for the model.
- * It provides a create method for each non-abstract class of the model.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage
- * @generated
- */
-public interface DTInfoFactory extends EFactory {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The singleton instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	DTInfoFactory eINSTANCE = org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoFactoryImpl.init();
-
-	/**
-	 * Returns a new object of class '<em>DT Info</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>DT Info</em>'.
-	 * @generated
-	 */
-	DTInfo createDTInfo();
-
-	/**
-	 * Returns a new object of class '<em>Tag Convert Info</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Tag Convert Info</em>'.
-	 * @generated
-	 */
-	TagConvertInfo createTagConvertInfo();
-
-	/**
-	 * Returns a new object of class '<em>Operation</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Operation</em>'.
-	 * @generated
-	 */
-	Operation createOperation();
-
-	/**
-	 * Returns a new object of class '<em>Parameter</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Parameter</em>'.
-	 * @generated
-	 */
-	Parameter createParameter();
-
-	/**
-	 * Returns a new object of class '<em>Tag Decorate Info</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Tag Decorate Info</em>'.
-	 * @generated
-	 */
-	TagDecorateInfo createTagDecorateInfo();
-
-	/**
-	 * Returns a new object of class '<em>Resolve Attribute Value</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Resolve Attribute Value</em>'.
-	 * @generated
-	 */
-	ResolveAttributeValue createResolveAttributeValue();
-
-	/**
-	 * Returns the package supported by this factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the package supported by this factory.
-	 * @generated
-	 */
-	DTInfoPackage getDTInfoPackage();
-
-} //DTInfoFactory
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/DTInfoPackage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/DTInfoPackage.java
deleted file mode 100644
index 4aa55c6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/DTInfoPackage.java
+++ /dev/null
@@ -1,892 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Package</b> for the model.
- * It contains accessors for the meta objects to represent
- * <ul>
- *   <li>each class,</li>
- *   <li>each feature of each class,</li>
- *   <li>each enum,</li>
- *   <li>and each data type</li>
- * </ul>
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoFactory
- * @model kind="package"
- * @generated
- */
-public interface DTInfoPackage extends EPackage {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The package name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNAME = "dtinfo";
-
-	/**
-	 * The package namespace URI.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_URI = "http://org.eclipse.jsf.pagedesigner/dtinfo.ecore";
-
-	/**
-	 * The package namespace name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_PREFIX = "dti";
-
-	/**
-	 * The singleton instance of the package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	DTInfoPackage eINSTANCE = org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl.init();
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoImpl <em>DT Info</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoImpl
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getDTInfo()
-	 * @generated
-	 */
-	int DT_INFO = 0;
-
-	/**
-	 * The feature id for the '<em><b>Tag Convert Info</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DT_INFO__TAG_CONVERT_INFO = 0;
-
-	/**
-	 * The feature id for the '<em><b>Tag Decorate Infos</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DT_INFO__TAG_DECORATE_INFOS = 1;
-
-	/**
-	 * The number of structural features of the '<em>DT Info</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DT_INFO_FEATURE_COUNT = 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagConvertInfoImpl <em>Tag Convert Info</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagConvertInfoImpl
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getTagConvertInfo()
-	 * @generated
-	 */
-	int TAG_CONVERT_INFO = 1;
-
-	/**
-	 * The feature id for the '<em><b>Operations</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_CONVERT_INFO__OPERATIONS = 0;
-
-	/**
-	 * The number of structural features of the '<em>Tag Convert Info</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_CONVERT_INFO_FEATURE_COUNT = 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.OperationImpl <em>Operation</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.OperationImpl
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getOperation()
-	 * @generated
-	 */
-	int OPERATION = 2;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OPERATION__ID = 0;
-
-	/**
-	 * The feature id for the '<em><b>Parameters</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OPERATION__PARAMETERS = 1;
-
-	/**
-	 * The feature id for the '<em><b>Operations</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OPERATION__OPERATIONS = 2;
-
-	/**
-	 * The number of structural features of the '<em>Operation</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int OPERATION_FEATURE_COUNT = 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.ParameterImpl <em>Parameter</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.ParameterImpl
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getParameter()
-	 * @generated
-	 */
-	int PARAMETER = 3;
-
-	/**
-	 * The feature id for the '<em><b>Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PARAMETER__VALUE = 0;
-
-	/**
-	 * The number of structural features of the '<em>Parameter</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PARAMETER_FEATURE_COUNT = 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl <em>Tag Decorate Info</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getTagDecorateInfo()
-	 * @generated
-	 */
-	int TAG_DECORATE_INFO = 4;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__ID = 0;
-
-	/**
-	 * The feature id for the '<em><b>Min Height</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__MIN_HEIGHT = 1;
-
-	/**
-	 * The feature id for the '<em><b>Min Width</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__MIN_WIDTH = 2;
-
-	/**
-	 * The feature id for the '<em><b>Multi Level</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__MULTI_LEVEL = 3;
-
-	/**
-	 * The feature id for the '<em><b>Need Border Decorator</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__NEED_BORDER_DECORATOR = 4;
-
-	/**
-	 * The feature id for the '<em><b>Need Table Decorator</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__NEED_TABLE_DECORATOR = 5;
-
-	/**
-	 * The feature id for the '<em><b>Non Visual</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__NON_VISUAL = 6;
-
-	/**
-	 * The feature id for the '<em><b>Non Visual Image Path</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__NON_VISUAL_IMAGE_PATH = 7;
-
-	/**
-	 * The feature id for the '<em><b>Resolve Child Text</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__RESOLVE_CHILD_TEXT = 8;
-
-	/**
-	 * The feature id for the '<em><b>Resolve Attribute Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE = 9;
-
-	/**
-	 * The feature id for the '<em><b>Set Non Visual Child Elements</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__SET_NON_VISUAL_CHILD_ELEMENTS = 10;
-
-	/**
-	 * The feature id for the '<em><b>Widget</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO__WIDGET = 11;
-
-	/**
-	 * The number of structural features of the '<em>Tag Decorate Info</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int TAG_DECORATE_INFO_FEATURE_COUNT = 12;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.ResolveAttributeValueImpl <em>Resolve Attribute Value</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.ResolveAttributeValueImpl
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getResolveAttributeValue()
-	 * @generated
-	 */
-	int RESOLVE_ATTRIBUTE_VALUE = 5;
-
-	/**
-	 * The feature id for the '<em><b>Attribute Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOLVE_ATTRIBUTE_VALUE__ATTRIBUTE_NAME = 0;
-
-	/**
-	 * The number of structural features of the '<em>Resolve Attribute Value</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOLVE_ATTRIBUTE_VALUE_FEATURE_COUNT = 1;
-
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo <em>DT Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>DT Info</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo
-	 * @generated
-	 */
-	EClass getDTInfo();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo#getTagConvertInfo <em>Tag Convert Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Tag Convert Info</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo#getTagConvertInfo()
-	 * @see #getDTInfo()
-	 * @generated
-	 */
-	EReference getDTInfo_TagConvertInfo();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo#getTagDecorateInfos <em>Tag Decorate Infos</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Tag Decorate Infos</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo#getTagDecorateInfos()
-	 * @see #getDTInfo()
-	 * @generated
-	 */
-	EReference getDTInfo_TagDecorateInfos();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo <em>Tag Convert Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Tag Convert Info</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo
-	 * @generated
-	 */
-	EClass getTagConvertInfo();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo#getOperations <em>Operations</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Operations</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo#getOperations()
-	 * @see #getTagConvertInfo()
-	 * @generated
-	 */
-	EReference getTagConvertInfo_Operations();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation <em>Operation</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Operation</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation
-	 * @generated
-	 */
-	EClass getOperation();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation#getId()
-	 * @see #getOperation()
-	 * @generated
-	 */
-	EAttribute getOperation_Id();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation#getParameters <em>Parameters</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Parameters</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation#getParameters()
-	 * @see #getOperation()
-	 * @generated
-	 */
-	EReference getOperation_Parameters();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation#getOperations <em>Operations</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Operations</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation#getOperations()
-	 * @see #getOperation()
-	 * @generated
-	 */
-	EReference getOperation_Operations();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter <em>Parameter</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Parameter</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter
-	 * @generated
-	 */
-	EClass getParameter();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter#getValue <em>Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Value</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter#getValue()
-	 * @see #getParameter()
-	 * @generated
-	 */
-	EAttribute getParameter_Value();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo <em>Tag Decorate Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Tag Decorate Info</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo
-	 * @generated
-	 */
-	EClass getTagDecorateInfo();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getId()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EAttribute getTagDecorateInfo_Id();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getMinHeight <em>Min Height</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Min Height</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getMinHeight()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EAttribute getTagDecorateInfo_MinHeight();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getMinWidth <em>Min Width</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Min Width</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getMinWidth()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EAttribute getTagDecorateInfo_MinWidth();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isMultiLevel <em>Multi Level</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Multi Level</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isMultiLevel()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EAttribute getTagDecorateInfo_MultiLevel();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNeedBorderDecorator <em>Need Border Decorator</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Need Border Decorator</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNeedBorderDecorator()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EAttribute getTagDecorateInfo_NeedBorderDecorator();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNeedTableDecorator <em>Need Table Decorator</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Need Table Decorator</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNeedTableDecorator()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EAttribute getTagDecorateInfo_NeedTableDecorator();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNonVisual <em>Non Visual</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Non Visual</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNonVisual()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EAttribute getTagDecorateInfo_NonVisual();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getNonVisualImagePath <em>Non Visual Image Path</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Non Visual Image Path</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getNonVisualImagePath()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EAttribute getTagDecorateInfo_NonVisualImagePath();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isResolveChildText <em>Resolve Child Text</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Resolve Child Text</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isResolveChildText()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EAttribute getTagDecorateInfo_ResolveChildText();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getResolveAttributeValue <em>Resolve Attribute Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Resolve Attribute Value</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getResolveAttributeValue()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EReference getTagDecorateInfo_ResolveAttributeValue();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isSetNonVisualChildElements <em>Set Non Visual Child Elements</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Set Non Visual Child Elements</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isSetNonVisualChildElements()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EAttribute getTagDecorateInfo_SetNonVisualChildElements();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isWidget <em>Widget</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Widget</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isWidget()
-	 * @see #getTagDecorateInfo()
-	 * @generated
-	 */
-	EAttribute getTagDecorateInfo_Widget();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue <em>Resolve Attribute Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Resolve Attribute Value</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue
-	 * @generated
-	 */
-	EClass getResolveAttributeValue();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue#getAttributeName <em>Attribute Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Attribute Name</em>'.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue#getAttributeName()
-	 * @see #getResolveAttributeValue()
-	 * @generated
-	 */
-	EAttribute getResolveAttributeValue_AttributeName();
-
-	/**
-	 * Returns the factory that creates the instances of the model.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the factory that creates the instances of the model.
-	 * @generated
-	 */
-	DTInfoFactory getDTInfoFactory();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * Defines literals for the meta objects that represent
-	 * <ul>
-	 *   <li>each class,</li>
-	 *   <li>each feature of each class,</li>
-	 *   <li>each enum,</li>
-	 *   <li>and each data type</li>
-	 * </ul>
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-    @SuppressWarnings("hiding")
-	interface Literals {
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoImpl <em>DT Info</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoImpl
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getDTInfo()
-		 * @generated
-		 */
-		EClass DT_INFO = eINSTANCE.getDTInfo();
-
-		/**
-		 * The meta object literal for the '<em><b>Tag Convert Info</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-        EReference DT_INFO__TAG_CONVERT_INFO = eINSTANCE.getDTInfo_TagConvertInfo();
-
-		/**
-		 * The meta object literal for the '<em><b>Tag Decorate Infos</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference DT_INFO__TAG_DECORATE_INFOS = eINSTANCE.getDTInfo_TagDecorateInfos();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagConvertInfoImpl <em>Tag Convert Info</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagConvertInfoImpl
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getTagConvertInfo()
-		 * @generated
-		 */
-		EClass TAG_CONVERT_INFO = eINSTANCE.getTagConvertInfo();
-
-		/**
-		 * The meta object literal for the '<em><b>Operations</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference TAG_CONVERT_INFO__OPERATIONS = eINSTANCE.getTagConvertInfo_Operations();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.OperationImpl <em>Operation</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.OperationImpl
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getOperation()
-		 * @generated
-		 */
-		EClass OPERATION = eINSTANCE.getOperation();
-
-		/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute OPERATION__ID = eINSTANCE.getOperation_Id();
-
-		/**
-		 * The meta object literal for the '<em><b>Parameters</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference OPERATION__PARAMETERS = eINSTANCE.getOperation_Parameters();
-
-		/**
-		 * The meta object literal for the '<em><b>Operations</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference OPERATION__OPERATIONS = eINSTANCE.getOperation_Operations();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.ParameterImpl <em>Parameter</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.ParameterImpl
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getParameter()
-		 * @generated
-		 */
-		EClass PARAMETER = eINSTANCE.getParameter();
-
-		/**
-		 * The meta object literal for the '<em><b>Value</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PARAMETER__VALUE = eINSTANCE.getParameter_Value();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl <em>Tag Decorate Info</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getTagDecorateInfo()
-		 * @generated
-		 */
-		EClass TAG_DECORATE_INFO = eINSTANCE.getTagDecorateInfo();
-
-		/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_DECORATE_INFO__ID = eINSTANCE.getTagDecorateInfo_Id();
-
-		/**
-		 * The meta object literal for the '<em><b>Min Height</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_DECORATE_INFO__MIN_HEIGHT = eINSTANCE.getTagDecorateInfo_MinHeight();
-
-		/**
-		 * The meta object literal for the '<em><b>Min Width</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_DECORATE_INFO__MIN_WIDTH = eINSTANCE.getTagDecorateInfo_MinWidth();
-
-		/**
-		 * The meta object literal for the '<em><b>Multi Level</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_DECORATE_INFO__MULTI_LEVEL = eINSTANCE.getTagDecorateInfo_MultiLevel();
-
-		/**
-		 * The meta object literal for the '<em><b>Need Border Decorator</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_DECORATE_INFO__NEED_BORDER_DECORATOR = eINSTANCE.getTagDecorateInfo_NeedBorderDecorator();
-
-		/**
-		 * The meta object literal for the '<em><b>Need Table Decorator</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_DECORATE_INFO__NEED_TABLE_DECORATOR = eINSTANCE.getTagDecorateInfo_NeedTableDecorator();
-
-		/**
-		 * The meta object literal for the '<em><b>Non Visual</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_DECORATE_INFO__NON_VISUAL = eINSTANCE.getTagDecorateInfo_NonVisual();
-
-		/**
-		 * The meta object literal for the '<em><b>Non Visual Image Path</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_DECORATE_INFO__NON_VISUAL_IMAGE_PATH = eINSTANCE.getTagDecorateInfo_NonVisualImagePath();
-
-		/**
-		 * The meta object literal for the '<em><b>Resolve Child Text</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_DECORATE_INFO__RESOLVE_CHILD_TEXT = eINSTANCE.getTagDecorateInfo_ResolveChildText();
-
-		/**
-		 * The meta object literal for the '<em><b>Resolve Attribute Value</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE = eINSTANCE.getTagDecorateInfo_ResolveAttributeValue();
-
-		/**
-		 * The meta object literal for the '<em><b>Set Non Visual Child Elements</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_DECORATE_INFO__SET_NON_VISUAL_CHILD_ELEMENTS = eINSTANCE.getTagDecorateInfo_SetNonVisualChildElements();
-
-		/**
-		 * The meta object literal for the '<em><b>Widget</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute TAG_DECORATE_INFO__WIDGET = eINSTANCE.getTagDecorateInfo_Widget();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.ResolveAttributeValueImpl <em>Resolve Attribute Value</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.ResolveAttributeValueImpl
-		 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoPackageImpl#getResolveAttributeValue()
-		 * @generated
-		 */
-		EClass RESOLVE_ATTRIBUTE_VALUE = eINSTANCE.getResolveAttributeValue();
-
-		/**
-		 * The meta object literal for the '<em><b>Attribute Name</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute RESOLVE_ATTRIBUTE_VALUE__ATTRIBUTE_NAME = eINSTANCE.getResolveAttributeValue_AttributeName();
-
-	}
-
-} //DTInfoPackage
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/Operation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/Operation.java
deleted file mode 100644
index 5e9cd87..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/Operation.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Operation</b></em>'.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation#getParameters <em>Parameters</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation#getOperations <em>Operations</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getOperation()
- * @model
- * @generated
- */
-public interface Operation extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getOperation_Id()
-	 * @model id="true" required="true"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Parameters</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Parameters</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Parameters</em>' containment reference list.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getOperation_Parameters()
-	 * @model type="org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.provisional.Parameter" containment="true"
-	 *        extendedMetaData="kind='element' name='parameter'"
-	 * @generated
-	 */
-	EList getParameters();
-
-	/**
-	 * Returns the value of the '<em><b>Operations</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Operations</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Operations</em>' containment reference list.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getOperation_Operations()
-	 * @model type="org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.provisional.Operation" containment="true"
-	 *        extendedMetaData="kind='element' name='operation'"
-	 * @generated
-	 */
-	EList getOperations();
-
-} // Operation
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/Parameter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/Parameter.java
deleted file mode 100644
index b396a2a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/Parameter.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Parameter</b></em>'.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter#getValue <em>Value</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getParameter()
- * @model
- * @generated
- */
-public interface Parameter extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * Returns the value of the '<em><b>Value</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Value</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Value</em>' attribute.
-	 * @see #setValue(String)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getParameter_Value()
-	 * @model required="true"
-	 * @generated
-	 */
-	String getValue();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter#getValue <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Value</em>' attribute.
-	 * @see #getValue()
-	 * @generated
-	 */
-	void setValue(String value);
-
-} // Parameter
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/ResolveAttributeValue.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/ResolveAttributeValue.java
deleted file mode 100644
index 6ed698f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/ResolveAttributeValue.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Resolve Attribute Value</b></em>'.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue#getAttributeName <em>Attribute Name</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getResolveAttributeValue()
- * @model
- * @generated
- */
-public interface ResolveAttributeValue extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * Returns the value of the '<em><b>Attribute Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Attribute Name</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Attribute Name</em>' attribute.
-	 * @see #setAttributeName(String)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getResolveAttributeValue_AttributeName()
-	 * @model required="true"
-	 * @generated
-	 */
-	String getAttributeName();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue#getAttributeName <em>Attribute Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Attribute Name</em>' attribute.
-	 * @see #getAttributeName()
-	 * @generated
-	 */
-	void setAttributeName(String value);
-
-} // ResolveAttributeValue
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/TagConvertInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/TagConvertInfo.java
deleted file mode 100644
index 7ef7c07..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/TagConvertInfo.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Tag Convert Info</b></em>'.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo#getOperations <em>Operations</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagConvertInfo()
- * @model
- * @generated
- */
-public interface TagConvertInfo extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * Returns the value of the '<em><b>Operations</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Operations</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Operations</em>' containment reference list.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagConvertInfo_Operations()
-	 * @model type="org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.provisional.Operation" containment="true"
-	 *        extendedMetaData="kind='element' name='operation'"
-	 * @generated
-	 */
-	EList getOperations();
-
-} // TagConvertInfo
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/TagDecorateInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/TagDecorateInfo.java
deleted file mode 100644
index 67d9b8d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/TagDecorateInfo.java
+++ /dev/null
@@ -1,369 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Tag Decorate Info</b></em>'.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getMinHeight <em>Min Height</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getMinWidth <em>Min Width</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isMultiLevel <em>Multi Level</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNeedBorderDecorator <em>Need Border Decorator</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNeedTableDecorator <em>Need Table Decorator</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNonVisual <em>Non Visual</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getNonVisualImagePath <em>Non Visual Image Path</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isResolveChildText <em>Resolve Child Text</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getResolveAttributeValue <em>Resolve Attribute Value</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isSetNonVisualChildElements <em>Set Non Visual Child Elements</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isWidget <em>Widget</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo()
- * @model
- * @generated
- */
-public interface TagDecorateInfo extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_Id()
-	 * @model id="true" required="true"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Min Height</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Min Height</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Min Height</em>' attribute.
-	 * @see #setMinHeight(int)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_MinHeight()
-	 * @model
-	 * @generated
-	 */
-	int getMinHeight();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getMinHeight <em>Min Height</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Min Height</em>' attribute.
-	 * @see #getMinHeight()
-	 * @generated
-	 */
-	void setMinHeight(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Min Width</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Min Width</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Min Width</em>' attribute.
-	 * @see #setMinWidth(int)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_MinWidth()
-	 * @model
-	 * @generated
-	 */
-	int getMinWidth();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getMinWidth <em>Min Width</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Min Width</em>' attribute.
-	 * @see #getMinWidth()
-	 * @generated
-	 */
-	void setMinWidth(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Multi Level</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Multi Level</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Multi Level</em>' attribute.
-	 * @see #setMultiLevel(boolean)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_MultiLevel()
-	 * @model default="false"
-	 * @generated
-	 */
-	boolean isMultiLevel();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isMultiLevel <em>Multi Level</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Multi Level</em>' attribute.
-	 * @see #isMultiLevel()
-	 * @generated
-	 */
-	void setMultiLevel(boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Need Border Decorator</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Need Border Decorator</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Need Border Decorator</em>' attribute.
-	 * @see #setNeedBorderDecorator(boolean)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_NeedBorderDecorator()
-	 * @model default="false"
-	 * @generated
-	 */
-	boolean isNeedBorderDecorator();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNeedBorderDecorator <em>Need Border Decorator</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Need Border Decorator</em>' attribute.
-	 * @see #isNeedBorderDecorator()
-	 * @generated
-	 */
-	void setNeedBorderDecorator(boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Need Table Decorator</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Need Table Decorator</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Need Table Decorator</em>' attribute.
-	 * @see #setNeedTableDecorator(boolean)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_NeedTableDecorator()
-	 * @model default="false"
-	 * @generated
-	 */
-	boolean isNeedTableDecorator();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNeedTableDecorator <em>Need Table Decorator</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Need Table Decorator</em>' attribute.
-	 * @see #isNeedTableDecorator()
-	 * @generated
-	 */
-	void setNeedTableDecorator(boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Non Visual</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Non Visual</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Non Visual</em>' attribute.
-	 * @see #setNonVisual(boolean)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_NonVisual()
-	 * @model default="false"
-	 * @generated
-	 */
-	boolean isNonVisual();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isNonVisual <em>Non Visual</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Non Visual</em>' attribute.
-	 * @see #isNonVisual()
-	 * @generated
-	 */
-	void setNonVisual(boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Non Visual Image Path</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Non Visual Image Path</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Non Visual Image Path</em>' attribute.
-	 * @see #setNonVisualImagePath(String)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_NonVisualImagePath()
-	 * @model
-	 * @generated
-	 */
-	String getNonVisualImagePath();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getNonVisualImagePath <em>Non Visual Image Path</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Non Visual Image Path</em>' attribute.
-	 * @see #getNonVisualImagePath()
-	 * @generated
-	 */
-	void setNonVisualImagePath(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Resolve Child Text</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Resolve Child Text</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Resolve Child Text</em>' attribute.
-	 * @see #setResolveChildText(boolean)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_ResolveChildText()
-	 * @model default="false"
-	 * @generated
-	 */
-	boolean isResolveChildText();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isResolveChildText <em>Resolve Child Text</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Resolve Child Text</em>' attribute.
-	 * @see #isResolveChildText()
-	 * @generated
-	 */
-	void setResolveChildText(boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Resolve Attribute Value</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Resolve Attribute Value</em>' containment reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Resolve Attribute Value</em>' containment reference.
-	 * @see #setResolveAttributeValue(ResolveAttributeValue)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_ResolveAttributeValue()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='resolve-attribute-value'"
-	 * @generated
-	 */
-	ResolveAttributeValue getResolveAttributeValue();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#getResolveAttributeValue <em>Resolve Attribute Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Resolve Attribute Value</em>' containment reference.
-	 * @see #getResolveAttributeValue()
-	 * @generated
-	 */
-	void setResolveAttributeValue(ResolveAttributeValue value);
-
-	/**
-	 * Returns the value of the '<em><b>Set Non Visual Child Elements</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Set Non Visual Child Elements</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Set Non Visual Child Elements</em>' attribute.
-	 * @see #setSetNonVisualChildElements(boolean)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_SetNonVisualChildElements()
-	 * @model default="false"
-	 * @generated
-	 */
-	boolean isSetNonVisualChildElements();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isSetNonVisualChildElements <em>Set Non Visual Child Elements</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Set Non Visual Child Elements</em>' attribute.
-	 * @see #isSetNonVisualChildElements()
-	 * @generated
-	 */
-	void setSetNonVisualChildElements(boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Widget</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Widget</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Widget</em>' attribute.
-	 * @see #setWidget(boolean)
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#getTagDecorateInfo_Widget()
-	 * @model default="false"
-	 * @generated
-	 */
-	boolean isWidget();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo#isWidget <em>Widget</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Widget</em>' attribute.
-	 * @see #isWidget()
-	 * @generated
-	 */
-	void setWidget(boolean value);
-
-} // TagDecorateInfo
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/DTInfoFactoryImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/DTInfoFactoryImpl.java
deleted file mode 100644
index b5be005..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/DTInfoFactoryImpl.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-
-import org.eclipse.emf.ecore.impl.EFactoryImpl;
-
-import org.eclipse.emf.ecore.plugin.EcorePlugin;
-
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.*;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Factory</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class DTInfoFactoryImpl extends EFactoryImpl implements DTInfoFactory {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * Creates the default factory implementation.
-	 * <!-- begin-user-doc -->
-     * @return the factory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static DTInfoFactory init() {
-		try {
-			DTInfoFactory theDTInfoFactory = (DTInfoFactory)EPackage.Registry.INSTANCE.getEFactory("http://org.eclipse.jsf.pagedesigner/dtinfo.ecore"); 
-			if (theDTInfoFactory != null) {
-				return theDTInfoFactory;
-			}
-		}
-		catch (Exception exception) {
-			EcorePlugin.INSTANCE.log(exception);
-		}
-		return new DTInfoFactoryImpl();
-	}
-
-	/**
-	 * Creates an instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DTInfoFactoryImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EObject create(EClass eClass) {
-		switch (eClass.getClassifierID()) {
-			case DTInfoPackage.DT_INFO: return createDTInfo();
-			case DTInfoPackage.TAG_CONVERT_INFO: return createTagConvertInfo();
-			case DTInfoPackage.OPERATION: return createOperation();
-			case DTInfoPackage.PARAMETER: return createParameter();
-			case DTInfoPackage.TAG_DECORATE_INFO: return createTagDecorateInfo();
-			case DTInfoPackage.RESOLVE_ATTRIBUTE_VALUE: return createResolveAttributeValue();
-			default:
-				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DTInfo createDTInfo() {
-		DTInfoImpl dtInfo = new DTInfoImpl();
-		return dtInfo;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TagConvertInfo createTagConvertInfo() {
-		TagConvertInfoImpl tagConvertInfo = new TagConvertInfoImpl();
-		return tagConvertInfo;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Operation createOperation() {
-		OperationImpl operation = new OperationImpl();
-		return operation;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Parameter createParameter() {
-		ParameterImpl parameter = new ParameterImpl();
-		return parameter;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TagDecorateInfo createTagDecorateInfo() {
-		TagDecorateInfoImpl tagDecorateInfo = new TagDecorateInfoImpl();
-		return tagDecorateInfo;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResolveAttributeValue createResolveAttributeValue() {
-		ResolveAttributeValueImpl resolveAttributeValue = new ResolveAttributeValueImpl();
-		return resolveAttributeValue;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DTInfoPackage getDTInfoPackage() {
-		return (DTInfoPackage)getEPackage();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return  the package
-	 * <!-- end-user-doc -->
-	 * @deprecated
-	 * @generated
-	 */
-	public static DTInfoPackage getPackage() {
-		return DTInfoPackage.eINSTANCE;
-	}
-
-} //DTInfoFactoryImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/DTInfoImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/DTInfoImpl.java
deleted file mode 100644
index 8676928..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/DTInfoImpl.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>DT Info</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoImpl#getTagConvertInfo <em>Tag Convert Info</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.DTInfoImpl#getTagDecorateInfos <em>Tag Decorate Infos</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class DTInfoImpl extends EObjectImpl implements DTInfo {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The cached value of the '{@link #getTagConvertInfo() <em>Tag Convert Info</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTagConvertInfo()
-	 * @generated
-	 * @ordered
-	 */
-	protected TagConvertInfo tagConvertInfo;
-
-	/**
-	 * The cached value of the '{@link #getTagDecorateInfos() <em>Tag Decorate Infos</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getTagDecorateInfos()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList tagDecorateInfos;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DTInfoImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return DTInfoPackage.Literals.DT_INFO;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public TagConvertInfo getTagConvertInfo() {
-		return tagConvertInfo;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @param newTagConvertInfo 
-     * @param msgs 
-     * @return the notification chaing 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetTagConvertInfo(TagConvertInfo newTagConvertInfo, NotificationChain msgs) {
-		TagConvertInfo oldTagConvertInfo = tagConvertInfo;
-		tagConvertInfo = newTagConvertInfo;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, DTInfoPackage.DT_INFO__TAG_CONVERT_INFO, oldTagConvertInfo, newTagConvertInfo);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setTagConvertInfo(TagConvertInfo newTagConvertInfo) {
-		if (newTagConvertInfo != tagConvertInfo) {
-			NotificationChain msgs = null;
-			if (tagConvertInfo != null)
-				msgs = ((InternalEObject)tagConvertInfo).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - DTInfoPackage.DT_INFO__TAG_CONVERT_INFO, null, msgs);
-			if (newTagConvertInfo != null)
-				msgs = ((InternalEObject)newTagConvertInfo).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - DTInfoPackage.DT_INFO__TAG_CONVERT_INFO, null, msgs);
-			msgs = basicSetTagConvertInfo(newTagConvertInfo, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.DT_INFO__TAG_CONVERT_INFO, newTagConvertInfo, newTagConvertInfo));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getTagDecorateInfos() {
-		if (tagDecorateInfos == null) {
-			tagDecorateInfos = new EObjectContainmentEList(TagDecorateInfo.class, this, DTInfoPackage.DT_INFO__TAG_DECORATE_INFOS);
-		}
-		return tagDecorateInfos;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case DTInfoPackage.DT_INFO__TAG_CONVERT_INFO:
-				return basicSetTagConvertInfo(null, msgs);
-			case DTInfoPackage.DT_INFO__TAG_DECORATE_INFOS:
-				return ((InternalEList)getTagDecorateInfos()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case DTInfoPackage.DT_INFO__TAG_CONVERT_INFO:
-				return getTagConvertInfo();
-			case DTInfoPackage.DT_INFO__TAG_DECORATE_INFOS:
-				return getTagDecorateInfos();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case DTInfoPackage.DT_INFO__TAG_CONVERT_INFO:
-				setTagConvertInfo((TagConvertInfo)newValue);
-				return;
-			case DTInfoPackage.DT_INFO__TAG_DECORATE_INFOS:
-				getTagDecorateInfos().clear();
-				getTagDecorateInfos().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.DT_INFO__TAG_CONVERT_INFO:
-				setTagConvertInfo((TagConvertInfo)null);
-				return;
-			case DTInfoPackage.DT_INFO__TAG_DECORATE_INFOS:
-				getTagDecorateInfos().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.DT_INFO__TAG_CONVERT_INFO:
-				return tagConvertInfo != null;
-			case DTInfoPackage.DT_INFO__TAG_DECORATE_INFOS:
-				return tagDecorateInfos != null && !tagDecorateInfos.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //DTInfoImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/DTInfoPackageImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/DTInfoPackageImpl.java
deleted file mode 100644
index b6bf2b7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/DTInfoPackageImpl.java
+++ /dev/null
@@ -1,563 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-import org.eclipse.emf.ecore.impl.EPackageImpl;
-
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoFactory;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Package</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class DTInfoPackageImpl extends EPackageImpl implements DTInfoPackage {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass dtInfoEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass tagConvertInfoEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass operationEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass parameterEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass tagDecorateInfoEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass resolveAttributeValueEClass = null;
-
-	/**
-	 * Creates an instance of the model <b>Package</b>, registered with
-	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
-	 * package URI value.
-	 * <p>Note: the correct way to create the package is via the static
-	 * factory method {@link #init init()}, which also performs
-	 * initialization of the package, or returns the registered package,
-	 * if one already exists.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.emf.ecore.EPackage.Registry
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage#eNS_URI
-	 * @see #init()
-	 * @generated
-	 */
-	private DTInfoPackageImpl() {
-		super(eNS_URI, DTInfoFactory.eINSTANCE);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static boolean isInited = false;
-
-	/**
-	 * Creates, registers, and initializes the <b>Package</b> for this
-	 * model, and for any others upon which it depends.  Simple
-	 * dependencies are satisfied by calling this method on all
-	 * dependent packages before doing anything else.  This method drives
-	 * initialization for interdependent packages directly, in parallel
-	 * with this package, itself.
-	 * <p>Of this package and its interdependencies, all packages which
-	 * have not yet been registered by their URI values are first created
-	 * and registered.  The packages are then initialized in two steps:
-	 * meta-model objects for all of the packages are created before any
-	 * are initialized, since one package's meta-model objects may refer to
-	 * those of another.
-	 * <p>Invocation of this method will not affect any packages that have
-	 * already been initialized.
-	 * <!-- begin-user-doc -->
-     * @return the package 
-	 * <!-- end-user-doc -->
-	 * @see #eNS_URI
-	 * @see #createPackageContents()
-	 * @see #initializePackageContents()
-	 * @generated
-	 */
-	public static DTInfoPackage init() {
-		if (isInited) return (DTInfoPackage)EPackage.Registry.INSTANCE.getEPackage(DTInfoPackage.eNS_URI);
-
-		// Obtain or create and register package
-		DTInfoPackageImpl theDTInfoPackage = (DTInfoPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(eNS_URI) instanceof DTInfoPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(eNS_URI) : new DTInfoPackageImpl());
-
-		isInited = true;
-
-		// Create package meta-data objects
-		theDTInfoPackage.createPackageContents();
-
-		// Initialize created meta-data
-		theDTInfoPackage.initializePackageContents();
-
-		// Mark meta-data to indicate it can't be changed
-		theDTInfoPackage.freeze();
-
-		return theDTInfoPackage;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getDTInfo() {
-		return dtInfoEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDTInfo_TagConvertInfo() {
-		return (EReference)dtInfoEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getDTInfo_TagDecorateInfos() {
-		return (EReference)dtInfoEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTagConvertInfo() {
-		return tagConvertInfoEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTagConvertInfo_Operations() {
-		return (EReference)tagConvertInfoEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getOperation() {
-		return operationEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getOperation_Id() {
-		return (EAttribute)operationEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getOperation_Parameters() {
-		return (EReference)operationEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getOperation_Operations() {
-		return (EReference)operationEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getParameter() {
-		return parameterEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getParameter_Value() {
-		return (EAttribute)parameterEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getTagDecorateInfo() {
-		return tagDecorateInfoEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagDecorateInfo_Id() {
-		return (EAttribute)tagDecorateInfoEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagDecorateInfo_MinHeight() {
-		return (EAttribute)tagDecorateInfoEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagDecorateInfo_MinWidth() {
-		return (EAttribute)tagDecorateInfoEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagDecorateInfo_MultiLevel() {
-		return (EAttribute)tagDecorateInfoEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagDecorateInfo_NeedBorderDecorator() {
-		return (EAttribute)tagDecorateInfoEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagDecorateInfo_NeedTableDecorator() {
-		return (EAttribute)tagDecorateInfoEClass.getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagDecorateInfo_NonVisual() {
-		return (EAttribute)tagDecorateInfoEClass.getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagDecorateInfo_NonVisualImagePath() {
-		return (EAttribute)tagDecorateInfoEClass.getEStructuralFeatures().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagDecorateInfo_ResolveChildText() {
-		return (EAttribute)tagDecorateInfoEClass.getEStructuralFeatures().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getTagDecorateInfo_ResolveAttributeValue() {
-		return (EReference)tagDecorateInfoEClass.getEStructuralFeatures().get(9);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagDecorateInfo_SetNonVisualChildElements() {
-		return (EAttribute)tagDecorateInfoEClass.getEStructuralFeatures().get(10);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getTagDecorateInfo_Widget() {
-		return (EAttribute)tagDecorateInfoEClass.getEStructuralFeatures().get(11);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getResolveAttributeValue() {
-		return resolveAttributeValueEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResolveAttributeValue_AttributeName() {
-		return (EAttribute)resolveAttributeValueEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DTInfoFactory getDTInfoFactory() {
-		return (DTInfoFactory)getEFactoryInstance();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private boolean isCreated = false;
-
-	/**
-	 * Creates the meta-model objects for the package.  This method is
-	 * guarded to have no affect on any invocation but its first.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void createPackageContents() {
-		if (isCreated) return;
-		isCreated = true;
-
-		// Create classes and their features
-		dtInfoEClass = createEClass(DT_INFO);
-		createEReference(dtInfoEClass, DT_INFO__TAG_CONVERT_INFO);
-		createEReference(dtInfoEClass, DT_INFO__TAG_DECORATE_INFOS);
-
-		tagConvertInfoEClass = createEClass(TAG_CONVERT_INFO);
-		createEReference(tagConvertInfoEClass, TAG_CONVERT_INFO__OPERATIONS);
-
-		operationEClass = createEClass(OPERATION);
-		createEAttribute(operationEClass, OPERATION__ID);
-		createEReference(operationEClass, OPERATION__PARAMETERS);
-		createEReference(operationEClass, OPERATION__OPERATIONS);
-
-		parameterEClass = createEClass(PARAMETER);
-		createEAttribute(parameterEClass, PARAMETER__VALUE);
-
-		tagDecorateInfoEClass = createEClass(TAG_DECORATE_INFO);
-		createEAttribute(tagDecorateInfoEClass, TAG_DECORATE_INFO__ID);
-		createEAttribute(tagDecorateInfoEClass, TAG_DECORATE_INFO__MIN_HEIGHT);
-		createEAttribute(tagDecorateInfoEClass, TAG_DECORATE_INFO__MIN_WIDTH);
-		createEAttribute(tagDecorateInfoEClass, TAG_DECORATE_INFO__MULTI_LEVEL);
-		createEAttribute(tagDecorateInfoEClass, TAG_DECORATE_INFO__NEED_BORDER_DECORATOR);
-		createEAttribute(tagDecorateInfoEClass, TAG_DECORATE_INFO__NEED_TABLE_DECORATOR);
-		createEAttribute(tagDecorateInfoEClass, TAG_DECORATE_INFO__NON_VISUAL);
-		createEAttribute(tagDecorateInfoEClass, TAG_DECORATE_INFO__NON_VISUAL_IMAGE_PATH);
-		createEAttribute(tagDecorateInfoEClass, TAG_DECORATE_INFO__RESOLVE_CHILD_TEXT);
-		createEReference(tagDecorateInfoEClass, TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE);
-		createEAttribute(tagDecorateInfoEClass, TAG_DECORATE_INFO__SET_NON_VISUAL_CHILD_ELEMENTS);
-		createEAttribute(tagDecorateInfoEClass, TAG_DECORATE_INFO__WIDGET);
-
-		resolveAttributeValueEClass = createEClass(RESOLVE_ATTRIBUTE_VALUE);
-		createEAttribute(resolveAttributeValueEClass, RESOLVE_ATTRIBUTE_VALUE__ATTRIBUTE_NAME);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private boolean isInitialized = false;
-
-	/**
-	 * Complete the initialization of the package and its meta-model.  This
-	 * method is guarded to have no affect on any invocation but its first.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void initializePackageContents() {
-		if (isInitialized) return;
-		isInitialized = true;
-
-		// Initialize package
-		setName(eNAME);
-		setNsPrefix(eNS_PREFIX);
-		setNsURI(eNS_URI);
-
-		// Add supertypes to classes
-
-		// Initialize classes and features; add operations and parameters
-		initEClass(dtInfoEClass, DTInfo.class, "DTInfo", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getDTInfo_TagConvertInfo(), this.getTagConvertInfo(), null, "tagConvertInfo", null, 1, 1, DTInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getDTInfo_TagDecorateInfos(), this.getTagDecorateInfo(), null, "tagDecorateInfos", null, 0, -1, DTInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(tagConvertInfoEClass, TagConvertInfo.class, "TagConvertInfo", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getTagConvertInfo_Operations(), this.getOperation(), null, "operations", null, 0, -1, TagConvertInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(operationEClass, Operation.class, "Operation", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getOperation_Id(), ecorePackage.getEString(), "id", null, 1, 1, Operation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getOperation_Parameters(), this.getParameter(), null, "parameters", null, 0, -1, Operation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getOperation_Operations(), this.getOperation(), null, "operations", null, 0, -1, Operation.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(parameterEClass, Parameter.class, "Parameter", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getParameter_Value(), ecorePackage.getEString(), "value", null, 1, 1, Parameter.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(tagDecorateInfoEClass, TagDecorateInfo.class, "TagDecorateInfo", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getTagDecorateInfo_Id(), ecorePackage.getEString(), "id", null, 1, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTagDecorateInfo_MinHeight(), ecorePackage.getEInt(), "minHeight", null, 0, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTagDecorateInfo_MinWidth(), ecorePackage.getEInt(), "minWidth", null, 0, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTagDecorateInfo_MultiLevel(), ecorePackage.getEBoolean(), "multiLevel", "false", 0, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTagDecorateInfo_NeedBorderDecorator(), ecorePackage.getEBoolean(), "needBorderDecorator", "false", 0, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTagDecorateInfo_NeedTableDecorator(), ecorePackage.getEBoolean(), "needTableDecorator", "false", 0, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTagDecorateInfo_NonVisual(), ecorePackage.getEBoolean(), "nonVisual", "false", 0, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTagDecorateInfo_NonVisualImagePath(), ecorePackage.getEString(), "nonVisualImagePath", null, 0, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTagDecorateInfo_ResolveChildText(), ecorePackage.getEBoolean(), "resolveChildText", "false", 0, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getTagDecorateInfo_ResolveAttributeValue(), this.getResolveAttributeValue(), null, "resolveAttributeValue", null, 0, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTagDecorateInfo_SetNonVisualChildElements(), ecorePackage.getEBoolean(), "setNonVisualChildElements", "false", 0, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTagDecorateInfo_Widget(), ecorePackage.getEBoolean(), "widget", "false", 0, 1, TagDecorateInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(resolveAttributeValueEClass, ResolveAttributeValue.class, "ResolveAttributeValue", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getResolveAttributeValue_AttributeName(), ecorePackage.getEString(), "attributeName", null, 1, 1, ResolveAttributeValue.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		// 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
-		  (getDTInfo_TagConvertInfo(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "tag-convert-info"
-		   });		
-		addAnnotation
-		  (getDTInfo_TagDecorateInfos(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "tag-decorate-info"
-		   });		
-		addAnnotation
-		  (getTagConvertInfo_Operations(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "operation"
-		   });		
-		addAnnotation
-		  (getOperation_Parameters(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "parameter"
-		   });		
-		addAnnotation
-		  (getOperation_Operations(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "operation"
-		   });		
-		addAnnotation
-		  (getTagDecorateInfo_ResolveAttributeValue(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "resolve-attribute-value"
-		   });
-	}
-
-} //DTInfoPackageImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/OperationImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/OperationImpl.java
deleted file mode 100644
index 5ae2756..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/OperationImpl.java
+++ /dev/null
@@ -1,261 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Operation</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.OperationImpl#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.OperationImpl#getParameters <em>Parameters</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.OperationImpl#getOperations <em>Operations</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class OperationImpl extends EObjectImpl implements Operation {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getParameters() <em>Parameters</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getParameters()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList parameters;
-
-	/**
-	 * The cached value of the '{@link #getOperations() <em>Operations</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOperations()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList operations;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected OperationImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return DTInfoPackage.Literals.OPERATION;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.OPERATION__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getParameters() {
-		if (parameters == null) {
-			parameters = new EObjectContainmentEList(Parameter.class, this, DTInfoPackage.OPERATION__PARAMETERS);
-		}
-		return parameters;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getOperations() {
-		if (operations == null) {
-			operations = new EObjectContainmentEList(Operation.class, this, DTInfoPackage.OPERATION__OPERATIONS);
-		}
-		return operations;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case DTInfoPackage.OPERATION__PARAMETERS:
-				return ((InternalEList)getParameters()).basicRemove(otherEnd, msgs);
-			case DTInfoPackage.OPERATION__OPERATIONS:
-				return ((InternalEList)getOperations()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case DTInfoPackage.OPERATION__ID:
-				return getId();
-			case DTInfoPackage.OPERATION__PARAMETERS:
-				return getParameters();
-			case DTInfoPackage.OPERATION__OPERATIONS:
-				return getOperations();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case DTInfoPackage.OPERATION__ID:
-				setId((String)newValue);
-				return;
-			case DTInfoPackage.OPERATION__PARAMETERS:
-				getParameters().clear();
-				getParameters().addAll((Collection)newValue);
-				return;
-			case DTInfoPackage.OPERATION__OPERATIONS:
-				getOperations().clear();
-				getOperations().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.OPERATION__ID:
-				setId(ID_EDEFAULT);
-				return;
-			case DTInfoPackage.OPERATION__PARAMETERS:
-				getParameters().clear();
-				return;
-			case DTInfoPackage.OPERATION__OPERATIONS:
-				getOperations().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.OPERATION__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-			case DTInfoPackage.OPERATION__PARAMETERS:
-				return parameters != null && !parameters.isEmpty();
-			case DTInfoPackage.OPERATION__OPERATIONS:
-				return operations != null && !operations.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: ");
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} //OperationImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/ParameterImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/ParameterImpl.java
deleted file mode 100644
index 7d9dbe9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/ParameterImpl.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Parameter</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.ParameterImpl#getValue <em>Value</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ParameterImpl extends EObjectImpl implements Parameter {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The default value of the '{@link #getValue() <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String VALUE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getValue() <em>Value</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected String value = VALUE_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ParameterImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return DTInfoPackage.Literals.PARAMETER;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getValue() {
-		return value;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setValue(String newValue) {
-		String oldValue = value;
-		value = newValue;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.PARAMETER__VALUE, oldValue, value));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case DTInfoPackage.PARAMETER__VALUE:
-				return getValue();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case DTInfoPackage.PARAMETER__VALUE:
-				setValue((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.PARAMETER__VALUE:
-				setValue(VALUE_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.PARAMETER__VALUE:
-				return VALUE_EDEFAULT == null ? value != null : !VALUE_EDEFAULT.equals(value);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (value: ");
-		result.append(value);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ParameterImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/ResolveAttributeValueImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/ResolveAttributeValueImpl.java
deleted file mode 100644
index 186ca38..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/ResolveAttributeValueImpl.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Resolve Attribute Value</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.ResolveAttributeValueImpl#getAttributeName <em>Attribute Name</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class ResolveAttributeValueImpl extends EObjectImpl implements ResolveAttributeValue {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The default value of the '{@link #getAttributeName() <em>Attribute Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAttributeName()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ATTRIBUTE_NAME_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getAttributeName() <em>Attribute Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getAttributeName()
-	 * @generated
-	 * @ordered
-	 */
-	protected String attributeName = ATTRIBUTE_NAME_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ResolveAttributeValueImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return DTInfoPackage.Literals.RESOLVE_ATTRIBUTE_VALUE;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getAttributeName() {
-		return attributeName;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setAttributeName(String newAttributeName) {
-		String oldAttributeName = attributeName;
-		attributeName = newAttributeName;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.RESOLVE_ATTRIBUTE_VALUE__ATTRIBUTE_NAME, oldAttributeName, attributeName));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case DTInfoPackage.RESOLVE_ATTRIBUTE_VALUE__ATTRIBUTE_NAME:
-				return getAttributeName();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case DTInfoPackage.RESOLVE_ATTRIBUTE_VALUE__ATTRIBUTE_NAME:
-				setAttributeName((String)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.RESOLVE_ATTRIBUTE_VALUE__ATTRIBUTE_NAME:
-				setAttributeName(ATTRIBUTE_NAME_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.RESOLVE_ATTRIBUTE_VALUE__ATTRIBUTE_NAME:
-				return ATTRIBUTE_NAME_EDEFAULT == null ? attributeName != null : !ATTRIBUTE_NAME_EDEFAULT.equals(attributeName);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (attributeName: ");
-		result.append(attributeName);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ResolveAttributeValueImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/TagConvertInfoImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/TagConvertInfoImpl.java
deleted file mode 100644
index f6f9e4a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/TagConvertInfoImpl.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Tag Convert Info</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagConvertInfoImpl#getOperations <em>Operations</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class TagConvertInfoImpl extends EObjectImpl implements TagConvertInfo {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The cached value of the '{@link #getOperations() <em>Operations</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getOperations()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList operations;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TagConvertInfoImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return DTInfoPackage.Literals.TAG_CONVERT_INFO;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList getOperations() {
-		if (operations == null) {
-			operations = new EObjectContainmentEList(Operation.class, this, DTInfoPackage.TAG_CONVERT_INFO__OPERATIONS);
-		}
-		return operations;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case DTInfoPackage.TAG_CONVERT_INFO__OPERATIONS:
-				return ((InternalEList)getOperations()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case DTInfoPackage.TAG_CONVERT_INFO__OPERATIONS:
-				return getOperations();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case DTInfoPackage.TAG_CONVERT_INFO__OPERATIONS:
-				getOperations().clear();
-				getOperations().addAll((Collection)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.TAG_CONVERT_INFO__OPERATIONS:
-				getOperations().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.TAG_CONVERT_INFO__OPERATIONS:
-				return operations != null && !operations.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //TagConvertInfoImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/TagDecorateInfoImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/TagDecorateInfoImpl.java
deleted file mode 100644
index 33eee8f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/impl/TagDecorateInfoImpl.java
+++ /dev/null
@@ -1,791 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue;
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Tag Decorate Info</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#getMinHeight <em>Min Height</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#getMinWidth <em>Min Width</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#isMultiLevel <em>Multi Level</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#isNeedBorderDecorator <em>Need Border Decorator</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#isNeedTableDecorator <em>Need Table Decorator</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#isNonVisual <em>Non Visual</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#getNonVisualImagePath <em>Non Visual Image Path</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#isResolveChildText <em>Resolve Child Text</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#getResolveAttributeValue <em>Resolve Attribute Value</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#isSetNonVisualChildElements <em>Set Non Visual Child Elements</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.impl.TagDecorateInfoImpl#isWidget <em>Widget</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class TagDecorateInfoImpl extends EObjectImpl implements TagDecorateInfo {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getMinHeight() <em>Min Height</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMinHeight()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int MIN_HEIGHT_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getMinHeight() <em>Min Height</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMinHeight()
-	 * @generated
-	 * @ordered
-	 */
-	protected int minHeight = MIN_HEIGHT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getMinWidth() <em>Min Width</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMinWidth()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int MIN_WIDTH_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getMinWidth() <em>Min Width</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMinWidth()
-	 * @generated
-	 * @ordered
-	 */
-	protected int minWidth = MIN_WIDTH_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isMultiLevel() <em>Multi Level</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isMultiLevel()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean MULTI_LEVEL_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isMultiLevel() <em>Multi Level</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isMultiLevel()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean multiLevel = MULTI_LEVEL_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isNeedBorderDecorator() <em>Need Border Decorator</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isNeedBorderDecorator()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean NEED_BORDER_DECORATOR_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isNeedBorderDecorator() <em>Need Border Decorator</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isNeedBorderDecorator()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean needBorderDecorator = NEED_BORDER_DECORATOR_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isNeedTableDecorator() <em>Need Table Decorator</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isNeedTableDecorator()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean NEED_TABLE_DECORATOR_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isNeedTableDecorator() <em>Need Table Decorator</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isNeedTableDecorator()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean needTableDecorator = NEED_TABLE_DECORATOR_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isNonVisual() <em>Non Visual</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isNonVisual()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean NON_VISUAL_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isNonVisual() <em>Non Visual</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isNonVisual()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean nonVisual = NON_VISUAL_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getNonVisualImagePath() <em>Non Visual Image Path</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNonVisualImagePath()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String NON_VISUAL_IMAGE_PATH_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getNonVisualImagePath() <em>Non Visual Image Path</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getNonVisualImagePath()
-	 * @generated
-	 * @ordered
-	 */
-	protected String nonVisualImagePath = NON_VISUAL_IMAGE_PATH_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isResolveChildText() <em>Resolve Child Text</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isResolveChildText()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean RESOLVE_CHILD_TEXT_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isResolveChildText() <em>Resolve Child Text</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isResolveChildText()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean resolveChildText = RESOLVE_CHILD_TEXT_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getResolveAttributeValue() <em>Resolve Attribute Value</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getResolveAttributeValue()
-	 * @generated
-	 * @ordered
-	 */
-	protected ResolveAttributeValue resolveAttributeValue;
-
-	/**
-	 * The default value of the '{@link #isSetNonVisualChildElements() <em>Set Non Visual Child Elements</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetNonVisualChildElements()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean SET_NON_VISUAL_CHILD_ELEMENTS_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isSetNonVisualChildElements() <em>Set Non Visual Child Elements</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isSetNonVisualChildElements()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean setNonVisualChildElements = SET_NON_VISUAL_CHILD_ELEMENTS_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isWidget() <em>Widget</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isWidget()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean WIDGET_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isWidget() <em>Widget</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isWidget()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean widget = WIDGET_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected TagDecorateInfoImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected EClass eStaticClass() {
-		return DTInfoPackage.Literals.TAG_DECORATE_INFO;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getMinHeight() {
-		return minHeight;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMinHeight(int newMinHeight) {
-		int oldMinHeight = minHeight;
-		minHeight = newMinHeight;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__MIN_HEIGHT, oldMinHeight, minHeight));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getMinWidth() {
-		return minWidth;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMinWidth(int newMinWidth) {
-		int oldMinWidth = minWidth;
-		minWidth = newMinWidth;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__MIN_WIDTH, oldMinWidth, minWidth));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isMultiLevel() {
-		return multiLevel;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMultiLevel(boolean newMultiLevel) {
-		boolean oldMultiLevel = multiLevel;
-		multiLevel = newMultiLevel;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__MULTI_LEVEL, oldMultiLevel, multiLevel));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isNeedBorderDecorator() {
-		return needBorderDecorator;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNeedBorderDecorator(boolean newNeedBorderDecorator) {
-		boolean oldNeedBorderDecorator = needBorderDecorator;
-		needBorderDecorator = newNeedBorderDecorator;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__NEED_BORDER_DECORATOR, oldNeedBorderDecorator, needBorderDecorator));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isNeedTableDecorator() {
-		return needTableDecorator;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNeedTableDecorator(boolean newNeedTableDecorator) {
-		boolean oldNeedTableDecorator = needTableDecorator;
-		needTableDecorator = newNeedTableDecorator;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__NEED_TABLE_DECORATOR, oldNeedTableDecorator, needTableDecorator));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isNonVisual() {
-		return nonVisual;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNonVisual(boolean newNonVisual) {
-		boolean oldNonVisual = nonVisual;
-		nonVisual = newNonVisual;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__NON_VISUAL, oldNonVisual, nonVisual));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getNonVisualImagePath() {
-		return nonVisualImagePath;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setNonVisualImagePath(String newNonVisualImagePath) {
-		String oldNonVisualImagePath = nonVisualImagePath;
-		nonVisualImagePath = newNonVisualImagePath;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__NON_VISUAL_IMAGE_PATH, oldNonVisualImagePath, nonVisualImagePath));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isResolveChildText() {
-		return resolveChildText;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setResolveChildText(boolean newResolveChildText) {
-		boolean oldResolveChildText = resolveChildText;
-		resolveChildText = newResolveChildText;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_CHILD_TEXT, oldResolveChildText, resolveChildText));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResolveAttributeValue getResolveAttributeValue() {
-		return resolveAttributeValue;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @param newResolveAttributeValue 
-     * @param msgs 
-     * @return the notification chain 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetResolveAttributeValue(ResolveAttributeValue newResolveAttributeValue, NotificationChain msgs) {
-		ResolveAttributeValue oldResolveAttributeValue = resolveAttributeValue;
-		resolveAttributeValue = newResolveAttributeValue;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE, oldResolveAttributeValue, newResolveAttributeValue);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setResolveAttributeValue(ResolveAttributeValue newResolveAttributeValue) {
-		if (newResolveAttributeValue != resolveAttributeValue) {
-			NotificationChain msgs = null;
-			if (resolveAttributeValue != null)
-				msgs = ((InternalEObject)resolveAttributeValue).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE, null, msgs);
-			if (newResolveAttributeValue != null)
-				msgs = ((InternalEObject)newResolveAttributeValue).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE, null, msgs);
-			msgs = basicSetResolveAttributeValue(newResolveAttributeValue, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE, newResolveAttributeValue, newResolveAttributeValue));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isSetNonVisualChildElements() {
-		return setNonVisualChildElements;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setSetNonVisualChildElements(boolean newSetNonVisualChildElements) {
-		boolean oldSetNonVisualChildElements = setNonVisualChildElements;
-		setNonVisualChildElements = newSetNonVisualChildElements;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__SET_NON_VISUAL_CHILD_ELEMENTS, oldSetNonVisualChildElements, setNonVisualChildElements));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean isWidget() {
-		return widget;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setWidget(boolean newWidget) {
-		boolean oldWidget = widget;
-		widget = newWidget;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DTInfoPackage.TAG_DECORATE_INFO__WIDGET, oldWidget, widget));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE:
-				return basicSetResolveAttributeValue(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case DTInfoPackage.TAG_DECORATE_INFO__ID:
-				return getId();
-			case DTInfoPackage.TAG_DECORATE_INFO__MIN_HEIGHT:
-				return new Integer(getMinHeight());
-			case DTInfoPackage.TAG_DECORATE_INFO__MIN_WIDTH:
-				return new Integer(getMinWidth());
-			case DTInfoPackage.TAG_DECORATE_INFO__MULTI_LEVEL:
-				return isMultiLevel() ? Boolean.TRUE : Boolean.FALSE;
-			case DTInfoPackage.TAG_DECORATE_INFO__NEED_BORDER_DECORATOR:
-				return isNeedBorderDecorator() ? Boolean.TRUE : Boolean.FALSE;
-			case DTInfoPackage.TAG_DECORATE_INFO__NEED_TABLE_DECORATOR:
-				return isNeedTableDecorator() ? Boolean.TRUE : Boolean.FALSE;
-			case DTInfoPackage.TAG_DECORATE_INFO__NON_VISUAL:
-				return isNonVisual() ? Boolean.TRUE : Boolean.FALSE;
-			case DTInfoPackage.TAG_DECORATE_INFO__NON_VISUAL_IMAGE_PATH:
-				return getNonVisualImagePath();
-			case DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_CHILD_TEXT:
-				return isResolveChildText() ? Boolean.TRUE : Boolean.FALSE;
-			case DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE:
-				return getResolveAttributeValue();
-			case DTInfoPackage.TAG_DECORATE_INFO__SET_NON_VISUAL_CHILD_ELEMENTS:
-				return isSetNonVisualChildElements() ? Boolean.TRUE : Boolean.FALSE;
-			case DTInfoPackage.TAG_DECORATE_INFO__WIDGET:
-				return isWidget() ? Boolean.TRUE : Boolean.FALSE;
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case DTInfoPackage.TAG_DECORATE_INFO__ID:
-				setId((String)newValue);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__MIN_HEIGHT:
-				setMinHeight(((Integer)newValue).intValue());
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__MIN_WIDTH:
-				setMinWidth(((Integer)newValue).intValue());
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__MULTI_LEVEL:
-				setMultiLevel(((Boolean)newValue).booleanValue());
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__NEED_BORDER_DECORATOR:
-				setNeedBorderDecorator(((Boolean)newValue).booleanValue());
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__NEED_TABLE_DECORATOR:
-				setNeedTableDecorator(((Boolean)newValue).booleanValue());
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__NON_VISUAL:
-				setNonVisual(((Boolean)newValue).booleanValue());
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__NON_VISUAL_IMAGE_PATH:
-				setNonVisualImagePath((String)newValue);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_CHILD_TEXT:
-				setResolveChildText(((Boolean)newValue).booleanValue());
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE:
-				setResolveAttributeValue((ResolveAttributeValue)newValue);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__SET_NON_VISUAL_CHILD_ELEMENTS:
-				setSetNonVisualChildElements(((Boolean)newValue).booleanValue());
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__WIDGET:
-				setWidget(((Boolean)newValue).booleanValue());
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.TAG_DECORATE_INFO__ID:
-				setId(ID_EDEFAULT);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__MIN_HEIGHT:
-				setMinHeight(MIN_HEIGHT_EDEFAULT);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__MIN_WIDTH:
-				setMinWidth(MIN_WIDTH_EDEFAULT);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__MULTI_LEVEL:
-				setMultiLevel(MULTI_LEVEL_EDEFAULT);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__NEED_BORDER_DECORATOR:
-				setNeedBorderDecorator(NEED_BORDER_DECORATOR_EDEFAULT);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__NEED_TABLE_DECORATOR:
-				setNeedTableDecorator(NEED_TABLE_DECORATOR_EDEFAULT);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__NON_VISUAL:
-				setNonVisual(NON_VISUAL_EDEFAULT);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__NON_VISUAL_IMAGE_PATH:
-				setNonVisualImagePath(NON_VISUAL_IMAGE_PATH_EDEFAULT);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_CHILD_TEXT:
-				setResolveChildText(RESOLVE_CHILD_TEXT_EDEFAULT);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE:
-				setResolveAttributeValue((ResolveAttributeValue)null);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__SET_NON_VISUAL_CHILD_ELEMENTS:
-				setSetNonVisualChildElements(SET_NON_VISUAL_CHILD_ELEMENTS_EDEFAULT);
-				return;
-			case DTInfoPackage.TAG_DECORATE_INFO__WIDGET:
-				setWidget(WIDGET_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case DTInfoPackage.TAG_DECORATE_INFO__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-			case DTInfoPackage.TAG_DECORATE_INFO__MIN_HEIGHT:
-				return minHeight != MIN_HEIGHT_EDEFAULT;
-			case DTInfoPackage.TAG_DECORATE_INFO__MIN_WIDTH:
-				return minWidth != MIN_WIDTH_EDEFAULT;
-			case DTInfoPackage.TAG_DECORATE_INFO__MULTI_LEVEL:
-				return multiLevel != MULTI_LEVEL_EDEFAULT;
-			case DTInfoPackage.TAG_DECORATE_INFO__NEED_BORDER_DECORATOR:
-				return needBorderDecorator != NEED_BORDER_DECORATOR_EDEFAULT;
-			case DTInfoPackage.TAG_DECORATE_INFO__NEED_TABLE_DECORATOR:
-				return needTableDecorator != NEED_TABLE_DECORATOR_EDEFAULT;
-			case DTInfoPackage.TAG_DECORATE_INFO__NON_VISUAL:
-				return nonVisual != NON_VISUAL_EDEFAULT;
-			case DTInfoPackage.TAG_DECORATE_INFO__NON_VISUAL_IMAGE_PATH:
-				return NON_VISUAL_IMAGE_PATH_EDEFAULT == null ? nonVisualImagePath != null : !NON_VISUAL_IMAGE_PATH_EDEFAULT.equals(nonVisualImagePath);
-			case DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_CHILD_TEXT:
-				return resolveChildText != RESOLVE_CHILD_TEXT_EDEFAULT;
-			case DTInfoPackage.TAG_DECORATE_INFO__RESOLVE_ATTRIBUTE_VALUE:
-				return resolveAttributeValue != null;
-			case DTInfoPackage.TAG_DECORATE_INFO__SET_NON_VISUAL_CHILD_ELEMENTS:
-				return setNonVisualChildElements != SET_NON_VISUAL_CHILD_ELEMENTS_EDEFAULT;
-			case DTInfoPackage.TAG_DECORATE_INFO__WIDGET:
-				return widget != WIDGET_EDEFAULT;
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: ");
-		result.append(id);
-		result.append(", minHeight: ");
-		result.append(minHeight);
-		result.append(", minWidth: ");
-		result.append(minWidth);
-		result.append(", multiLevel: ");
-		result.append(multiLevel);
-		result.append(", needBorderDecorator: ");
-		result.append(needBorderDecorator);
-		result.append(", needTableDecorator: ");
-		result.append(needTableDecorator);
-		result.append(", nonVisual: ");
-		result.append(nonVisual);
-		result.append(", nonVisualImagePath: ");
-		result.append(nonVisualImagePath);
-		result.append(", resolveChildText: ");
-		result.append(resolveChildText);
-		result.append(", setNonVisualChildElements: ");
-		result.append(setNonVisualChildElements);
-		result.append(", widget: ");
-		result.append(widget);
-		result.append(')');
-		return result.toString();
-	}
-
-} //TagDecorateInfoImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/util/DTInfoAdapterFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/util/DTInfoAdapterFactory.java
deleted file mode 100644
index fc18398..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/util/DTInfoAdapterFactory.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.util;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notifier;
-
-import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
-
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.*;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Adapter Factory</b> for the model.
- * It provides an adapter <code>createXXX</code> method for each class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage
- * @generated
- */
-public class DTInfoAdapterFactory extends AdapterFactoryImpl {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The cached model package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static DTInfoPackage modelPackage;
-
-	/**
-	 * Creates an instance of the adapter factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DTInfoAdapterFactory() {
-		if (modelPackage == null) {
-			modelPackage = DTInfoPackage.eINSTANCE;
-		}
-	}
-
-	/**
-	 * Returns whether this factory is applicable for the type of the object.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
-	 * <!-- end-user-doc -->
-	 * @return whether this factory is applicable for the type of the object.
-	 * @generated
-	 */
-	public boolean isFactoryForType(Object object) {
-		if (object == modelPackage) {
-			return true;
-		}
-		if (object instanceof EObject) {
-			return ((EObject)object).eClass().getEPackage() == modelPackage;
-		}
-		return false;
-	}
-
-	/**
-	 * The switch the delegates to the <code>createXXX</code> methods.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected DTInfoSwitch modelSwitch =
-		new DTInfoSwitch() {
-			public Object caseDTInfo(DTInfo object) {
-				return createDTInfoAdapter();
-			}
-			public Object caseTagConvertInfo(TagConvertInfo object) {
-				return createTagConvertInfoAdapter();
-			}
-			public Object caseOperation(Operation object) {
-				return createOperationAdapter();
-			}
-			public Object caseParameter(Parameter object) {
-				return createParameterAdapter();
-			}
-			public Object caseTagDecorateInfo(TagDecorateInfo object) {
-				return createTagDecorateInfoAdapter();
-			}
-			public Object caseResolveAttributeValue(ResolveAttributeValue object) {
-				return createResolveAttributeValueAdapter();
-			}
-			public Object defaultCase(EObject object) {
-				return createEObjectAdapter();
-			}
-		};
-
-	/**
-	 * Creates an adapter for the <code>target</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param target the object to adapt.
-	 * @return the adapter for the <code>target</code>.
-	 * @generated
-	 */
-	public Adapter createAdapter(Notifier target) {
-		return (Adapter)modelSwitch.doSwitch((EObject)target);
-	}
-
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo <em>DT Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfo
-	 * @generated
-	 */
-	public Adapter createDTInfoAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo <em>Tag Convert Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagConvertInfo
-	 * @generated
-	 */
-	public Adapter createTagConvertInfoAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation <em>Operation</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Operation
-	 * @generated
-	 */
-	public Adapter createOperationAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter <em>Parameter</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.Parameter
-	 * @generated
-	 */
-	public Adapter createParameterAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo <em>Tag Decorate Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.TagDecorateInfo
-	 * @generated
-	 */
-	public Adapter createTagDecorateInfoAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue <em>Resolve Attribute Value</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.ResolveAttributeValue
-	 * @generated
-	 */
-	public Adapter createResolveAttributeValueAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for the default case.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @generated
-	 */
-	public Adapter createEObjectAdapter() {
-		return null;
-	}
-
-} //DTInfoAdapterFactory
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/util/DTInfoSwitch.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/util/DTInfoSwitch.java
deleted file mode 100644
index 6f178c8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/internal/util/DTInfoSwitch.java
+++ /dev/null
@@ -1,245 +0,0 @@
-/**
- * <copyright>
- * </copyright>
- *
- * $Id$
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo.internal.util;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.jst.pagedesigner.dtmanager.dtinfo.*;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Switch</b> for the model's inheritance hierarchy.
- * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
- * to invoke the <code>caseXXX</code> method for each class of the model,
- * starting with the actual class of the object
- * and proceeding up the inheritance hierarchy
- * until a non-null result is returned,
- * which is the result of the switch.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.pagedesigner.dtmanager.dtinfo.DTInfoPackage
- * @generated
- */
-public class DTInfoSwitch {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The cached model package
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static DTInfoPackage modelPackage;
-
-	/**
-	 * Creates an instance of the switch.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public DTInfoSwitch() {
-		if (modelPackage == null) {
-			modelPackage = DTInfoPackage.eINSTANCE;
-		}
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-     * @param theEObject 
-     * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Object doSwitch(EObject theEObject) {
-		return doSwitch(theEObject.eClass(), theEObject);
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-     * @param theEClass 
-     * @param theEObject 
-     * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected Object doSwitch(EClass theEClass, EObject theEObject) {
-		if (theEClass.eContainer() == modelPackage) {
-			return doSwitch(theEClass.getClassifierID(), theEObject);
-		}
-        List eSuperTypes = theEClass.getESuperTypes();
-        return
-        	eSuperTypes.isEmpty() ?
-        		defaultCase(theEObject) :
-        		doSwitch((EClass)eSuperTypes.get(0), theEObject);
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-     * @param classifierID 
-     * @param theEObject 
-     * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected Object doSwitch(int classifierID, EObject theEObject) {
-		switch (classifierID) {
-			case DTInfoPackage.DT_INFO: {
-				DTInfo dtInfo = (DTInfo)theEObject;
-				Object result = caseDTInfo(dtInfo);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case DTInfoPackage.TAG_CONVERT_INFO: {
-				TagConvertInfo tagConvertInfo = (TagConvertInfo)theEObject;
-				Object result = caseTagConvertInfo(tagConvertInfo);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case DTInfoPackage.OPERATION: {
-				Operation operation = (Operation)theEObject;
-				Object result = caseOperation(operation);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case DTInfoPackage.PARAMETER: {
-				Parameter parameter = (Parameter)theEObject;
-				Object result = caseParameter(parameter);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case DTInfoPackage.TAG_DECORATE_INFO: {
-				TagDecorateInfo tagDecorateInfo = (TagDecorateInfo)theEObject;
-				Object result = caseTagDecorateInfo(tagDecorateInfo);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case DTInfoPackage.RESOLVE_ATTRIBUTE_VALUE: {
-				ResolveAttributeValue resolveAttributeValue = (ResolveAttributeValue)theEObject;
-				Object result = caseResolveAttributeValue(resolveAttributeValue);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			default: return defaultCase(theEObject);
-		}
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>DT Info</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>DT Info</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseDTInfo(DTInfo object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Tag Convert Info</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Tag Convert Info</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseTagConvertInfo(TagConvertInfo object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Operation</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Operation</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseOperation(Operation object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Parameter</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Parameter</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseParameter(Parameter object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Tag Decorate Info</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Tag Decorate Info</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseTagDecorateInfo(TagDecorateInfo object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>Resolve Attribute Value</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>Resolve Attribute Value</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public Object caseResolveAttributeValue(ResolveAttributeValue object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpretting the object as an instance of '<em>EObject</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch, but this is the last case anyway.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpretting the object as an instance of '<em>EObject</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)
-	 * @generated
-	 */
-	public Object defaultCase(EObject object) {
-		return null;
-	}
-
-} //DTInfoSwitch
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/package-info.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/package-info.java
deleted file mode 100644
index 3f0ea23..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/dtinfo/package-info.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * Tag conversion model. 
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.pagedesigner.dtmanager.dtinfo;
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/package-info.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/package-info.java
deleted file mode 100644
index 8f5fa02..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/package-info.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * Tag conversion design time manager.  
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.pagedesigner.dtmanager;
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/DesignerStructuredTextEditorJSP.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/DesignerStructuredTextEditorJSP.java
deleted file mode 100644
index dc84c35..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/DesignerStructuredTextEditorJSP.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.text.ITextViewer;
-import org.eclipse.jst.pagedesigner.dnd.internal.DesignerSourceDropTargetListener;
-import org.eclipse.ui.texteditor.ITextEditorDropTargetListener;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-
-/**
- * @author mengbo
- */
-public class DesignerStructuredTextEditorJSP extends StructuredTextEditor {
-	protected void initializeDrop(ITextViewer textViewer) {
-		// It seems if we don't skip this method, our drag drop listener will
-		// can't be enabled.
-	}
-
-	public IAction getAction(String actionID) {
-		try {
-			return super.getAction(actionID);
-		} catch (Exception e) {
-			return null;
-		}
-	}
-
-	public Object getAdapter(Class required) {
-		if (ITextEditorDropTargetListener.class.equals(required)) {
-			DesignerSourceDropTargetListener listener = new DesignerSourceDropTargetListener(
-					this);
-			return listener;
-		}
-        return super.getAdapter(required);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/HTMLEditor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/HTMLEditor.java
deleted file mode 100644
index 603c271..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/HTMLEditor.java
+++ /dev/null
@@ -1,1061 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors;
-
-import java.io.File;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.gef.DefaultEditDomain;
-import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.gef.ui.palette.PaletteViewerProvider;
-import org.eclipse.gef.ui.views.palette.PalettePage;
-import org.eclipse.gef.ui.views.palette.PaletteViewerPage;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.TextSelection;
-import org.eclipse.jface.viewers.IPostSelectionProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.ResourceUtils;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dnd.internal.DesignerSourceMouseTrackAdapter;
-import org.eclipse.jst.pagedesigner.editors.pagedesigner.PageDesignerResources;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.PaletteItemManager;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.IPageVariablesProvider;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter.IDocumentPageVariableAdapter;
-import org.eclipse.jst.pagedesigner.parts.DocumentEditPart;
-import org.eclipse.jst.pagedesigner.preview.PreviewHandlerNew;
-import org.eclipse.jst.pagedesigner.preview.WindowsIEBrowser;
-import org.eclipse.jst.pagedesigner.properties.WPETabbedPropertySheetPage;
-import org.eclipse.jst.pagedesigner.tools.RangeSelectionTool;
-import org.eclipse.jst.pagedesigner.ui.common.PartActivationHandler;
-import org.eclipse.jst.pagedesigner.ui.common.sash.SashEditorPart;
-import org.eclipse.jst.pagedesigner.utils.PreviewUtil;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IPropertyListener;
-import org.eclipse.ui.IStorageEditorInput;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.contexts.IContextService;
-import org.eclipse.ui.part.MultiPageSelectionProvider;
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor;
-import org.eclipse.wst.common.ui.provisional.editors.PostMultiPageEditorSite;
-import org.eclipse.wst.common.ui.provisional.editors.PostMultiPageSelectionProvider;
-import org.eclipse.wst.common.ui.provisional.editors.PostSelectionMultiPageEditorPart;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-import org.eclipse.wst.sse.ui.internal.provisional.extensions.ISourceEditingTextTools;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.ui.internal.provisional.IDOMSourceEditingTextTools;
-import org.w3c.dom.Document;
-
-/**
- * The HTMLEditor is a multi paged editor. It will use the StructuredTextEditor
- * as the chief editor, and delegate most operations to it.
- * 
- * @author mengbo
- */
-public final class HTMLEditor extends PostSelectionMultiPageEditorPart implements
-		IPropertyListener, ITabbedPropertySheetPageContributor {
-	// private static final String PAGE_NAME_DESIGN = "Design"; //$NON-NLS-1$
-	// private static final String PAGE_NAME_SOURCE = "Source"; //$NON-NLS-1$
-	/**
-	 * Tabbed property contributor id for WPE
-	 */
-	public final static String TABBED_PROPERTIES_CONTRIBUTOR_ID = "org.eclipse.jst.pagedesigner.tabPropertyContributor"; //$NON-NLS-1$
-
-	// four different modes for the designer when displayed in a sash editor.
-	/**
-	 * editor split is vertical
-	 */
-	public static final int MODE_SASH_VERTICAL = 0;
-
-	/**
-	 * editor split is horizontal
-	 */
-	public static final int MODE_SASH_HORIZONTAL = 1;
-
-	/**
-	 * no split, only designer canvas
-	 */
-	public static final int MODE_DESIGNER = 2;
-
-	/**
-	 * no split, only SSE source
-	 */
-	public static final int MODE_SOURCE = 3;
-
-	private Logger _log = PDPlugin.getLogger(HTMLEditor.class);
-
-	private boolean _sash = true;
-
-	private int _mode = 0;
-
-	private SashEditorPart _sashEditorPart = null;
-
-	private int _previewPageIndex;
-
-	/** The design viewer */
-	private SimpleGraphicalEditor _designViewer;
-
-	/** The text editor. */
-	private StructuredTextEditor _textEditor;
-
-	private PartActivationHandler _partListener;
-
-	private PaletteViewerPage _paletteViewerPage;
-
-	private DefaultEditDomain _editDomain;
-
-	private WindowsIEBrowser _browser;
-	
-	private Composite _previewComposite;
-
-	private List PREVIEW_FILES_LIST = new ArrayList();
-
-	private WPETabbedPropertySheetPage _tabbedPropSheet;
-
-	private ISelectionChangedListener _selChangedListener;
-
-    // TODO:This class is never used locally
-//	private class TextInputListener implements ITextInputListener {
-//		public void inputDocumentAboutToBeChanged(IDocument oldInput,
-//				IDocument newInput) {
-//            // do nothing
-//		}
-//
-//		public void inputDocumentChanged(IDocument oldInput, IDocument newInput) {
-//			if (_designViewer != null && newInput != null)
-//				_designViewer.setModel(getModel());
-//		}
-//	}
-
-	/**
-	 * Default constructor
-	 */
-	public HTMLEditor() {
-		super();
-	}
-
-	/*
-	 * This method is just to make firePropertyChanged accessbible from some
-	 * (anonomous) inner classes.
-	 */
-	private void _firePropertyChange(int property) {
-		super.firePropertyChange(property);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.xtools.common.ui.properties.ITabbedPropertySheetPageContributor#getContributorId()
-	 */
-	public String getContributorId() {
-		return TABBED_PROPERTIES_CONTRIBUTOR_ID;
-	}
-
-	private void connectSashPage() {
-		ISelectionProvider selectionProvider = _sashEditorPart.getSite()
-				.getSelectionProvider();
-		if (selectionProvider instanceof IPostSelectionProvider) {
-			((IPostSelectionProvider) selectionProvider)
-					.addPostSelectionChangedListener(getSelectionChangedListener(selectionProvider));
-		} else {
-			selectionProvider
-					.addSelectionChangedListener(getSelectionChangedListener(selectionProvider));
-		}
-	}
-	
-	private void disconnectSashPage() {
-		ISelectionProvider selectionProvider = _sashEditorPart.getSite()
-				.getSelectionProvider();
-		if (selectionProvider instanceof IPostSelectionProvider) {
-			((IPostSelectionProvider) selectionProvider)
-					.removePostSelectionChangedListener(getSelectionChangedListener(selectionProvider));
-		} else {
-			selectionProvider
-					.removeSelectionChangedListener(getSelectionChangedListener(selectionProvider));
-		}
-	}
-
-	private ISelectionChangedListener getSelectionChangedListener(ISelectionProvider selectionProvider) {
-		if (_selChangedListener  == null) {
-			if (selectionProvider instanceof IPostSelectionProvider) {
-				_selChangedListener =  new ISelectionChangedListener() {
-				public void selectionChanged(SelectionChangedEvent event) {
-						((PostMultiPageSelectionProvider) getSite()
-								.getSelectionProvider())
-								.firePostSelectionChanged(event);
-					}
-				};
-			}
-			else {
-				_selChangedListener =  new ISelectionChangedListener() {
-					public void selectionChanged(SelectionChangedEvent event) {
-							((MultiPageSelectionProvider) getSite()
-									.getSelectionProvider())
-									.firePostSelectionChanged(event);
-						}
-					};
-			}
-		}
-		return _selChangedListener;
-	}
-
-	/**
-	 * Creates the source page of the multi-page editor.
-	 * @throws PartInitException 
-	 */
-	protected void sash_createAndAddDesignSourcePage() throws PartInitException {
-		// create source page
-		_textEditor = createTextEditor();
-		_textEditor.setEditorPart(this);
-		_textEditor.addPropertyListener(this);
-		// create design page
-		_designViewer = new SimpleGraphicalEditor(this, getEditDomain());
-
-		// create SashEditor
-		_sashEditorPart = new SashEditorPart() {
-			protected void createPages() throws PartInitException {
-				addPage(_designViewer, getEditorInput());
-				addPage(_textEditor, getEditorInput());
-			}
-		};
-		int sashIndex = addPage(_sashEditorPart, getEditorInput());
-
-		setPageText(sashIndex, PDPlugin.getResourceString("HTMLEditor.Design"));
-
-		// the update's critical, to get viewer selection manager and
-		// highlighting to work
-		_textEditor.update();
-
-		firePropertyChange(PROP_TITLE);
-
-		// Changes to the Text Viewer's document instance should also force an
-		// input refresh
-		// _textEditor.getTextViewer().addTextInputListener(new
-		// TextInputListener());
-		connectSashPage();
-	}
-
-	/**
-	 * @see org.eclipse.ui.part.MultiPageEditorPart#createSite(org.eclipse.ui.IEditorPart)
-	 */
-	protected IEditorSite createSite(IEditorPart editor) {
-		return new PostMultiPageEditorSite(this, editor);
-	}
-
-	private void tabbed_createAndAddDesignSourcePage()
-			throws PartInitException {
-		// create source page
-		_textEditor = createTextEditor();
-		_textEditor.setEditorPart(this);
-		_textEditor.addPropertyListener(this);
-
-		// create design page
-		SimpleGraphicalEditor editor = new SimpleGraphicalEditor(this,
-				getEditDomain());
-
-		// add design page
-		int designPageIndex = addPage(editor, null);
-
-		_designViewer = editor;
-		// // note: By adding the design page as a Control instead of an
-		// // IEditorPart, page switches will indicate
-		// // a "null" active editor when the design page is made active
-		setPageText(designPageIndex, PDPlugin
-				.getResourceString("HTMLEditor.Design"));
-
-		// add source page
-		int sourcePageIndex = addPage(_textEditor, getEditorInput());
-		setPageText(sourcePageIndex, PDPlugin
-				.getResourceString("HTMLEditor.Source"));
-		// the update's critical, to get viewer selection manager and
-		// highlighting to work
-		_textEditor.update();
-
-		firePropertyChange(PROP_TITLE);
-
-		// Changes to the Text Viewer's document instance should also force an
-		// input refresh
-		// _textEditor.getTextViewer().addTextInputListener(new
-		// TextInputListener());
-	}
-
-	private void createAndAddPreviewPage() {
-		_previewComposite = new Composite(getContainer(), 0);
-		FillLayout filllayout = new FillLayout();
-		_previewComposite.setLayout(filllayout);
-
-		_previewPageIndex = addPage(_previewComposite);
-		// JSPSourceEditor.Page.Preview.PageText=Preview
-		setPageText(_previewPageIndex, PageDesignerResources.getInstance()
-				.getString("JSPSourceEditor.Page.Preview.PageText")); //$NON-NLS-1$
-		
-	}
-
-	private WindowsIEBrowser getPreviewBrowser() {
-		if (_browser == null) {
-			_browser = new WindowsIEBrowser();
-			if (_browser != null) {
-				_browser.create(_previewComposite, SWT.NONE);
-				_previewComposite.layout();
-			}
-		}
-		return _browser;
-	}
-	/**
-	 * Connects the design viewer with the viewer selection manager. Should be
-	 * done after createSourcePage() is done because we need to get the
-	 * ViewerSelectionManager from the TextEditor. setModel is also done here
-	 * because getModel() needs to reference the TextEditor.
-	 */
-	protected void connectDesignPage() {
-		if (_designViewer != null) {
-			_designViewer.setModel(getModel());
-			// _designViewer.getSynchronizer().listenToModel(getModel());
-			ISelectionProvider designSelectionProvider = _designViewer
-					.getSite().getSelectionProvider();
-			if (designSelectionProvider instanceof IPostSelectionProvider) {
-				((IPostSelectionProvider) designSelectionProvider)
-						.addPostSelectionChangedListener(new ISelectionChangedListener() {
-							public void selectionChanged(
-									SelectionChangedEvent event) {
-								if (getActiveEditor() != _textEditor) {
-									_designViewer.getSynchronizer()
-											.selectionChanged(event);
-								}
-							}
-						});
-			} else {
-				designSelectionProvider
-						.addSelectionChangedListener(new ISelectionChangedListener() {
-							public void selectionChanged(
-									SelectionChangedEvent event) {
-								if (getActiveEditor() != _textEditor) {
-									_designViewer.getSynchronizer()
-											.selectionChanged(event);
-								}
-							}
-						});
-			}
-			ISelectionProvider textSelectionProvider = _textEditor.getSite()
-					.getSelectionProvider();
-			if (textSelectionProvider instanceof IPostSelectionProvider) {
-				((IPostSelectionProvider) textSelectionProvider)
-						.addPostSelectionChangedListener(new ISelectionChangedListener() {
-							public void selectionChanged(
-									SelectionChangedEvent event) {
-								if (event.getSelection() instanceof TextSelection) {
-									TextSelection textSelection = ((TextSelection) event
-											.getSelection());
-									_designViewer
-											.getSynchronizer()
-											.textSelectionChanged(
-													textSelection.getOffset(),
-													textSelection.getOffset()
-															+ textSelection
-																	.getLength());
-								}
-							}
-						});
-			} else {
-				textSelectionProvider
-						.addSelectionChangedListener(new ISelectionChangedListener() {
-							public void selectionChanged(
-									SelectionChangedEvent event) {
-								TextSelection textSelection = ((TextSelection) event
-										.getSelection());
-								_designViewer.getSynchronizer()
-										.textSelectionChanged(
-												textSelection.getOffset(),
-												textSelection.getOffset()
-														+ textSelection
-																.getLength());
-							}
-						});
-			}
-		}
-	}
-
-	/**
-	 * Creates the pages of this multi-page editor.
-	 * <p>
-	 * Subclasses of <code>MultiPageEditor</code> must implement this method.
-	 * </p>
-	 */
-	protected void createPages() {
-		try {
-			// source page MUST be created before design page, now
-			if (_sash) {
-				sash_createAndAddDesignSourcePage();
-			} else {
-				tabbed_createAndAddDesignSourcePage();
-			}
-			connectDesignPage();
-			createAndAddPreviewPage();
-			DesignerSourceMouseTrackAdapter adapter = new DesignerSourceMouseTrackAdapter(
-					_textEditor, getEditDomain());
-			_textEditor.getTextViewer().getTextWidget().addMouseListener(
-					adapter);
-			_textEditor.getTextViewer().getTextWidget().addMouseMoveListener(
-					adapter);
-		} catch (PartInitException exception) {
-			//$NON-NLS-1$ = "An error has occurred when initializing the input for the the editor's source page."
-			if (_log != null) {
-				// throw new SourceEditingRuntimeException(
-				// "An error has occurred when initializing the input for the
-				// the editor's source page.");
-			}
-		}
-		// TODO: add a catch block here for any exception the design
-		// page throws and convert it into a more informative message.
-	}
-
-	/**
-	 * Method createTextEditor.
-	 * 
-	 * @return StructuredTextEditor
-	 */
-	protected StructuredTextEditor createTextEditor() {
-		return new DesignerStructuredTextEditorJSP();
-	}
-
-	private void disconnectDesignPage() {
-		if (_designViewer != null) {
-			_designViewer.setModel(null);
-			_designViewer.dispose();
-		}
-	}
-
-	public void dispose() {
-		//System.out.println("dispose of HTML Editor");
-		deletePreviewFiles();
-
-		disconnectDesignPage();
-		disconnectSashPage();
-		
-		IWorkbenchWindow window = getSite().getWorkbenchWindow();
-		window.getPartService().removePartListener(_partListener);
-		window.getShell().removeShellListener(_partListener);
-		getSite().getPage().removePartListener(_partListener);
-
-		if (_textEditor != null) {
-			_textEditor.removePropertyListener(this);
-			_textEditor.setEditorPart(null);
-			_textEditor.dispose();
-		}
-		
-		// moved to last when added window ... seems like
-		// we'd be in danger of losing some data, like site,
-		// or something.
-		_sashEditorPart = null;
-		_tabbedPropSheet = null;
-		_partListener = null;
-		_editDomain = null;
-		_designViewer = null;
-		_browser = null;
-		_previewComposite = null;
-		_paletteViewerPage = null;
-		_log = null;
-		_selChangedListener = null;
-		_textEditor = null;
-		
-		super.dispose();
-		
-	}
-
-	public void doSave(IProgressMonitor monitor) {
-		_textEditor.doSave(monitor);
-	}
-
-	/*
-	 * (non-Javadoc) Saves the contents of this editor to another object. <p>
-	 * Subclasses must override this method to implement the open-save-close
-	 * lifecycle for an editor. For greater details, see <code> IEditorPart
-	 * </code></p>
-	 * 
-	 * @see IEditorPart
-	 */
-	public void doSaveAs() {
-		_textEditor.doSaveAs();
-	}
-
-	private void editorInputIsAcceptable(IEditorInput input)
-			throws PartInitException {
-		if (input instanceof IFileEditorInput) {
-			// verify that it can be opened
-			CoreException[] coreExceptionArray = new CoreException[1];
-			if (fileDoesNotExist((IFileEditorInput) input, coreExceptionArray)) {
-				// todo use message formatter for {0}
-				Throwable coreException = coreExceptionArray[0];
-
-				// C.B: this is a strange piece of logic.  It was referenceing
-				// the internal sub-class of CoreException, ResourceException.
-				// need to review fileDoesNotExist.
-				if (coreException instanceof CoreException) {
-					// I'm assuming this is always 'does not exist'
-					// we'll refresh local go mimic behavior of default
-					// editor, where the
-					// troublesome file is refreshed (and will cause it to
-					// 'disappear' from Navigator.
-					try {
-						((IFileEditorInput) input).getFile()
-								.refreshLocal(IResource.DEPTH_ZERO,
-										new NullProgressMonitor());
-					} catch (CoreException ce) {
-						if (_log != null) {
-							_log.error("Error.HTMLEditor.0", ce); //$NON-NLS-1$
-						}
-					}
-					throw new PartInitException("Resource " + input.getName()
-							+ " does not exist.");
-				}
-                throw new PartInitException("Editor could not be open on "
-                		+ input.getName());
-			}
-		} else if (input instanceof IStorageEditorInput) {
-			InputStream contents = null;
-			try {
-				contents = ((IStorageEditorInput) input).getStorage()
-						.getContents();
-				if (contents == null) {
-					throw new PartInitException("Editor could not be open on "
-							+ input.getName());
-				}
-			} catch (CoreException noStorageExc) {
-				// Error in geting storage contents
-				_log.error("Error.HTMLEditor.1", noStorageExc); //$NON-NLS-1$
-			}
-			finally
-			{
-				ResourceUtils.ensureClosed(contents);
-			}
-		}
-	}
-
-	/**
-	 * Initializes the editor part with a site and input. <p>
-	 * Subclasses of <code> EditorPart </code> must implement this method.
-	 * Within the implementation subclasses should verify that the input type is
-	 * acceptable and then save the site and input. Here is sample code: </p><pre>
-	 * if (!(input instanceof IFileEditorInput)) throw new
-	 * PartInitException("Invalid Input: Must be IFileEditorInput");
-	 * setSite(site); setInput(editorInput); </pre>
-	 * @param input 
-	 * @param coreException 
-	 * @return true if the input doesn't exist 
-	 */
-	protected boolean fileDoesNotExist(IFileEditorInput input,
-			Throwable[] coreException) {
-		boolean result = false;
-		InputStream inStream = null;
-		if ((!(input.exists())) || (!(input.getFile().exists()))) {
-			result = true;
-		} else {
-			try 
-			{
-				inStream = input.getFile().getContents(true);
-			} 
-			catch (CoreException e) 
-			{
-				// very likely to be file not found
-				result = true;
-				coreException[0] = e;
-				// The core has exception
-				_log.error("Error.HTMLEditor.3", e); //$NON-NLS-1$
-			} 
-			finally 
-			{
-				ResourceUtils.ensureClosed(inStream);
-			}
-		}
-		return result;
-	}
-
-	public Object getAdapter(Class key) {
-		Object result = null;
-		if (key == IDesignViewer.class) {
-			result = _designViewer;
-		} else if (key == PalettePage.class) {
-			return getPaletteViewerPage();
-		} else if (key == IPropertySheetPage.class) {
-			// XXX: we can delegate this to the fTextEditor, but that use some
-			// more
-			// complicate mechanism, and don't work with page designer well, so
-			// do it simple now, fix later.
-			// return _textEditor.getAdapter(key);
-			return getPropertySheetPage();
-		} else if (key == IContentOutlinePage.class) {
-			if (_textEditor != null) {
-				result = _textEditor.getAdapter(key);
-			}
-		} else if (key == IPageVariablesProvider.class) {
-			Object obj = ((IDOMModel) getModel()).getDocument().getAdapterFor(
-					IDocumentPageVariableAdapter.class);
-			if (obj instanceof IPageVariablesProvider) {
-				return obj;
-			}
-            return null;
-		} else {
-			// DMW: I'm bullet-proofing this because
-			// its been reported (on 4.03 version) a null pointer sometimes
-			// happens here on startup, when an editor has been left
-			// open when workbench shutdown.
-			if (_textEditor != null) {
-				result = _textEditor.getAdapter(key);
-			}
-		}
-		return result;
-	}
-
-
-	/**
-	 * IExtendedSimpleEditor method
-	 * @return IDocument
-	 */
-	public IDocument getDocument() {
-		if (getTextEditor() == null) {
-			return null;
-		}
-
-		Object apapter = _textEditor.getAdapter(ISourceEditingTextTools.class);
-		if (apapter != null) {
-			return ((ISourceEditingTextTools) apapter).getDocument();
-		}
-
-		return null;
-	}
-
-	/**
-	 * IExtendedMarkupEditor method
-	 * @return the dom document
-	 */
-	public Document getDOMDocument() {
-		if (getTextEditor() == null) {
-			return null;
-		}
-
-		Object adapter = _textEditor.getAdapter(ISourceEditingTextTools.class);
-		if (adapter instanceof IDOMSourceEditingTextTools) {
-			return ((IDOMSourceEditingTextTools) adapter).getDOMDocument();
-		}
-		return null;
-	}
-
-	/**
-	 * IExtendedSimpleEditor method
-	 * @return the editor part
-	 */
-	public IEditorPart getEditorPart() {
-		return this;
-	}
-
-	/**
-	 * @return the structured model
-	 */
-	public IStructuredModel getModel() {
-		IStructuredModel model = null;
-		if (_textEditor != null) {
-			model = ((DesignerStructuredTextEditorJSP) _textEditor).getModel();
-		}
-		return model;
-	}
-
-
-	/**
-	 * @return the SSE editor delegate
-	 */
-	public StructuredTextEditor getTextEditor() {
-		return _textEditor;
-	}
-
-
-	/*
-	 * (non-Javadoc) Method declared on IWorkbenchPart.
-	 */
-	public String getTitle() {
-		String title = null;
-		if (getTextEditor() == null) {
-			if (getEditorInput() != null) {
-				title = getEditorInput().getName();
-			}
-		} else {
-			title = getTextEditor().getTitle();
-		}
-		if (title == null) {
-			title = getPartName();
-		}
-		return title;
-	}
-
-	public void init(IEditorSite site, IEditorInput input)
-			throws PartInitException {
-		super.init(site, input);
-		editorInputIsAcceptable(input);
-		try {
-			// super.init(site, input);
-			// setSite(site);
-			setInput(input);
-			if (_partListener == null) {
-				_partListener = new PartActivationHandler(this) {
-					public void handleActivation() {
-						safelySanityCheckState();
-					}
-				};
-			}
-			// we want to listen for our own activation
-			IWorkbenchWindow window = getSite().getWorkbenchWindow();
-			window.getPartService().addPartListener(_partListener);
-			window.getShell().addShellListener(_partListener);
-			
-			// TODO: is this the right place to do this?
-			// enable our editor context
-			IContextService contextService = (IContextService) getSite()
-			  .getService(IContextService.class);
-			contextService.activateContext("org.eclipse.jst.pagedesigner.editorContext");
-
-		} catch (Exception e) {
-			// Error in editor initialization
-			_log.error("Error.HTMLEditor.5", e); //$NON-NLS-1$
-		}
-		setPartName(input.getName());
-	}
-
-	/*
-	 * (non-Javadoc) Returns whether the "save as" operation is supported by
-	 * this editor. <p> Subclasses must override this method to implement the
-	 * open-save-close lifecycle for an editor. For greater details, see <code>
-	 * IEditorPart </code></p>
-	 * 
-	 * @see IEditorPart
-	 */
-	public boolean isSaveAsAllowed() {
-		return _textEditor != null && _textEditor.isSaveAsAllowed();
-	}
-
-	/*
-	 * (non-Javadoc) Returns whether the contents of this editor should be saved
-	 * when the editor is closed. <p> This method returns <code> true </code> if
-	 * and only if the editor is dirty ( <code> isDirty </code> ). </p>
-	 */
-	public boolean isSaveOnCloseNeeded() {
-		// overriding super class since it does a lowly isDirty!
-		if (_textEditor != null) {
-			return _textEditor.isSaveOnCloseNeeded();
-		}
-		return isDirty();
-	}
-
-	/**
-	 * Posts the update code "behind" the running operation.
-	 */
-	private void postOnDisplayQue(Runnable runnable) {
-		IWorkbench workbench = PlatformUI.getWorkbench();
-		IWorkbenchWindow[] windows = workbench.getWorkbenchWindows();
-		if (windows != null && windows.length > 0) {
-			Display display = windows[0].getShell().getDisplay();
-			display.asyncExec(runnable);
-		} else {
-			runnable.run();
-		}
-	}
-
-	/**
-	 * Indicates that a property has changed.
-	 * 
-	 * @param source
-	 *            the object whose property has changed
-	 * @param propId
-	 *            the id of the property which has changed; property ids are
-	 *            generally defined as constants on the source class
-	 */
-	public void propertyChanged(Object source, int propId) {
-		switch (propId) {
-		// had to implement input changed "listener" so that
-		// strucutedText could tell it containing editor that
-		// the input has change, when a 'resource moved' event is
-		// found.
-		case IEditorPart.PROP_INPUT: {
-			if (source == _textEditor) {
-				if (_textEditor.getEditorInput() != getEditorInput()) {
-					setInput(_textEditor.getEditorInput());
-					// title should always change when input changes.
-					// create runnable for following post call
-					Runnable runnable = new Runnable() {
-						public void run() {
-							_firePropertyChange(IWorkbenchPart.PROP_TITLE);
-						}
-					};
-					// Update is just to post things on the display queue
-					// (thread). We have to do this to get the dirty
-					// property to get updated after other things on the
-					// queue are executed.
-					postOnDisplayQue(runnable);
-				}
-			}
-			break;
-		}
-		case IWorkbenchPart.PROP_TITLE: {
-			// // update the input if the title is changed. why? It seems input
-			// change event will be fired at last.
-			// if (source == _textEditor)
-			// {
-			// if (_textEditor.getEditorInput() != getEditorInput())
-			// {
-			// setInput(_textEditor.getEditorInput());
-			// }
-			// }
-			// break;
-		}
-		default: {
-			// propagate changes. Is this needed? Answer: Yes.
-			// PROP_PART_NAME, PROP_DIRTY etc.
-			if (source == _textEditor) {
-				firePropertyChange(propId);
-			}
-			break;
-		}
-		}
-
-	}
-
-	private void safelySanityCheckState() {
-		// If we're called before editor is created, simply ignore since we
-		// delegate this function to our embedded TextEditor
-		if (getTextEditor() == null) {
-			return;
-		}
-
-		getTextEditor().safelySanityCheckState(getEditorInput());
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.EditorPart#setInput(org.eclipse.ui.IEditorInput)
-	 */
-	protected void setInput(IEditorInput input) {
-		// If driven from the Source page, it's "model" may not be up to date
-		// with the input just yet. We'll rely on later notification from the
-		// TextViewer to set us straight
-		super.setInput(input);
-		if (_designViewer != null) {
-
-			_designViewer.setModel(getModel());
-		}
-		setPartName(input.getName());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.EditorPart#isDirty()
-	 */
-	public boolean isDirty() {
-		if (getTextEditor() == null) {
-			return false;
-		}
-		return getTextEditor().isDirty();
-	}
-
-	private IPropertySheetPage getPropertySheetPage() {
-		if (_tabbedPropSheet == null){
-			_tabbedPropSheet = new org.eclipse.jst.pagedesigner.properties.WPETabbedPropertySheetPage(
-					this, this);
-		}
-		return _tabbedPropSheet;
-	}
-
-	private PaletteViewerPage getPaletteViewerPage() {
-		if (null == _paletteViewerPage) {
-			DefaultEditDomain editDomain = getEditDomain();
-			PaletteItemManager manager = PaletteItemManager
-					.getInstance(getCurrentProject(getEditorInput()));
-			manager.reset();
-            PaletteRoot paletteRoot = _designViewer.getPaletteRoot();
-            editDomain.setPaletteRoot(paletteRoot);
-            
-            _paletteViewerPage = (PaletteViewerPage) _designViewer.getAdapter(PalettePage.class);
-            // if possible, try to use the 
-            if (_paletteViewerPage == null)
-            {
-                PaletteViewerProvider provider = _designViewer.getPaletteViewerProvider2();
-                _paletteViewerPage = new PaletteViewerPage(provider);
-            }
-		}
-		return _paletteViewerPage;
-	}
-
-	/**
-	 * @return the edit domain
-	 */
-	public DefaultEditDomain getEditDomain() {
-		if (_editDomain == null) {
-			_editDomain = new DefaultEditDomain(this);
-
-			// XXX: if i don't do the following line, system will default use
-			// SelectionTool. Don't know where else to set this. Since it is
-			// kind of duplicate
-			// to the DesignerPaletteRoot.
-			_editDomain.setDefaultTool(new RangeSelectionTool());
-			_editDomain.loadDefaultTool();
-
-			// next config the _editDomain
-			// _editDomain.setPaletteRoot(new JSFPaletteRoot());
-		}
-		return _editDomain;
-	}
-
-	/**
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.part.MultiPageEditorPart#pageChange(int)
-	 */
-	protected void pageChange(int newPageIndex) {
-		super.pageChange(newPageIndex);
-
-		deletePreviewFiles();
-
-		if (newPageIndex == _previewPageIndex) {
-			// preview page activate, need to regenerate the preview text and
-			// display it.
-			StringBuffer result = new StringBuffer();
-			try {
-				// PreviewHandler.generatePreview(this.getModel(),
-				// this.getEditorInput(), result);
-				DocumentEditPart part = (DocumentEditPart) this._designViewer
-						.getGraphicViewer().getContents();
-				PreviewHandlerNew.generatePreview(part, result);
-			} catch (Exception ex) {
-				result = new StringBuffer();
-				result
-						.append(this.getModel().getStructuredDocument()
-								.getText());
-				// Error in page changing
-				_log.info("Error.HTMLEditor.6", ex); //$NON-NLS-1$
-				ex.printStackTrace();
-			}
-			File file = PreviewUtil.toFile(result, getEditorInput());
-			if (file != null) {
-				PREVIEW_FILES_LIST.add(file);
-				getPreviewBrowser().loadFile(file);
-			} else {
-				getPreviewBrowser().getBrowser().setUrl("about:blank"); //$NON-NLS-1$
-			}
-		}
-	}
-
-	/**
-	 * @return Returns the _designViewer.
-	 */
-	public IDesignViewer getDesignViewer() {
-		return _designViewer;
-	}
-
-	/**
-	 * @param mode
-	 */
-	public void setDesignerMode(int mode) {
-		if (_sashEditorPart != null) {
-			switch (mode) {
-			case MODE_SASH_HORIZONTAL:
-				_sashEditorPart.setOrientation(SWT.HORIZONTAL);
-				break;
-			case MODE_DESIGNER:
-				_sashEditorPart.setMaximizedEditor(this._designViewer);
-				break;
-			case MODE_SOURCE:
-				_sashEditorPart.setMaximizedEditor(this._textEditor);
-				break;
-			case MODE_SASH_VERTICAL:
-			default:
-				_sashEditorPart.setOrientation(SWT.VERTICAL);
-			}
-		}
-		this._mode = mode;
-	}
-
-	/**
-	 * @return the current design mode
-	 */
-	public int getDesignerMode() {
-		return this._mode;
-	}
-
-	private IProject getCurrentProject(IEditorInput input) {
-		IProject curProject = null;
-		IFile inputFile = null;
-		if (input instanceof IFileEditorInput) {
-			inputFile = ((IFileEditorInput) input).getFile();
-			curProject = inputFile.getProject();
-		}
-		return curProject;
-	}
-
-	public IEditorPart getActiveEditor() {
-		IEditorPart result = null;
-		if (_sash) {
-			result = _sashEditorPart.getActiveEditor();
-		} else {
-			if (_designViewer.getGraphicViewer().getControl().isFocusControl()) {
-				result = _designViewer;
-			} else if (_textEditor.getTextViewer().getControl()
-					.isFocusControl()) {
-				result = _textEditor;
-			}
-		}
-		return result;
-	}
-
-	public String getPartName() {
-		if (_textEditor != null) {
-			return _textEditor.getPartName();
-		}
-        return super.getPartName();
-	}
-
-	private void deletePreviewFiles() {
-		Iterator itPreviewFiles = PREVIEW_FILES_LIST.iterator();
-		while (itPreviewFiles.hasNext()) {
-			File file = (File)itPreviewFiles.next();
-			if (file != null && file.exists()) {
-				file.delete();
-			}
-		}
-		PREVIEW_FILES_LIST.clear();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/IDesignViewer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/IDesignViewer.java
deleted file mode 100644
index fc05338..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/IDesignViewer.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors;
-
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-
-/**
- * This is copied from the xmleditor plugin. Represents the design viewer that
- * need can be used to show the design page.
- * 
- * @author mengbo
- */
-public interface IDesignViewer {
-	/**
-	 * @return the title
-	 */
-	String getTitle();
-
-	/**
-	 * @param model
-	 */
-	void setModel(IStructuredModel model);
-
-	// void setViewerSelectionManager(ViewerSelectionManager
-	// viewerSelectionManager);
-
-	/**
-	 * @return the graphical viewer
-	 */
-	public IHTMLGraphicalViewer getGraphicViewer();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/OutlineConfiguration.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/OutlineConfiguration.java
deleted file mode 100644
index e247dc1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/OutlineConfiguration.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jst.jsp.ui.views.contentoutline.JSPContentOutlineConfiguration;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-
-/**
- * the HTML editor's outline view configuration
- *
- */
-public class OutlineConfiguration extends JSPContentOutlineConfiguration {
-	private Object[] _selections = new Object[0];
-
-	public ISelection getSelection(TreeViewer viewer, ISelection selection) {
-		if ((viewer.getInput() instanceof IStructuredModel)
-				&& (selection instanceof ITextSelection)) {
-			_selections = getSelectedObjects((IStructuredModel) viewer
-					.getInput(), (ITextSelection) selection);
-			if (_selections != null) {
-				return super.getSelection(viewer, new StructuredSelection(
-						_selections));
-			}
-		}
-		return super.getSelection(viewer, new StructuredSelection(_selections));
-	}
-
-	private Object[] getSelectedObjects(IStructuredModel model,
-			ITextSelection selection) {
-		Object[] selectedStructures = null;
-		if (model != null) {
-			IndexedRegion region = model
-					.getIndexedRegion(selection.getOffset());
-			int end = selection.getOffset() + selection.getLength();
-			if (region != null) {
-				if (end <= region.getEndOffset()) {
-					// single selection
-					selectedStructures = new Object[1];
-					selectedStructures[0] = region;
-				} else {
-					// multiple selection
-					int maxLength = model.getStructuredDocument().getLength();
-					List structures = new ArrayList(2);
-					while (region != null && region.getEndOffset() <= end
-							&& region.getEndOffset() < maxLength) {
-						structures.add(region);
-						region = model
-								.getIndexedRegion(region.getEndOffset() + 1);
-					}
-					selectedStructures = structures.toArray();
-				}
-			}
-		}
-		if (selectedStructures == null) {
-			selectedStructures = new Object[0];
-		}
-		return selectedStructures;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/PageDesignerActionConstants.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/PageDesignerActionConstants.java
deleted file mode 100644
index cbe7381..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/PageDesignerActionConstants.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors;
-
-import org.eclipse.gef.ui.actions.GEFActionConstants;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.ui.IWorkbenchActionConstants;
-
-/**
- * Common constants used to id specific locations in the canvas context menu.
- * 
- * @see SimpleGraphicalEditor.ContextMenuListener for construction order
- * 
- * @author mengbo
- */
-public class PageDesignerActionConstants 
-{
-    /**
-     * Id for the standard Edit sub-menu
-     */
-    public static final String EDIT_SUBMENU_ID = "org.eclipse.jst.pagedesigner.context.submenu.edit"; //$NON-NLS-1$
-    /**
-     * Id for the standard Select sub-menu
-     */
-    public static final String SELECT_SUBMENU_ID = "org.eclipse.jst.pagedesigner.context.submenu.select"; //$NON-NLS-1$
-    /**
-     * Id for the standard Insert sub-menu
-     */
-    public static final String INSERT_SUBMENU_ID = "org.eclipse.jst.pagedesigner.context.submenu.insert"; //$NON-NLS-1$
-    /**
-     * Id for the standard Navigate sub-menu
-     */
-    public static final String NAVIGATE_SUBMENU_ID = "org.eclipse.jst.pagedesigner.context.submenu.navigate"; //$NON-NLS-1$
-    /**
-     * Id for the standard Style sub-menu
-     */
-    public static final String STYLE_SUBMENU_ID = "org.eclipse.jst.pagedesigner.context.submenu.style"; //$NON-NLS-1$
-    /**
-     * Id for the standard Show(View) sub-menu
-     */
-    public static final String SHOWVIEW_SUBMENU_ID = "org.eclipse.jst.pagedesigner.viewMenuMgr"; //$NON-NLS-1$
-    
-	/**
-	 * Undo action group
-	 */
-	public static final String GROUP_UNDO = GEFActionConstants.GROUP_UNDO;
-	/**
-	 * Standard Edit sub-menu action group
-	 */
-	public static final String GROUP_EDIT = GEFActionConstants.GROUP_EDIT;
-	/**
-	 * Group for container injected actions
-	 */
-	public static final String GROUP_CONTAINER = "org.eclipse.jst.pagedesigner.container"; //$NON-NLS-1$
-	/**
-	 * Standard Style sub-menu action group
-	 */
-	public static final String GROUP_STYLE = "org.eclipse.jst.pagedesigner.style"; //$NON-NLS-1$
-	/**
-	 * Group for third-party contributed tag-specific actions
-	 */
-	public static final String GROUP_SPECIAL = "org.eclipse.jst.pagedesigner.special"; //$NON-NLS-1$
-    /**
-     * Standard Select sub-menu action group
-     */
-    public static final String GROUP_SELECT = "org.eclipse.jst.pagedesigner.select"; //$NON-NLS-1$
-    /**
-     * Standard Insert sub-menu action group
-     */
-    public static final String GROUP_INSERT = "org.eclipse.jst.pagedesigner.insert"; //$NON-NLS-1$
-    /**
-     * Standard Navigate sub-menu action group
-     */
-    public static final String GROUP_NAVIGATE = "org.eclipse.jst.pagedesigner.navigate"; //$NON-NLS-1$
-
-
-    /**
-     * Add standard group separators for the Edit sub-menu
-     * 
-     * @param menu
-     */
-    public static final void addStandardEditActionGroups(IMenuManager menu)
-    {
-        menu.add(new Separator(GROUP_UNDO));
-        menu.add(new Separator(GROUP_EDIT));
-    }
-   
-	/**
-	 * Adds standard group separators to the given MenuManager.
-	 * 
-	 * @param menu the MenuManager
-	 */
-	public static final void addStandardActionGroups(IMenuManager menu) {
-		menu.add(new Separator(GROUP_CONTAINER));
-		menu.add(new Separator(GROUP_SPECIAL));
-		menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-	}
-
-    /**
-     * Add standard group separators for the Style sub-menu
-     * @param menu
-     */
-    public static void addStandardStyleActionGroups(IMenuManager menu) 
-    {
-        menu.add(new Separator(GROUP_STYLE));
-    }
-
-    /**
-     * Add standard group separators for the Select sub-menu
-     * @param menu
-     */
-    public static void addStandardSelectActionGroups(IMenuManager menu) {
-        menu.add(new Separator(GROUP_SELECT));
-    }
-
-    /**
-     * Add standard group separators for the Insert sub-menu
-     * @param menu
-     */
-    public static void addStandardInsertActionGroups(IMenuManager menu) {
-        menu.add(new Separator(GROUP_INSERT));
-    }
-
-    /**
-     * Add standard group separators for the Navigate sub-menu
-     * @param menu
-     */
-    public static void addStandardNavigateActionGroups(
-            IMenuManager menu) {
-        menu.add(new Separator(GROUP_NAVIGATE));
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/SelectionSynchronizer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/SelectionSynchronizer.java
deleted file mode 100644
index 33025aa..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/SelectionSynchronizer.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors;
-
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jst.pagedesigner.utils.SelectionHelper;
-import org.eclipse.swt.custom.StyledText;
-
-/**
- * This class handles selection synchronization between the designer and other
- * parts. It listens event from both ViewerSelectionManager and the
- * IDesignerView, and convert the events to each other.
- * <p>
- * SelectionSynchronizer will be registered on the ViewerSelectionManager,
- * basically listens to selection change of other parts, and make the designer
- * sync with them.
- * <p>
- * As ViewerSelectionManager is firing out both textSelectionChange and
- * nodeSelectionChange, we only need to listen to one of them. As
- * textSelectionChange provide more information than nodeSelectionChange, so
- * we'll listen only to textSelectionChange.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class SelectionSynchronizer implements ISelectionChangedListener {
-	private boolean _firingChange = false;
-
-	private SimpleGraphicalEditor _editor;
-
-	/**
-	 * @param editor
-	 */
-	public SelectionSynchronizer(SimpleGraphicalEditor editor) {
-		_editor = editor;
-	}
-
-	/**
-	 * @return true if the status check is okay
-	 */
-	protected boolean statusCheckOk() {
-		try {
-			StyledText text = _editor.getHTMLEditor().getTextEditor()
-					.getTextViewer().getTextWidget();
-			if (text == null || text.isDisposed()) {
-				return false;
-			}
-			return true;
-		} catch (NullPointerException ex) {
-			return false;
-		}
-	}
-
-	/**
-	 * This is for event from the designer.
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		ISelection selection = event.getSelection();
-
-		if (!_firingChange) {
-			// check current status
-			if (!statusCheckOk()) {
-				return;
-			}
-
-			_firingChange = true;
-			try {
-				// convert the designer selection into SSE selection
-				// (IStructureSelection of nodes
-				// or textSelection, and let the ViewerSelectionManager to
-				// handle it.
-				// if (selection instanceof IStructuredSelection)
-				// {
-				// IStructuredSelection nodeSel =
-				// SelectionHelper.convertFromDesignSelection((IStructuredSelection)selection);
-				// can't use DoubleClickEvent, since it requre a Viewer.
-				// _viewerSelectionManager.doubleClick(new
-				// DoubleClickEvent(null, nodeSel));
-				// }
-				// else if (selection instanceof DesignRange)
-				// {
-				// ITextSelection srcselection =
-				// SelectionHelper.convertFromDesignSelection((DesignRange)selection);
-				// event = new SelectionChangedEvent(_editor.getGraphicViewer(),
-				// srcselection);
-				// _viewerSelectionManager.selectionChanged(event);
-				// }
-				ITextSelection srcselection = SelectionHelper
-						.convertFromDesignSelectionToTextSelection(selection);
-
-				// ideally, we should let the text editor display the selection
-				// through calls to _viewerSelectionManager,
-				// but seemed _viewerSelectionManager don't support that, so we
-				// do workaround by calling the text editor (lium)
-				_editor.getHTMLEditor().getTextEditor().selectAndReveal(
-						srcselection.getOffset(), srcselection.getLength());
-			} finally {
-				_firingChange = false;
-			}
-		}
-	}
-
-	/**
-	 * We are listening to the selection change in ViewerSelectionManager. The
-	 * original source of the event could be source view or the outline view or
-	 * other party that participate in the ViewerSelectionManager.
-	 * @param start 
-	 * @param end 
-	 */
-	public void textSelectionChanged(int start, int end) {
-		if (!_firingChange) {
-			try {
-				_firingChange = true;
-
-				// XXX: workaround a SSE problem. In SSE, when user select a
-				// range, it will fire two textSelectionChange event
-				// the first one indicate the correct range, the second one is
-				// zero size for caret position.
-				// @see ViewerSelectionManagerImpl.caretMoved
-				// We try to ignore the second event by checking whether the
-				// current real selection is empty
-				if (start == end) {
-					ITextSelection sel = (ITextSelection) _editor
-							.getHTMLEditor().getTextEditor()
-							.getSelectionProvider().getSelection();
-					if (sel.getLength() != 0) {
-						return;
-					}
-				}
-
-				if (start > end) {
-					int temp = start;
-					start = end;
-					end = temp;
-				}
-				int offset = start;
-				int length = end - start;
-
-				ITextSelection oldSelection = SelectionHelper
-						.convertFromDesignSelectionToTextSelection(_editor
-								.getGraphicViewer().getSelection());
-				if (oldSelection != null && oldSelection.getOffset() == offset
-						&& oldSelection.getLength() == length) {
-					return;
-				}
-
-				ISelection selection = SelectionHelper
-						.convertToDesignerSelection(this._editor
-								.getGraphicViewer(), offset, length);
-				_editor.getGraphicViewer().setSelection(selection);
-			} finally {
-				_firingChange = false;
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/SimpleGraphicalEditor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/SimpleGraphicalEditor.java
deleted file mode 100644
index 4c2c043..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/SimpleGraphicalEditor.java
+++ /dev/null
@@ -1,742 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.gef.DefaultEditDomain;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.gef.editparts.ScalableRootEditPart;
-import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.gef.ui.actions.ActionRegistry;
-import org.eclipse.gef.ui.actions.UpdateAction;
-import org.eclipse.gef.ui.palette.PaletteViewer;
-import org.eclipse.gef.ui.palette.PaletteViewerProvider;
-import org.eclipse.gef.ui.palette.FlyoutPaletteComposite.FlyoutPreferences;
-import org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette;
-import org.eclipse.gef.ui.parts.GraphicalViewerKeyHandler;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.actions.container.ContainerActionGroup;
-import org.eclipse.jst.pagedesigner.actions.menuextension.CustomedContextMenuActionGroup;
-import org.eclipse.jst.pagedesigner.actions.range.RangeActionGroup;
-import org.eclipse.jst.pagedesigner.actions.single.SingleElementActionGroup;
-import org.eclipse.jst.pagedesigner.commands.CopyAction;
-import org.eclipse.jst.pagedesigner.commands.CutAction;
-import org.eclipse.jst.pagedesigner.commands.DeleteAction;
-import org.eclipse.jst.pagedesigner.commands.PasteAction;
-import org.eclipse.jst.pagedesigner.dnd.internal.DesignerTemplateTransferDragSourceListener;
-import org.eclipse.jst.pagedesigner.dnd.internal.LocalSelectionDropTargetListener;
-import org.eclipse.jst.pagedesigner.dnd.internal.PDTemplateTransferDropTargetListener;
-import org.eclipse.jst.pagedesigner.dnd.internal.ResouceDropTargetListener;
-import org.eclipse.jst.pagedesigner.editors.actions.ActionsMessages;
-import org.eclipse.jst.pagedesigner.editors.actions.DesignerUndoRedoAction;
-import org.eclipse.jst.pagedesigner.editors.actions.RelatedViewActionGroup;
-import org.eclipse.jst.pagedesigner.editors.palette.DesignerPaletteCustomizer;
-import org.eclipse.jst.pagedesigner.editors.palette.DesignerPaletteRootFactory;
-import org.eclipse.jst.pagedesigner.editors.palette.DesignerPaletteViewerProvider;
-import org.eclipse.jst.pagedesigner.jsp.core.internal.pagevar.DocumentPageVariableAdapter;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter.PageVariableAdapterFactory;
-import org.eclipse.jst.pagedesigner.parts.CSSStyleAdapterFactory;
-import org.eclipse.jst.pagedesigner.parts.DocumentEditPart;
-import org.eclipse.jst.pagedesigner.parts.HTMLEditPartsFactory;
-import org.eclipse.jst.pagedesigner.parts.RefresherFactory;
-import org.eclipse.jst.pagedesigner.utils.SelectionHelper;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IPageLayout;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.actions.ActionContext;
-import org.eclipse.ui.texteditor.IWorkbenchActionDefinitionIds;
-import org.eclipse.wst.sse.core.internal.PropagatingAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.IModelStateListener;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapterFactory;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.undo.IDocumentSelectionMediator;
-import org.eclipse.wst.sse.core.internal.undo.UndoDocumentEvent;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-
-/**
- * @author mengbo
- */
-public class SimpleGraphicalEditor extends GraphicalEditorWithFlyoutPalette implements
-		IDesignViewer, IDocumentSelectionMediator {
-
-    private HTMLEditor _delegate;
-
-	private IHTMLGraphicalViewer _viewer;
-
-	private IStructuredModel _model;
-
-	/** Palette component, holding the tools and shapes. */
-	private PaletteRoot _palette;
-
-	private SelectionSynchronizer _synchronizer = new SelectionSynchronizer(
-			this);
-
-	private IModelStateListener _internalModelListener = new IModelStateListener() {
-		public void modelAboutToBeChanged(IStructuredModel model) {
-            // do nothing
-		}
-
-		public void modelChanged(IStructuredModel model) {
-			updateActionsWhenModelChange();
-		}
-
-		public void modelDirtyStateChanged(IStructuredModel model,
-				boolean isDirty) {
-            // do nothing
-		}
-
-		public void modelResourceDeleted(IStructuredModel model) {
-            // do nothing
-		}
-
-		public void modelResourceMoved(IStructuredModel oldModel,
-				IStructuredModel newModel) {
-            // do nothing
-		}
-
-		public void modelAboutToBeReinitialized(IStructuredModel structuredModel) {
-            // do nothing
-		}
-
-		public void modelReinitialized(IStructuredModel structuredModel) {
-            // do nothing
-		}
-	};
-
-	/**
-	 * @param delegate
-	 * @param editdomain
-	 */
-	public SimpleGraphicalEditor(HTMLEditor delegate,
-			DefaultEditDomain editdomain) {
-		_delegate = delegate;
-		this.setEditDomain(editdomain);
-	}
-
-	protected void createGraphicalViewer(Composite parent) {
-		_viewer = IHTMLGraphicalViewer.Factory.createGraphicalViewer(this);
-		Control control = _viewer.createControl(parent);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(control,
-				PDPlugin.getResourceString("SimpleGraphicalEditor.help.id"));
-		setGraphicalViewer(_viewer);
-		configureGraphicalViewer();
-		hookGraphicalViewer();
-		initializeGraphicalViewer();
-		initializeContextMenu();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.GraphicalEditor#dispose()
-	 */
-	public void dispose() {
-		if (_model != null) {
-			_model.getUndoManager().disconnect(this);
-		}
-
-		super.dispose();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.GraphicalEditor#initializeGraphicalViewer()
-	 */
-	protected void initializeGraphicalViewer() {
-		ScalableRootEditPart rootEditPart = new ScalableRootEditPart();
-		_viewer.setRootEditPart(rootEditPart);
-
-		_viewer.getViewport().setContentsTracksWidth(true);
-
-		_viewer.setKeyHandler(new GraphicalViewerKeyHandler(_viewer));
-
-		// initialize the viewer with input
-		// IStructuredModel sModel =
-		// StructuredModelManager.getModelManager().createUnManagedStructuredModelFor(ContentTypeIdForHTML.ContentTypeID_HTML);
-		// IDOMDocument designDoc = ((IDOMModel)sModel).getDocument();
-		// HTMLEditPartsFactory factory = new HTMLEditPartsFactory(designDoc);
-		HTMLEditPartsFactory factory = new HTMLEditPartsFactory(null);
-
-		_viewer.setEditPartFactory(factory);
-
-		// for sync with source view.
-
-		_viewer.addDropTargetListener(new LocalSelectionDropTargetListener(
-				_viewer));
-		_viewer.addDropTargetListener(new PDTemplateTransferDropTargetListener(
-				_viewer));
-		_viewer.addDropTargetListener(new ResouceDropTargetListener(_viewer));
-
-		// add double click support.
-		_viewer.getControl().addMouseListener(new MouseAdapter() {
-			public void mouseDoubleClick(MouseEvent e) {
-				try {
-					getSite().getPage().showView(IPageLayout.ID_PROP_SHEET);
-				} catch (PartInitException e1) {
-					// ignore
-				}
-			}
-		});
-        
-        super.initializeGraphicalViewer();
-	}
-
-	/**
-	 * 
-	 */
-	protected void initializeContextMenu() {
-		Control gviewer = _viewer.getControl();
-		MenuManager menuMgr = new MenuManager();
-		menuMgr.setRemoveAllWhenShown(true);
-		Menu menu = menuMgr.createContextMenu(gviewer);
-		gviewer.setMenu(menu);
-		menuMgr.addMenuListener(new ContextMenuListener());
-		getSite().registerContextMenu(
-				"HTMLVisualEditor.contextMenu", menuMgr, _viewer); //$NON-NLS-1$
-	}
-
-	private void updateActionsWhenModelChange() {
-		// update undo/redo action
-		IAction action = this.getAction(IWorkbenchActionDefinitionIds.UNDO);
-		((UpdateAction) action).update();
-
-		action = this.getAction(IWorkbenchActionDefinitionIds.REDO);
-		((UpdateAction) action).update();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.GraphicalEditor#createActions()
-	 */
-	protected void createActions() {
-		super.createActions();
-		ActionRegistry registry = getActionRegistry();
-		ISharedImages sharedImages = PlatformUI.getWorkbench()
-				.getSharedImages();
-
-		IAction action;
-
-		action = new DesignerUndoRedoAction(true, this);
-		action.setImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_UNDO));
-		action.setDisabledImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_UNDO_DISABLED));
-		action.setActionDefinitionId(IWorkbenchActionDefinitionIds.UNDO);
-		action.setId(IWorkbenchActionDefinitionIds.UNDO);
-		getSite().getKeyBindingService().registerAction(action);
-		registry.registerAction(action);
-
-		action = new DesignerUndoRedoAction(false, this);
-		action.setImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_REDO));
-		action.setDisabledImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_REDO_DISABLED));
-		action.setActionDefinitionId(IWorkbenchActionDefinitionIds.REDO);
-		action.setId(IWorkbenchActionDefinitionIds.REDO);
-		getSite().getKeyBindingService().registerAction(action);
-		registry.registerAction(action);
-
-		action = new DeleteAction(this);
-		action.setImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_DELETE));
-		action.setDisabledImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_DELETE_DISABLED));
-		action.setActionDefinitionId(IWorkbenchActionDefinitionIds.DELETE);
-		action.setId(IWorkbenchActionDefinitionIds.DELETE);
-		getSite().getKeyBindingService().registerAction(action);
-		this.getSelectionActions().add(action.getId());
-		registry.registerAction(action);
-
-		action = new CopyAction(this);
-		action.setImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_COPY));
-		action.setDisabledImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_COPY_DISABLED));
-		action.setActionDefinitionId(IWorkbenchActionDefinitionIds.COPY);
-		action.setId(IWorkbenchActionDefinitionIds.COPY);
-		getSite().getKeyBindingService().registerAction(action);
-		this.getSelectionActions().add(action.getId());
-		registry.registerAction(action);
-
-		action = new CutAction(this);
-		action.setImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_CUT));
-		action.setDisabledImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_CUT_DISABLED));
-		action.setActionDefinitionId(IWorkbenchActionDefinitionIds.CUT);
-		action.setId(IWorkbenchActionDefinitionIds.CUT);
-		getSite().getKeyBindingService().registerAction(action);
-		this.getSelectionActions().add(action.getId());
-		registry.registerAction(action);
-
-		action = new PasteAction(this);
-		action.setImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_PASTE));
-		action.setDisabledImageDescriptor(sharedImages
-				.getImageDescriptor(ISharedImages.IMG_TOOL_PASTE_DISABLED));
-		action.setActionDefinitionId(IWorkbenchActionDefinitionIds.PASTE);
-		action.setId(IWorkbenchActionDefinitionIds.PASTE);
-		getSite().getKeyBindingService().registerAction(action);
-		this.getSelectionActions().add(action.getId());
-		registry.registerAction(action);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ISaveablePart#doSave(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void doSave(IProgressMonitor monitor) {
-		if (_delegate != null) {
-			_delegate.doSave(monitor);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ISaveablePart#doSaveAs()
-	 */
-	public void doSaveAs() {
-		if (_delegate != null) {
-			_delegate.doSaveAs();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ISaveablePart#isDirty()
-	 */
-	public boolean isDirty() {
-		if (_delegate != null) {
-			return _delegate.isDirty();
-		}
-        return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ISaveablePart#isSaveAsAllowed()
-	 */
-	public boolean isSaveAsAllowed() {
-		if (_delegate != null) {
-			return _delegate.isSaveAsAllowed();
-		}
-        return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.html.editor.IDesignViewer#setModel(com.ibm.sse.model.IStructuredModel)
-	 */
-	public void setModel(IStructuredModel model) {
-		if (_model != null) {
-			if (_model.getUndoManager() != null)
-				_model.getUndoManager().disconnect(this);
-			_model.removeModelStateListener(_internalModelListener);
-		}
-
-		this._model = model;
-
-		if (_model != null) {
-			_model.addModelStateListener(_internalModelListener);
-			if (_model.getUndoManager() != null) {
-				_model.getUndoManager().connect(this);
-				updateActionsWhenModelChange();
-			}
-		}
-
-		if (model instanceof IDOMModel) {
-			IDOMDocument doc = ((IDOMModel) model).getDocument();
-			PropagatingAdapter adapter = (PropagatingAdapter) doc
-					.getAdapterFor(PropagatingAdapter.class);
-			if (adapter != null) {
-				INodeAdapterFactory factory = RefresherFactory.getInstance();
-				adapter.addAdaptOnCreateFactory(factory);
-				adapter.initializeForFactory(factory, doc);
-				// CSSStyleAdapterFactory fac2 =
-				// CSSStyleAdapterFactory.getInstance();
-				// adapter.addAdaptOnCreateFactory(fac2);
-				// adapter.initializeForFactory(fac2, doc);
-			}
-			((IDOMModel) model).getFactoryRegistry().addFactory(
-					CSSStyleAdapterFactory.getInstance());
-
-			// _viewer.getDestDocumentForDesign().getModel().getFactoryRegistry().addFactory(CSSStyleAdapterFactory.getInstance());
-			((IDOMModel) model).getFactoryRegistry().addFactory(
-					new PageVariableAdapterFactory());
-			doc.addAdapter(new DocumentPageVariableAdapter(doc));
-			_viewer.setContents(((IDOMModel) model).getDocument());
-		} else {
-			_viewer.setContents((EditPart) null);
-		}
-	}
-
-	/**
-	 * @return the selection synchronizer
-	 */
-	protected SelectionSynchronizer getSynchronizer() {
-		return _synchronizer;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.GraphicalEditor#updateActions(java.util.List)
-	 */
-	protected void updateActions(List actionIds) {
-		super.updateActions(actionIds);
-	}
-
-	/**
-	 * @param id
-	 * @return the action for the id
-	 */
-	public IAction getAction(Object id) {
-		// lium: following lines commented out, see comments in
-		// DesignerUndoRedoAction
-		// if (ITextEditorActionConstants.UNDO.equals(id) ||
-		// ITextEditorActionConstants.REDO.equals(id))
-		// {
-		// return _delegate.getTextEditor().getAction((String) id);
-		// }
-		return getActionRegistry().getAction(id);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette#getPalettePreferences()
-	 */
-	protected FlyoutPreferences getPalettePreferences() {
-		return DesignerPaletteRootFactory.createPalettePreferences();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette#getPaletteRoot()
-	 */
-	protected PaletteRoot getPaletteRoot() {
-		if (_palette == null) {
-			_palette = DesignerPaletteRootFactory
-					.createPaletteRoot(getCurrentProject(_delegate.getEditorInput()));
-		}
-		return _palette;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette#createPaletteViewerProvider()
-	 */
-	protected PaletteViewerProvider createPaletteViewerProvider() {
-		return new DesignerPaletteViewerProvider(getEditDomain()) {
-			protected void configurePaletteViewer(PaletteViewer viewer) {
-				super.configurePaletteViewer(viewer);
-				viewer.setCustomizer(new DesignerPaletteCustomizer());
-
-				// create a drag source listener for this palette viewer
-				// together with an appropriate transfer drop target listener,
-				// this will enable
-				// model element creation by dragging a
-				// CombinatedTemplateCreationEntries
-				// from the palette into the editor
-				// @see ShapesEditor#createTransferDropTargetListener()
-				viewer
-						.addDragSourceListener(new DesignerTemplateTransferDragSourceListener(
-								viewer));
-			}
-		};
-	}
-
-    PaletteViewerProvider getPaletteViewerProvider2()
-    {
-        return getPaletteViewerProvider();
-    }
-    
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editors.IDesignViewer#getGraphicViewer()
-	 */
-	public IHTMLGraphicalViewer getGraphicViewer() {
-		return _viewer;
-	}
-
-	/**
-	 * @return the html editor delegate
-	 */
-	public HTMLEditor getHTMLEditor() {
-		return _delegate;
-	}
-
-	private IProject getCurrentProject(IEditorInput input) {
-		IProject curProject = null;
-		IFile inputFile = null;
-		if (input instanceof IFileEditorInput) {
-			inputFile = ((IFileEditorInput) input).getFile();
-			curProject = inputFile.getProject();
-		}
-		return curProject;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart,
-	 *      org.eclipse.jface.viewers.ISelection)
-	 */
-	public void selectionChanged(IWorkbenchPart part, ISelection selection) {
-		if (_viewer != null) {
-			GraphicalViewer viewerViewer = getGraphicalViewer();
-			if (viewerViewer != null && viewerViewer.getControl() != null
-					&& viewerViewer.getControl().isFocusControl()) {
-				updateActions(getSelectionActions());
-				if (selection instanceof IStructuredSelection && //
-						!(((IStructuredSelection) selection).getFirstElement() instanceof DocumentEditPart)) {
-					((IHTMLGraphicalViewer) viewerViewer)
-							.updateRangeSelection(selection);
-				}
-			}
-		} else {
-			super.selectionChanged(part, selection);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.undo.IDocumentSelectionMediator#getDocument()
-	 */
-	public IDocument getDocument() {
-		if (_model != null) {
-			return _model.getStructuredDocument();
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.undo.IDocumentSelectionMediator#undoOperationSelectionChanged(org.eclipse.wst.sse.core.internal.undo.UndoDocumentEvent)
-	 */
-	public void undoOperationSelectionChanged(UndoDocumentEvent event) {
-		IDocumentSelectionMediator requester = event.getRequester();
-		if (this == requester) {
-			// ok, the undo/redo operation is initialized by designer page.
-			// we should set selection in designer.
-			// However, when this method is called, the modelChanged event is
-			// not fired yet, so the
-			// editpart hasn't refreshed yet. So we register a
-			// modelStateListener, and do the selection
-			// in modelChangedEvent. (lium)
-			final int offset = event.getOffset();
-			final int length = event.getLength();
-
-			_model.addModelStateListener(new IModelStateListener() {
-				public void modelAboutToBeChanged(IStructuredModel model) {
-                    // nothing to do
-				}
-
-				public void modelChanged(IStructuredModel model) {
-					_model.removeModelStateListener(this);
-					ISelection sel = SelectionHelper
-							.convertToDesignerSelection(getGraphicViewer(),
-									offset, length);
-					if (sel != null) {
-						getGraphicViewer().setSelection(sel);
-					}
-				}
-
-				public void modelDirtyStateChanged(IStructuredModel model,
-						boolean isDirty) {
-                    // do  nothing
-				}
-
-				public void modelResourceDeleted(IStructuredModel model) {
-                    // do nothign
-				}
-
-				public void modelResourceMoved(IStructuredModel oldModel,
-						IStructuredModel newModel) {
-                    // do nothing
-				}
-
-				public void modelAboutToBeReinitialized(
-						IStructuredModel structuredModel) {
-                    // do nothing
-				}
-
-				public void modelReinitialized(IStructuredModel structuredModel) {
-                    // do nothing
-				}
-			});
-		}
-	}
- 
-    private final class ContextMenuListener implements IMenuListener 
-    {
-        public void menuAboutToShow(IMenuManager menuMgr1) 
-        {
-            // add standarized sub-menus
-            addEditSubMenu(menuMgr1);
-            addSelectSubMenu(menuMgr1);
-            addInsertSubMenu(menuMgr1);
-            addNavigateSubMenu(menuMgr1);
-            addStyleSubMenu(menuMgr1);
-            
-            // add separators that mark standard append locations in the main
-            // context menu
-            PageDesignerActionConstants.addStandardActionGroups(menuMgr1);
-
-            // TODO: Run/Debug?
-            
-            // insert ElementEdit contributed menu items
-            final ContainerActionGroup containerActionGroup = 
-                new ContainerActionGroup();
-            ActionContext context = new ActionContext(_viewer
-                    .getSelection());
-            context.setInput(_viewer);
-            containerActionGroup.setContext(context);
-            containerActionGroup.fillContextMenu(menuMgr1);
-            containerActionGroup.setContext(null);
-
-            // TODO: TableActionGroup
-
-            // if on a text context, (instead of a ElementEditPart),
-            // add text styling actions
-            final RangeActionGroup rangeActionGroup = new RangeActionGroup();
-            context = new ActionContext(_viewer.getSelection());
-            context.setInput(_viewer);
-            rangeActionGroup.setContext(context);
-            rangeActionGroup.fillContextMenu(menuMgr1);
-            rangeActionGroup.setContext(null);
-
-            // Add actions for single ElementEditPart's that are common
-            // to all
-            final SingleElementActionGroup singleActionGroup = 
-                new SingleElementActionGroup();
-            singleActionGroup.setContext(new ActionContext(_viewer
-                    .getSelection()));
-            singleActionGroup.fillContextMenu(menuMgr1);
-            singleActionGroup.setContext(null);
-
-            // add "Show In" actions...
-            final RelatedViewActionGroup viewMenu = new RelatedViewActionGroup(getEditDomain());
-            context = new ActionContext(_viewer.getSelection());
-            viewMenu.setContext(context);
-            viewMenu.fillContextMenu(menuMgr1);
-
-            // add extension point contributed menu actions
-            CustomedContextMenuActionGroup customedMenu = new CustomedContextMenuActionGroup();
-            customedMenu.setContext(new ActionContext(_viewer
-                    .getSelection()));
-            customedMenu.setModel(_model);
-            customedMenu.setParentControl(_viewer.getControl());
-            customedMenu.fillContextMenu(menuMgr1);
-            customedMenu.setContext(null);
-            customedMenu.setParentControl(null);
-            customedMenu.setModel(null);
-        }
-        
-        private void addNavigateSubMenu(IMenuManager menu) {
-            final IMenuManager  navigateSubmenu = 
-                new MenuManager(ActionsMessages.getString("Navigate.Menu")  //$NON-NLS-1$
-                        , PageDesignerActionConstants.NAVIGATE_SUBMENU_ID);
-            menu.add(navigateSubmenu);
-            PageDesignerActionConstants.addStandardNavigateActionGroups(navigateSubmenu);
-        }
-
-        private void addEditSubMenu(IMenuManager menu)
-        {
-            final IMenuManager  editSubmenu 
-                = new MenuManager(ActionsMessages.getString("Edit.Menu")  //$NON-NLS-1$
-                        , PageDesignerActionConstants.EDIT_SUBMENU_ID);
-            menu.add(editSubmenu);
-            PageDesignerActionConstants.addStandardEditActionGroups(editSubmenu);
-            
-            // FIXME: for UNDO/REDO, maybe need also wrap them in
-            // DesignerCommand.
-            // otherwise don't have validate() called after the source
-            // change.
-            editSubmenu.appendToGroup(PageDesignerActionConstants.GROUP_UNDO,
-                    getAction(IWorkbenchActionDefinitionIds.UNDO));
-            editSubmenu.appendToGroup(PageDesignerActionConstants.GROUP_UNDO,
-                    getAction(IWorkbenchActionDefinitionIds.REDO));
-
-            editSubmenu.appendToGroup(PageDesignerActionConstants.GROUP_EDIT,
-                    getAction(IWorkbenchActionDefinitionIds.CUT));
-            editSubmenu.appendToGroup(PageDesignerActionConstants.GROUP_EDIT,
-                    getAction(IWorkbenchActionDefinitionIds.COPY));
-            editSubmenu.appendToGroup(PageDesignerActionConstants.GROUP_EDIT,
-                    getAction(IWorkbenchActionDefinitionIds.PASTE));
-            editSubmenu.appendToGroup(PageDesignerActionConstants.GROUP_EDIT,
-                    getAction(IWorkbenchActionDefinitionIds.DELETE));
-
-        }
-        
-        private void addStyleSubMenu(IMenuManager menu)
-        {
-            final IMenuManager  styleSubmenu = 
-                new MenuManager(ActionsMessages.getString("Style.Menu")  //$NON-NLS-1$
-                        , PageDesignerActionConstants.STYLE_SUBMENU_ID);
-            menu.add(styleSubmenu);
-            PageDesignerActionConstants.addStandardStyleActionGroups(styleSubmenu);
-        }
-        private void addInsertSubMenu(IMenuManager menu) {
-            final IMenuManager  insertSubmenu = 
-                new MenuManager(ActionsMessages.getString("Insert.Menu")  //$NON-NLS-1$
-                        , PageDesignerActionConstants.INSERT_SUBMENU_ID);
-            menu.add(insertSubmenu);
-            PageDesignerActionConstants.addStandardInsertActionGroups(insertSubmenu);
-        }
-        
-        private void addSelectSubMenu(IMenuManager menu)
-        {
-            final IMenuManager  selectSubMenu = 
-                new MenuManager(ActionsMessages.getString("Select.Menu")  //$NON-NLS-1$
-                        , PageDesignerActionConstants.SELECT_SUBMENU_ID);
-            menu.add(selectSubMenu);
-            PageDesignerActionConstants.addStandardSelectActionGroups(selectSubMenu);
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ActionsMessages.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ActionsMessages.java
deleted file mode 100644
index b5da948..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ActionsMessages.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ActionsMessages {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.pagedesigner.editors.actions.ActionsMessages"; //$NON-NLS-1$
-
-	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
-			.getBundle(BUNDLE_NAME);
-
-	private ActionsMessages() {
-        // no external instantiation
-	}
-
-	/**
-	 * @param key
-	 * @return the resource for the key
-	 */
-	public static String getString(String key) {
-		try {
-			return RESOURCE_BUNDLE.getString(key);
-		} catch (MissingResourceException e) {
-			return '!' + key + '!';
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ActionsMessages.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ActionsMessages.properties
deleted file mode 100644
index 6944ae3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ActionsMessages.properties
+++ /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
-###############################################################################
-DesignActionBarFactory.Underline=Underline
-DesignActionBarFactory.Italic=Italic
-DesignActionBarFactory.Bold=Bold
-DesignActionBarFactory.Small=Small
-DesignActionBarFactory.Big=Big
-DesignActionBarFactory.Paragraph=Paragraph
-DesignActionBarFactory.Underline.Text=Underline
-DesignActionBarFactory.Italic.Text=Italic
-DesignActionBarFactory.Bold.Text=Bold
-DesignActionBarFactory.Small.Text=Small
-DesignActionBarFactory.Big.Text=Big
-PaletteViewAction.Menu.PaletteView=Palette
-RelatedViewActionGroup.Menu.ShowView=Show
-PropertiesViewAction.Menu.Properties=Properties
-DataBindingViewAction.Menu.DataBinding=DataBinding
-OutlineViewAction.Menu.OutlineView=Outline
-DesignerStyleActionGroup.CommandLabel.V=V
-DesignerStyleActionGroup.CommandLabel.H=H
-DesignerStyleActionGroup.CommandLabel.D=D
-DesignerStyleActionGroup.CommandLabel.S=S
-DesignerStyleActionGroup.CommandLabel.V.Tooltip=Show Design Page and Source Page as Horizontal Panes
-DesignerStyleActionGroup.CommandLabel.H.Tooltip=Show Design Page and Source Page as Vertical Panes
-DesignerStyleActionGroup.CommandLabel.D.Tooltip=Only Show Design Page
-DesignerStyleActionGroup.CommandLabel.S.Tooltip=Only Show Source Page
-DesignerUndoRedoAction.UNDO=Undo
-DesignerUndoRedoAction.REDO=Redo
-DesignerUndoRedoAction.UNDO_LABEL=Undo {0}
-DesignerUndoRedoAction.REDO_LABEL=Redo {0}
-Select.Menu=Select
-Edit.Menu=Edit
-Navigate.Menu=Navigate
-Style.Menu=Style
-Insert.Menu=Insert
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ChangeStyleAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ChangeStyleAction.java
deleted file mode 100644
index 70e5a68..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ChangeStyleAction.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jst.pagedesigner.commands.DesignerCommand;
-import org.eclipse.jst.pagedesigner.commands.range.ApplyStyleCommand;
-import org.eclipse.jst.pagedesigner.range.RangeUtil;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.HTMLGraphicalViewerListenenerAdapter;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewerListener;
-import org.eclipse.ui.texteditor.IUpdate;
-
-/**
- * @author mengbo
- */
-public abstract class ChangeStyleAction extends Action implements IUpdate {
-	private IHTMLGraphicalViewer _viewer;
-
-	private String _expectedTag;
-
-	private IHTMLGraphicalViewerListener _listener = new HTMLGraphicalViewerListenenerAdapter() 
-	{
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewerListener#selectionChangeFinished()
-		 */
-		public void selectionChangeFinished() {
-			update();
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-		 */
-		public void selectionChanged(SelectionChangedEvent event) {
-			update();
-		}
-	};
-
-	/**
-	 * @param text
-	 * @param name 
-	 * @param image
-	 * @param style 
-	 */
-	public ChangeStyleAction(String text, String name, ImageDescriptor image,
-			int style) {
-		super(text, style);
-		_expectedTag = name;
-		this.setImageDescriptor(image);
-	}
-
-	/**
-	 * @param viewer
-	 */
-	public void setViewer(IHTMLGraphicalViewer viewer) {
-		if (viewer == _viewer) {
-			return;
-		}
-		if (_viewer != null) {
-			_viewer.removeHTMLViewerListener(_listener);
-		}
-		_viewer = viewer;
-		if (_viewer != null) {
-			_viewer.addHTMLViewerListener(_listener);
-		}
-		update();
-	}
-
-	/**
-	 * 
-	 */
-	public void update() 
-	{
-	    boolean update = checkForUpdateAndMaybeDisableState();
-	    
-	    if (update)
-	    {
-	        updateState();
-	    }
-	}
-
-   /**
-    * Update the state 
-    */
-	protected void updateState()
-    {
-       DesignRange range = _viewer.getRangeSelection();
-       updateStatus(RangeUtil.normalize(range));
-    }
-
-	/**
-	 * Update the checked/enabled state
-	 * @return true if we should update status
-	 */
-	protected final boolean checkForUpdateAndMaybeDisableState()
-	{
-        if (_viewer == null) {
-            this.setChecked(false);
-            this.setEnabled(false);
-            return false;
-        }
-        if (!_viewer.isInRangeMode()) {
-            // XXX: later we may support in range mode.
-            this.setChecked(false);
-            this.setEnabled(false);
-            return false;
-        }
-        DesignRange range = _viewer.getRangeSelection();
-        if (range == null || !range.isValid()) {
-            this.setChecked(false);
-            this.setEnabled(false);
-            return false;
-        }
-        return true;
-	}
-	
-
-	/**
-	 * @return the viewer's current design range
-	 */
-	protected final DesignRange getDesignRange()
-	{
-	    return _viewer.getRangeSelection();
-	}
-	/**
-	 * @param range
-	 */
-	private void updateStatus(DesignRange range) {
-		if (range.isEmpty()) {
-			this.setEnabled(false);
-			this.setChecked(false); // FIXME: not handling checked status yet.
-		} else {
-			this.setEnabled(true);
-			this.setChecked(false);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		if (_viewer == null || !_viewer.isInRangeMode()) {
-			return;
-		}
-		DesignRange range = _viewer.getRangeSelection();
-		if (range == null || !range.isValid()) {
-			return;
-		}
-		if (range.isEmpty())
-			return; // nothing to do to empty range.
-
-		// if currently checked, means unapply the style. If current not
-		// checked, means apply the style
-		boolean apply = !this.isChecked();
-		if (apply) {
-			applyStyle();
-		} else {
-			// not supported yet.
-		}
-	}
-
-	/**
-	 * 
-	 */
-	private void applyStyle() {
-		DesignerCommand command = new ApplyStyleCommand(_viewer,
-				getExpectedTag(), getExpectedCSSProperty(),
-				getExpectedCSSPropertyValue());
-		command.execute();
-	}
-
-	/**
-	 * @return  the expected property value
-	 */
-	protected abstract String getExpectedCSSPropertyValue();
-
-	/**
-	 * @return  the expected property
-	 */
-	protected abstract String getExpectedCSSProperty();
-
-	/**
-	 * @return the expected tag
-	 */
-	protected String getExpectedTag() {
-		return _expectedTag;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DataBindingViewAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DataBindingViewAction.java
deleted file mode 100644
index 17fb7d7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DataBindingViewAction.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DataBindingViewAction extends Action {
-
-	private static Logger _log = PDPlugin
-			.getLogger(DataBindingViewAction.class);
-
-	/**
-	 * Default constructor
-	 */
-	public DataBindingViewAction() {
-		setText(ActionsMessages
-				.getString("DataBindingViewAction.Menu.DataBinding")); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		try {
-			getPage().showView(
-					"org.eclipse.jst.pagedesigner.databinding.ui.views.DataBindingsView");//$NON-NLS-1$
-		} catch (PartInitException e) {
-			_log.error("Error opening the DataBindingView");
-		}
-	}
-
-	private IWorkbenchPage getPage() {
-		IWorkbench workbench = PlatformUI.getWorkbench();
-		IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
-		return window.getActivePage();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignActionBarFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignActionBarFactory.java
deleted file mode 100644
index 0b9971f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignActionBarFactory.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.actions.range.ChangeStyleAction;
-import org.eclipse.jst.pagedesigner.actions.range.DesignerToolBarAction;
-import org.eclipse.jst.pagedesigner.actions.range.HTagsInsertGroupAction;
-
-/**
- * @author mengbo
- */
-public class DesignActionBarFactory {
-	private static DesignActionBarFactory _instance;
-
-	private DesignActionBarFactory() {
-        // no external instantiation
-	}
-
-	/**
-	 * @return get the factory singleton
-	 */
-	public static DesignActionBarFactory getInstance() {
-		if (_instance == null) {
-			_instance = new DesignActionBarFactory();
-		}
-		return _instance;
-	}
-
-	/**
-	 * @param name
-	 * @return the tool bar action
-	 */
-	public DesignerToolBarAction getStyleAction(String name) {
-		DesignerToolBarAction action = null;
-
-		if (name.equals(IHTMLConstants.TAG_U)) {
-			action = new ChangeStyleAction(ActionsMessages
-					.getString("DesignActionBarFactory.Underline.Text"), name,
-					PDPlugin.getDefault().getImageDescriptor(
-							"PD_Toolbar_underline.gif"), PDPlugin.getDefault()
-							.getImageDescriptor(
-									"PD_Toolbar_underline_disabled.gif"),
-					IAction.AS_CHECK_BOX);
-			action.setToolTipText(ActionsMessages
-					.getString("DesignActionBarFactory.Underline"));
-		} else if (name.equals(IHTMLConstants.TAG_I)) {
-			action = new ChangeStyleAction(ActionsMessages
-					.getString("DesignActionBarFactory.Italic.Text"), name,
-					PDPlugin.getDefault().getImageDescriptor(
-							"PD_Toolbar_italic.gif"), PDPlugin.getDefault()
-							.getImageDescriptor(
-									"PD_Toolbar_italic_disabled.gif"),
-					IAction.AS_CHECK_BOX);
-			action.setToolTipText(ActionsMessages
-					.getString("DesignActionBarFactory.Italic"));
-		} else if (name.equals(IHTMLConstants.TAG_B)) {
-			action = new ChangeStyleAction(ActionsMessages
-					.getString("DesignActionBarFactory.Bold.Text"), name,
-					PDPlugin.getDefault().getImageDescriptor(
-							"PD_Toolbar_bold.gif"),
-					PDPlugin.getDefault().getImageDescriptor(
-							"PD_Toolbar_bold_disabled.gif"),
-					IAction.AS_CHECK_BOX);
-			action.setToolTipText(ActionsMessages
-					.getString("DesignActionBarFactory.Bold"));
-		} else if (name.equals(IHTMLConstants.TAG_SMALL)) {
-			action = new ChangeStyleAction(ActionsMessages
-					.getString("DesignActionBarFactory.Small.Text"), name,
-					PDPlugin.getDefault().getImageDescriptor(
-							"PD_Toolbar_smallfont.gif"), PDPlugin.getDefault()
-							.getImageDescriptor(
-									"PD_Toolbar_smallfont_disabled.gif"),
-					IAction.AS_CHECK_BOX);
-			action.setToolTipText(ActionsMessages
-					.getString("DesignActionBarFactory.Small"));
-		} else if (name.equals(IHTMLConstants.TAG_BIG)) {
-			action = new ChangeStyleAction(ActionsMessages
-					.getString("DesignActionBarFactory.Big.Text"), name,
-					PDPlugin.getDefault().getImageDescriptor(
-							"PD_Toolbar_largefont.gif"), PDPlugin.getDefault()
-							.getImageDescriptor(
-									"PD_Toolbar_largefont_disabled.gif"),
-					IAction.AS_CHECK_BOX);
-			action.setToolTipText(ActionsMessages
-					.getString("DesignActionBarFactory.Big"));
-		} else if (name
-				.equalsIgnoreCase(DesignPageActionContributor.PARAGRAPH_ACTION_ID)) {
-			action = new HTagsInsertGroupAction(PDPlugin.getDefault()
-					.getImageDescriptor("PD_Toolbar_paragraph.gif"),
-					IAction.AS_DROP_DOWN_MENU);
-			action.setToolTipText(ActionsMessages
-					.getString("DesignActionBarFactory.Paragraph"));
-		}
-
-		return action;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignPageActionContributor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignPageActionContributor.java
deleted file mode 100644
index 131ec1b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignPageActionContributor.java
+++ /dev/null
@@ -1,234 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IContributionManager;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.actions.range.DesignerToolBarAction;
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.jst.pagedesigner.editors.SimpleGraphicalEditor;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPartSite;
-import org.eclipse.ui.part.EditorActionBarContributor;
-import org.eclipse.ui.texteditor.ITextEditorActionConstants;
-import org.eclipse.ui.texteditor.IWorkbenchActionDefinitionIds;
-
-/**
- * sub action contributor for the designer page.
- * 
- * @author mengbo
- */
-public class DesignPageActionContributor extends EditorActionBarContributor {
-	private static final Logger _log = PDPlugin
-			.getLogger(DesignPageActionContributor.class);
-
-	/**
-	 * paragraph
-	 */
-	public static final String PARAGRAPH_ACTION_ID = "paragraph";
-
-	private IEditorPart _editorPart;
-
-	/**
-	 * @param manager
-	 * @param id
-	 */
-	protected void doRemove(IContributionManager manager, String id) {
-		try {
-			if (manager.find(id) != null) {
-				manager.remove(id);
-			}
-		} catch (Exception e) {
-			_log.info("Error:", e);
-		}
-	}
-
-	public void init(IActionBars bars, IWorkbenchPage page) {
-		super.init(bars);
-		init(bars);
-	}
-
-	public void init(IActionBars bars) {
-		IToolBarManager toolbar = bars.getToolBarManager();
-		initToolbar(toolbar);
-	}
-
-	/**
-	 * @param toolbar
-	 */
-	private void initToolbar(IToolBarManager toolbar) {
-		DesignActionBarFactory factory = DesignActionBarFactory.getInstance();
-
-		Action action = factory.getStyleAction(IHTMLConstants.TAG_U);
-		toolbar.add(action);
-
-		action = factory.getStyleAction(IHTMLConstants.TAG_B);
-		toolbar.add(action);
-
-		action = factory.getStyleAction(IHTMLConstants.TAG_I);
-		toolbar.add(action);
-
-		action = factory.getStyleAction(IHTMLConstants.TAG_SMALL);
-		toolbar.add(action);
-
-		action = factory.getStyleAction(IHTMLConstants.TAG_BIG);
-		toolbar.add(action);
-		// action = factory.getStyleAction(PARAGRAPH_ACTION_ID);
-		// toolbar.add(action);
-	}
-
-	/**
-	 * @param menuManager
-	 * @param action
-	 * @param id
-	 */
-	protected void addActionWithId(IMenuManager menuManager, Action action,
-			String id) {
-		action.setId(id);
-		menuManager.add(action);
-	}
-
-	/**
-	 * @param enabled
-	 */
-	public void setViewerSpecificContributionsEnabled(boolean enabled) {
-		HTMLEditor htmlEditor = null;
-		if (_editorPart instanceof HTMLEditor) {
-			htmlEditor = (HTMLEditor) _editorPart;
-		} else if (_editorPart instanceof SimpleGraphicalEditor) {
-			htmlEditor = ((SimpleGraphicalEditor) _editorPart).getHTMLEditor();
-		}
-
-		if (htmlEditor == null)
-			return;
-
-		SimpleGraphicalEditor graphicalEditor = (SimpleGraphicalEditor) htmlEditor
-				.getDesignViewer();
-		IWorkbenchPartSite site = htmlEditor.getSite();
-		if (site instanceof IEditorSite) {
-			IActionBars actionBars = ((IEditorSite) site).getActionBars();
-
-			if (enabled) {
-				// // we always let the text editor to handle UNDO and REDO
-				// actionBars.setGlobalActionHandler(ITextEditorActionConstants.UNDO,
-				// textEditor
-				// .getAction(ITextEditorActionConstants.UNDO));
-				// actionBars.setGlobalActionHandler(ITextEditorActionConstants.REDO,
-				// textEditor
-				// .getAction(ITextEditorActionConstants.REDO));
-				// lium: the above behavior changed, since we now use
-				// DesignerUndoRedoAction.
-				// see comments in DesignerUndoRedoAction
-				actionBars.setGlobalActionHandler(
-						ITextEditorActionConstants.UNDO, graphicalEditor
-								.getAction(IWorkbenchActionDefinitionIds.UNDO));
-				actionBars.setGlobalActionHandler(
-						ITextEditorActionConstants.REDO, graphicalEditor
-								.getAction(IWorkbenchActionDefinitionIds.REDO));
-
-				// cut/copy/paste is delegated to design actions
-				actionBars
-						.setGlobalActionHandler(
-								ITextEditorActionConstants.DELETE,
-								graphicalEditor
-										.getAction(IWorkbenchActionDefinitionIds.DELETE));
-				actionBars.setGlobalActionHandler(
-						ITextEditorActionConstants.CUT, graphicalEditor
-								.getAction(IWorkbenchActionDefinitionIds.CUT));
-				actionBars.setGlobalActionHandler(
-						ITextEditorActionConstants.COPY, graphicalEditor
-								.getAction(IWorkbenchActionDefinitionIds.COPY));
-				actionBars
-						.setGlobalActionHandler(
-								ITextEditorActionConstants.PASTE,
-								graphicalEditor
-										.getAction(IWorkbenchActionDefinitionIds.PASTE));
-			} else {
-				actionBars.setGlobalActionHandler(
-						ITextEditorActionConstants.UNDO, null);
-				actionBars.setGlobalActionHandler(
-						ITextEditorActionConstants.REDO, null);
-
-				actionBars.setGlobalActionHandler(
-						ITextEditorActionConstants.DELETE, null);
-				actionBars.setGlobalActionHandler(
-						ITextEditorActionConstants.CUT, null);
-				actionBars.setGlobalActionHandler(
-						ITextEditorActionConstants.COPY, null);
-				actionBars.setGlobalActionHandler(
-						ITextEditorActionConstants.PASTE, null);
-			}
-		}
-	}
-
-	/**
-	 * The active editor passed in could be the following: HTMLEditor,
-	 * SimpleGraphicalEditor, null.
-	 */
-	public void setActiveEditor(IEditorPart targetEditor) {
-		_editorPart = targetEditor;
-
-		// temp code.
-		if (targetEditor instanceof SimpleGraphicalEditor) {
-			IHTMLGraphicalViewer viewer = ((SimpleGraphicalEditor) targetEditor)
-					.getGraphicViewer();
-			setViewerOnActions(viewer);
-		} else if (targetEditor instanceof HTMLEditor) {
-			IHTMLGraphicalViewer viewer = ((HTMLEditor) targetEditor)
-					.getDesignViewer().getGraphicViewer();
-			setViewerOnActions(viewer);
-		} else {
-			setViewerOnActions(null);
-		}
-
-		// TODO... uncomment this and investigate NPE
-		//
-		// add the cut/copy/paste for text fields
-		// ActionHandlerPlugin.connectPart(editorPart);
-	}
-
-	private void setViewerOnActions(IHTMLGraphicalViewer viewer) {
-		IContributionItem[] items = getActionBars().getToolBarManager()
-				.getItems();
-		if (items != null) {
-			for (int i = 0; i < items.length; i++) {
-				if (items[i] instanceof ActionContributionItem) {
-					IAction action = ((ActionContributionItem) items[i])
-							.getAction();
-					if (action instanceof DesignerToolBarAction) {
-						((DesignerToolBarAction) action).setViewer(viewer);
-					}
-				}
-			}
-		}
-
-	}
-
-	/**
-	 * @see org.eclipse.ui.IEditorActionBarContributor#dispose()
-	 */
-	public void dispose() {
-        // TODO: anything to dispose?
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignerStyleActionGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignerStyleActionGroup.java
deleted file mode 100644
index 56accac..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignerStyleActionGroup.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import java.util.HashMap;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IKeyBindingService;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DesignerStyleActionGroup {
-	private static HashMap IMAGE_NAMES = new HashMap();
-
-	private static final String VERTICAL = ActionsMessages
-			.getString("DesignerStyleActionGroup.CommandLabel.V"); //$NON-NLS-1$
-
-	private static final String HORIZONTAL = ActionsMessages
-			.getString("DesignerStyleActionGroup.CommandLabel.H"); //$NON-NLS-1$
-
-	private static final String DESIGN = ActionsMessages
-			.getString("DesignerStyleActionGroup.CommandLabel.D"); //$NON-NLS-1$
-
-	private static final String SOURCE = ActionsMessages
-			.getString("DesignerStyleActionGroup.CommandLabel.S"); //$NON-NLS-1$
-
-	private static final String VERTICAL_TOOLTIP = ActionsMessages
-			.getString("DesignerStyleActionGroup.CommandLabel.V.Tooltip"); //$NON-NLS-1$
-
-	private static final String HORIZONTAL_TOOLTIP = ActionsMessages
-			.getString("DesignerStyleActionGroup.CommandLabel.H.Tooltip"); //$NON-NLS-1$
-
-	private static final String DESIGN_TOOLTIP = ActionsMessages
-			.getString("DesignerStyleActionGroup.CommandLabel.D.Tooltip"); //$NON-NLS-1$
-
-	private static final String SOURCE_TOOLTIP = ActionsMessages
-			.getString("DesignerStyleActionGroup.CommandLabel.S.Tooltip"); //$NON-NLS-1$
-	static {
-		IMAGE_NAMES.put(VERTICAL, "PD_Toolbar_vsplit.gif"); //$NON-NLS-1$
-		IMAGE_NAMES.put(HORIZONTAL, "PD_Toolbar_hsplit.gif"); //$NON-NLS-1$
-		IMAGE_NAMES.put(DESIGN, "PD_Toolbar_designer.gif"); //$NON-NLS-1$
-		IMAGE_NAMES.put(SOURCE, "PD_Toolbar_source.gif"); //$NON-NLS-1$
-	}
-
-	class ChangeDesignerStyleAction extends Action {
-		int _mode;
-
-		ChangeDesignerStyleAction(String text, ImageDescriptor image, int mode) {
-			super(text, IAction.AS_RADIO_BUTTON);
-			this.setImageDescriptor(image);
-			_mode = mode;
-		}
-
-		/**
-		 * @return the mode
-		 */
-		public int getMode() {
-			return _mode;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.action.Action#run()
-		 */
-		public void run() {
-			if (_htmlEditor != null) {
-				_htmlEditor.setDesignerMode(_mode);
-				updateActionBars();
-			}
-		}
-	};
-
-	HTMLEditor _htmlEditor;
-
-	ChangeDesignerStyleAction[] _actions = null;
-
-	{
-		ChangeDesignerStyleAction _verAction = new ChangeDesignerStyleAction(
-				VERTICAL, PDPlugin.getDefault().getImageDescriptor(
-						(String) IMAGE_NAMES.get(VERTICAL)),
-				HTMLEditor.MODE_SASH_VERTICAL);
-		_verAction.setId("org.eclipse.jst.pagedesigner.vertical");
-		_verAction
-				.setActionDefinitionId("org.eclipse.jst.pagedesigner.vertical");
-		_verAction.setToolTipText(VERTICAL_TOOLTIP);
-
-		ChangeDesignerStyleAction _horAction = new ChangeDesignerStyleAction(
-				HORIZONTAL, PDPlugin.getDefault().getImageDescriptor(
-						(String) IMAGE_NAMES.get(HORIZONTAL)),
-				HTMLEditor.MODE_SASH_HORIZONTAL);
-		_horAction.setId("org.eclipse.jst.pagedesigner.horizotal");
-		_horAction
-				.setActionDefinitionId("org.eclipse.jst.pagedesigner.horizotal");
-		_horAction.setToolTipText(HORIZONTAL_TOOLTIP);
-
-		ChangeDesignerStyleAction _designAction = new ChangeDesignerStyleAction(
-				DESIGN, PDPlugin.getDefault().getImageDescriptor(
-						(String) IMAGE_NAMES.get(DESIGN)),
-				HTMLEditor.MODE_DESIGNER);
-		_designAction.setId("org.eclipse.jst.pagedesigner.design");
-		_designAction
-				.setActionDefinitionId("org.eclipse.jst.pagedesigner.design");
-		_designAction.setToolTipText(DESIGN_TOOLTIP);
-
-		ChangeDesignerStyleAction _sourceAction = new ChangeDesignerStyleAction(
-				SOURCE, PDPlugin.getDefault().getImageDescriptor(
-						(String) IMAGE_NAMES.get(SOURCE)),
-				HTMLEditor.MODE_SOURCE);
-		_sourceAction.setId("org.eclipse.jst.pagedesigner.source");
-		_sourceAction
-				.setActionDefinitionId("org.eclipse.jst.pagedesigner.source");
-		_sourceAction.setToolTipText(SOURCE_TOOLTIP);
-
-		_actions = new ChangeDesignerStyleAction[] { _verAction, _horAction,
-				_designAction, _sourceAction };
-	}
-
-
-	private void updateActionBars() {
-		if (_htmlEditor == null) {
-			for (int i = 0; i < _actions.length; i++) {
-				_actions[i].setEnabled(false);
-			}
-		} else {
-			for (int i = 0; i < _actions.length; i++) {
-				_actions[i].setEnabled(true);
-				_actions[i].setChecked(_actions[i].getMode() == _htmlEditor
-						.getDesignerMode());
-			}
-		}
-	}
-
-	/**
-	 * @param editor
-	 */
-	public void setHTMLEditor(HTMLEditor editor) {
-		this._htmlEditor = editor;
-		if (editor != null) {
-			IKeyBindingService keyBindingService = editor.getSite()
-					.getKeyBindingService();
-			for (int i = 0; i < _actions.length; i++) {
-				keyBindingService.registerAction(_actions[i]);
-			}
-		}
-		updateActionBars();
-	}
-
-
-	/**
-	 * @param actionBars
-	 */
-	public void fillActionBars(IActionBars actionBars) {
-		IToolBarManager toolbar = actionBars.getToolBarManager();
-		for (int i = 0; i < _actions.length; i++) {
-			toolbar.add(_actions[i]);
-		}
-		toolbar.add(new Separator());
-	}
-
-	/**
-	 * dispose the action
-	 */
-	public void dispose() {
-		if (_htmlEditor != null) {
-			IKeyBindingService keyBindingService = _htmlEditor.getSite()
-					.getKeyBindingService();
-			for (int i = 0; i < _actions.length; i++) {
-				keyBindingService.unregisterAction(_actions[i]);
-			}
-		}
-
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignerUndoRedoAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignerUndoRedoAction.java
deleted file mode 100644
index 3d563ac..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/DesignerUndoRedoAction.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import java.text.MessageFormat;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.gef.ui.actions.UpdateAction;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.pagedesigner.editors.SimpleGraphicalEditor;
-import org.eclipse.wst.sse.core.internal.undo.IStructuredTextUndoManager;
-
-/**
- * SSE has a IDocumentSelectionMediator mechanism, basically it let the viewer
- * that invoke the redo/undo to reset the selection after redo/undo.
- * 
- * To utilize this feature, we can't directly use the undo/redo action of the
- * text editor for the designer, since in that way it will be the TextEditor to
- * handle selection after redo/undo.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class DesignerUndoRedoAction extends Action implements UpdateAction {
-	private boolean _undo = true; // if false means redo
-
-	private final SimpleGraphicalEditor _designer;
-
-	/**
-	 * @param undo 
-	 * @param designer 
-	 * 
-	 */
-	public DesignerUndoRedoAction(boolean undo, SimpleGraphicalEditor designer) {
-		this._undo = undo;
-		this._designer = designer;
-
-		if (undo) {
-			setText(ActionsMessages.getString("DesignerUndoRedoAction.UNDO")); //$NON-NLS-1$
-		} else {
-			setText(ActionsMessages.getString("DesignerUndoRedoAction.REDO")); //$NON-NLS-1$
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.actions.UpdateAction#update()
-	 */
-	public void update() {
-		IStructuredTextUndoManager undoManager = _designer.getHTMLEditor()
-				.getModel().getUndoManager();
-		if (_undo) {
-			Command c = undoManager.getUndoCommand();
-			this.setEnabled(undoManager.undoable());
-			if (c != null) {
-				String label = c.getLabel();
-				this
-						.setText(MessageFormat
-								.format(
-										ActionsMessages
-												.getString("DesignerUndoRedoAction.UNDO_LABEL"), new Object[] { label })); //$NON-NLS-1$
-			} else {
-				this.setText(ActionsMessages
-						.getString("DesignerUndoRedoAction.UNDO")); //$NON-NLS-1$
-			}
-		} else {
-			Command c = undoManager.getRedoCommand();
-			this.setEnabled(undoManager.redoable());
-			if (c != null) {
-				String label = c.getLabel();
-				this
-						.setText(MessageFormat
-								.format(
-										ActionsMessages
-												.getString("DesignerUndoRedoAction.REDO_LABEL"), new Object[] { label })); //$NON-NLS-1$
-			} else {
-				this.setText(ActionsMessages
-						.getString("DesignerUndoRedoAction.REDO")); //$NON-NLS-1$
-			}
-		}
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		IStructuredTextUndoManager undoManager = _designer.getHTMLEditor()
-				.getModel().getUndoManager();
-		if (_undo) {
-			undoManager.undo(_designer);
-		} else {
-			undoManager.redo(_designer);
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/OutlineViewAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/OutlineViewAction.java
deleted file mode 100644
index 987bc4f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/OutlineViewAction.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import org.eclipse.ui.IPageLayout;
-
-/**
- * A show view action that shows the outline view
- *
- */
-public class OutlineViewAction extends ShowViewAction 
-{
-    /**
-     * the action id
-     */
-    public final static String ID = "org.eclipse.jst.pagedesigner.editors.actions.OutlineViewAction"; //$NON-NLS-1$
-
-    /**
-     * Default constructor
-     */
-    public OutlineViewAction() 
-    {
-        super(ActionsMessages
-                .getString("OutlineViewAction.Menu.OutlineView")
-              , IPageLayout.ID_OUTLINE); //$NON-NLS-1$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/PageDesignerActionBarContributor2.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/PageDesignerActionBarContributor2.java
deleted file mode 100644
index 4457d64..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/PageDesignerActionBarContributor2.java
+++ /dev/null
@@ -1,347 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jst.pagedesigner.IJMTConstants;
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.jst.pagedesigner.editors.SimpleGraphicalEditor;
-import org.eclipse.jst.pagedesigner.ui.common.sash.NestedEditorActionBarContributor;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.wst.sse.ui.StructuredTextEditor;
-import org.eclipse.wst.sse.ui.internal.ExtendedEditorActionBuilder;
-import org.eclipse.wst.sse.ui.internal.IExtendedContributor;
-import org.eclipse.wst.sse.ui.internal.ISourceViewerActionBarContributor;
-
-/**
- * This is the actionbar contributor for HTML Editor. As HTMLEditor is
- * multipaged, so this contributor will also handle on which page currently is
- * activated.
- * 
- * @author mengbo
- */
-public class PageDesignerActionBarContributor2 extends
-		NestedEditorActionBarContributor implements IExtendedContributor {
-
-	private DesignPageActionContributor _designViewerActionBarContributor = null;
-
-	private ISourceViewerActionBarContributor _sourceViewerActionContributor = null;
-
-	private HTMLEditor _htmlEditor = null;
-
-	// EditorExtension
-	private static final String EDITOR_ID = IJMTConstants.EDITORID_HTML;
-
-	private IExtendedContributor _extendedContributor;
-
-	DesignerStyleActionGroup _group = new DesignerStyleActionGroup();
-
-	/**
-	 * Default constructor
-	 */
-	public PageDesignerActionBarContributor2() {
-		super();
-
-		_sourceViewerActionContributor = new SourcePageActionContributor();
-		_designViewerActionBarContributor = new DesignPageActionContributor();
-
-		// Read action extensions.
-		ExtendedEditorActionBuilder builder = new ExtendedEditorActionBuilder();
-		_extendedContributor = builder.readActionExtensions(EDITOR_ID);
-	}
-
-	public void init(IActionBars actionBars) {
-		super.init(actionBars);
-
-		if (actionBars != null) {
-			initCommonActionBarContributor(actionBars);
-			initDesignViewerActionBarContributor(actionBars);
-			initSourceViewerActionContributor(actionBars);
-		}
-	}
-
-	/**
-	 * @param actionBars
-	 */
-	private void initCommonActionBarContributor(IActionBars actionBars) {
-		_group.fillActionBars(actionBars);
-	}
-
-	/**
-	 * @param actionBars
-	 */
-	protected void initDesignViewerActionBarContributor(IActionBars actionBars) {
-		if (_designViewerActionBarContributor != null)
-			_designViewerActionBarContributor.init(actionBars, getPage());
-	}
-
-	/**
-	 * @param actionBars
-	 */
-	protected void initSourceViewerActionContributor(IActionBars actionBars) {
-		if (_sourceViewerActionContributor != null)
-			_sourceViewerActionContributor.init(actionBars, getPage());
-	}
-
-	public void dispose() {
-		super.dispose();
-		if (_designViewerActionBarContributor != null) {
-			_designViewerActionBarContributor.dispose();
-		}
-		if (_sourceViewerActionContributor != null) {
-			_sourceViewerActionContributor.dispose();
-		}
-		if (_extendedContributor != null) {
-			_extendedContributor.dispose();
-		}
-		if (_group != null) {
-			_group.dispose();
-		}
-	}
-
-	/**
-	 * @see org.eclipse.ui.part.EditorActionBarContributor#contributeToMenu(IMenuManager)
-	 */
-	public final void contributeToMenu(IMenuManager menu) {
-		super.contributeToMenu(menu);
-		addToMenu(menu);
-		if (_extendedContributor != null)
-			_extendedContributor.contributeToMenu(menu);
-	}
-
-	private void addToMenu(IMenuManager menu) {
-		// IMenuManager menuMgr = new MenuManager(PD_EDITOR_MENU_LABEL,
-		// IJMTConstants.PD_EDITOR_MENU_ID);
-		// menu.insertBefore(IWorkbenchActionConstants.M_NAVIGATE, menuMgr);
-		//
-		// menuMgr.add(action);
-		// menuMgr.setRemoveAllWhenShown(true);
-		//
-		// menuMgr.addMenuListener(new IMenuListener()
-		// {
-		// public void menuAboutToShow(IMenuManager menuMgr)
-		// {
-		// PageDesignerActionConstants.addStandardActionGroups(menuMgr);
-		// RelatedViewActionGroup viewMenu = new RelatedViewActionGroup();
-		// viewMenu.fillContextMenu(menuMgr);
-		// updateEditorMenu(menuMgr);
-		// }
-		// });
-	}
-
-	/**
-	 * @see IExtendedContributor#contributeToPopupMenu(IMenuManager)
-	 */
-	public final void contributeToPopupMenu(IMenuManager menu) {
-		// TODO: this method is empty addToPopupMenu(menu);
-		if (_extendedContributor != null)
-			_extendedContributor.contributeToPopupMenu(menu);
-	}
-
-//	protected void addToPopupMenu(IMenuManager menu) {
-//        // do nothing
-//	}
-
-	/**
-	 * @see org.eclipse.ui.part.EditorActionBarContributor#contributeToToolBar(IToolBarManager)
-	 */
-	public final void contributeToToolBar(IToolBarManager toolBarManager) {
-		super.contributeToToolBar(toolBarManager);
-		// TODO: this method is empty addToToolBar(toolBarManager);
-		if (_extendedContributor != null)
-			_extendedContributor.contributeToToolBar(toolBarManager);
-	}
-
-//	protected void addToToolBar(IToolBarManager toolBarManager) {
-//	}
-
-	/**
-	 * @see org.eclipse.ui.part.EditorActionBarContributor#contributeToStatusLine(IStatusLineManager)
-	 */
-	public final void contributeToStatusLine(IStatusLineManager manager) {
-		super.contributeToStatusLine(manager);
-		// TODO: this method does nothing addToStatusLine(manager);
-		if (_extendedContributor != null)
-			_extendedContributor.contributeToStatusLine(manager);
-	}
-
-//	protected void addToStatusLine(IStatusLineManager manager) {
-//	}
-
-	/**
-	 * @see IExtendedContributor#updateToolbarActions()
-	 */
-	public void updateToolbarActions() {
-		if (_extendedContributor != null) {
-			_extendedContributor.updateToolbarActions();
-		}
-		_group.setHTMLEditor(_htmlEditor);
-	}
-
-	public void setActiveEditor(IEditorPart targetEditor) {
-		if (targetEditor instanceof HTMLEditor) {
-			_htmlEditor = (HTMLEditor) targetEditor;
-			//StructuredTextEditor textEditor = _htmlEditor.getTextEditor();
-			// TODO: never read this._model = textEditor.getModel();
-		}
-		super.setActiveEditor(targetEditor);
-		updateToolbarActions();
-		if (_extendedContributor != null)
-			_extendedContributor.setActiveEditor(targetEditor);
-	}
-
-	public void setInnerActivePage(IEditorPart activeEditor) {
-		// This contributor is designed for StructuredTextMultiPageEditorPart.
-		// To safe-guard this from problems caused by unexpected usage by
-		// other editors, the following
-		// check is added.
-		if (_htmlEditor != null) {
-			if (activeEditor instanceof StructuredTextEditor) {
-				activateSourcePage((StructuredTextEditor) activeEditor);
-			} else if (activeEditor instanceof SimpleGraphicalEditor) {
-				//SimpleGraphicalEditor graphEditor = (SimpleGraphicalEditor) activeEditor;
-				activateDesignPage((SimpleGraphicalEditor) activeEditor);
-				// TODO: never read this._viewer = graphEditor.getGraphicViewer();
-			} else {
-				// currently we don't have special action for preview.
-				deactivateSourceAndDesignPage(activeEditor);
-				// TODO: never read this._viewer = null;
-			}
-		}
-
-		updateToolbarActions();
-
-		IActionBars actionBars = getActionBars();
-		if (actionBars != null) {
-			// update menu bar and tool bar
-			actionBars.updateActionBars();
-		}
-	}
-
-	/**
-	 * @param activeEditor 
-	 * 
-	 */
-	protected void deactivateSourceAndDesignPage(IEditorPart activeEditor) {
-		if (_designViewerActionBarContributor != null) {
-			_designViewerActionBarContributor.setActiveEditor(_htmlEditor);
-			_designViewerActionBarContributor
-					.setViewerSpecificContributionsEnabled(false);
-		}
-		if (_sourceViewerActionContributor != null) {
-			_sourceViewerActionContributor.setActiveEditor(_htmlEditor);
-			_sourceViewerActionContributor
-					.setViewerSpecificContributionsEnabled(false);
-		}
-	}
-
-	/**
-	 * @param activeEditor
-	 */
-	protected void activateDesignPage(SimpleGraphicalEditor activeEditor) {
-
-		if (_sourceViewerActionContributor != null /*
-													 * &&
-													 * _sourceViewerActionContributor
-													 * instanceof
-													 * ISourceViewerActionBarContributor
-													 */) {
-			// previously I was trying setActiveEditor(null) here. But as in the
-			// super class will
-			// compare the editor with original one, if same then directly
-			// return. So will not disable
-			// those actions. (lium)
-			_sourceViewerActionContributor.setActiveEditor(_htmlEditor);
-			_sourceViewerActionContributor
-					.setViewerSpecificContributionsEnabled(false);
-		}
-
-		if (_designViewerActionBarContributor != null) {
-			_designViewerActionBarContributor.setActiveEditor(activeEditor);
-			_designViewerActionBarContributor
-					.setViewerSpecificContributionsEnabled(true);
-		}
-	}
-
-	/**
-	 * @param activeEditor
-	 */
-	protected void activateSourcePage(StructuredTextEditor activeEditor) {
-		if (_designViewerActionBarContributor != null /*
-														 * &&
-														 * _designViewerActionBarContributor
-														 * instanceof
-														 * IDesignViewerActionBarContributor
-														 */) {
-			// _designViewerActionBarContributor only recogonize HTMLEditor and
-			// its own GraphicEditor. so not setting source editor to it.
-			_designViewerActionBarContributor.setActiveEditor(_htmlEditor);
-			_designViewerActionBarContributor
-					.setViewerSpecificContributionsEnabled(false);
-		}
-
-		if (_sourceViewerActionContributor != null /*
-													 * &&
-													 * _sourceViewerActionContributor
-													 * instanceof
-													 * ISourceViewerActionBarContributor
-													 */) {
-			_sourceViewerActionContributor.setActiveEditor(activeEditor);
-			_sourceViewerActionContributor.setViewerSpecificContributionsEnabled(true);
-		}
-	}
-
-    // TODO: dead?
-//	private void updateEditorMenu(IMenuManager menuMgr) {
-//		if (this._viewer == null) {
-//			return;
-//		} else {
-//			if (menuMgr != null) {
-//				ContainerActionGroup containerActionGroup = new ContainerActionGroup();
-//				ActionContext context = new ActionContext(this._viewer
-//						.getSelection());
-//				context.setInput(this._viewer);
-//				containerActionGroup.setContext(context);
-//				containerActionGroup.fillContextMenu(menuMgr);
-//				containerActionGroup.setContext(null);
-//
-//				RangeActionGroup rangeActionGroup = new RangeActionGroup();
-//				context = new ActionContext(this._viewer.getSelection());
-//				context.setInput(this._viewer);
-//				rangeActionGroup.setContext(context);
-//				rangeActionGroup.fillContextMenu(menuMgr);
-//				rangeActionGroup.setContext(null);
-//
-//				SingleElementActionGroup singleActionGroup = new SingleElementActionGroup();
-//				singleActionGroup.setContext(new ActionContext(this._viewer
-//						.getSelection()));
-//				singleActionGroup.fillContextMenu(menuMgr);
-//				singleActionGroup.setContext(null);
-//
-//				if (this._model != null) {
-//					CustomedContextMenuActionGroup customedMenu = new CustomedContextMenuActionGroup();
-//					customedMenu.setContext(new ActionContext(_viewer
-//							.getSelection()));
-//					customedMenu.setModel(_model);
-//					customedMenu.setParentControl(_viewer.getControl());
-//					customedMenu.fillContextMenu(menuMgr);
-//					customedMenu.setContext(null);
-//					customedMenu.setParentControl(null);
-//					customedMenu.setModel(null);
-//				}
-//			}
-//		}
-//	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/PaletteViewAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/PaletteViewAction.java
deleted file mode 100644
index 49f2645..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/PaletteViewAction.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import org.eclipse.gef.EditDomain;
-import org.eclipse.gef.ui.views.palette.PaletteView;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PaletteViewAction extends ShowViewAction {
-	/**
-	 * the action id
-	 */
-	public final static String ID = "org.eclipse.jst.pagedesigner.editors.actions.PaletteViewAction"; //$NON-NLS-1$
-    
-	/**
-	 * @param element
-	 * @param editDomain
-	 */
-	public PaletteViewAction(Element element, EditDomain editDomain) {
-        super(ActionsMessages.getString("PaletteViewAction.Menu.PaletteView")
-                , PaletteView.ID); //$NON-NLS-1$
-        //_element = element;
-        //_editDomain = editDomain;
-	}
-    
-    /** 
-     * Add to default behavior because pallete view doesn't automatically track
-     * selection to currently selected edit part
-     */
-    public void run()
-    {
-        super.run();
-        
-        //TODO: for some reason getting a palette item to select doesn't work
-//        if (_element != null && _editDomain != null)
-//        {
-//            PaletteItemManager manager = PaletteItemManager
-//                                          .getInstance(getProject(_element));
-//            if (manager != null) {
-//                IPaletteItemCategory category = manager.findOrCreateCategory(CMUtil
-//                        .getElementNamespaceURI(_element), null);
-//                
-//              if (category != null) {
-//                  String name = _element.getLocalName();
-//                  if (category.getURI().equals(IJMTConstants.URI_JSP)) {
-//                      name = _element.getTagName();
-//                  }
-//                  IPaletteItemDescriptor descriptor = category
-//                      .getItemByTagName(name);
-//                  if (descriptor != null)
-//                  {
-//                      PaletteEntry paletteEntry = descriptor.getPaletteEntry();
-//                      final RootEditPart editPart = 
-//                          _editDomain.getPaletteViewer().getRootEditPart();
-//                      EditPart newSelection = findMatchingPart(editPart.getContents(), paletteEntry);
-//
-//                      if (newSelection != null)
-//                      {
-//                          _editDomain.getPaletteViewer().setSelection(new StructuredSelection(newSelection));
-//                      }
-//                   }
-//                }
-//            }
-//        }
-    }
-    
-//    private EditPart findMatchingPart(EditPart curPart, PaletteEntry paletteEntry)
-//    {
-//        EditPart match = null;
-//
-//        if (curPart.getModel() == paletteEntry)
-//        {
-//            return curPart;
-//        }
-//        
-//        for (final Iterator it = curPart.getChildren().iterator(); it.hasNext();)
-//        {
-//            match = findMatchingPart((EditPart)it.next(), paletteEntry);
-//            
-//            if (match != null)
-//            {
-//                break;
-//            }
-//        }
-//        
-//        return match;
-//    }
-//    private IProject getProject(Element element) {
-//        if (element instanceof IDOMElement) {
-//            IDOMModel model = ((IDOMElement) element).getModel();
-//            IFile file = StructuredModelUtil.getFileFor(model);
-//            if (file != null) {
-//                return file.getProject();
-//            }
-//        }
-//        return null;
-//    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/PropertiesViewAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/PropertiesViewAction.java
deleted file mode 100644
index 67abf65..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/PropertiesViewAction.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import org.eclipse.ui.IPageLayout;
-
-/**
- * @author mengbo
- */
-public class PropertiesViewAction extends ShowViewAction {
-	/**
-	 * the id
-	 */
-	public final static String ID = "org.eclipse.jst.pagedesigner.editors.actions.PropertiesViewAction"; //$NON-NLS-1$
-
-	/**
-	 * Default constructor
-	 */
-	public PropertiesViewAction() 
-    {
-		super(ActionsMessages
-				.getString("PropertiesViewAction.Menu.Properties")
-              , IPageLayout.ID_PROP_SHEET); //$NON-NLS-1$
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/RelatedViewActionGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/RelatedViewActionGroup.java
deleted file mode 100644
index b7e6e4e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/RelatedViewActionGroup.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.gef.EditDomain;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.actions.ActionContext;
-import org.eclipse.ui.actions.ActionGroup;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class RelatedViewActionGroup extends ActionGroup 
-{
-    private final EditDomain  _editDomain;
-    
-    /**
-     * @param editDomain
-     */
-    public RelatedViewActionGroup(EditDomain editDomain)
-    {
-        _editDomain = editDomain;
-    }
-    
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.actions.ActionGroup#fillContextMenu(org.eclipse.jface.action.IMenuManager)
-	 */
-	public void fillContextMenu(IMenuManager menu) {
-		super.fillContextMenu(menu);
-
-		final IMenuManager viewMgr = new MenuManager(ActionsMessages
-				.getString("RelatedViewActionGroup.Menu.ShowView"),//$NON-NLS-1$
-				PageDesignerActionConstants.SHOWVIEW_SUBMENU_ID);
-		viewMgr.add(new Action() {
-		    // add noop action; TODO: why?
-		});
-		viewMgr.setRemoveAllWhenShown(true);
-        final ActionContext context = getContext();
-		viewMgr.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager manager) {
-                // TODO: don't like this at all
-				String[] views = { "org.eclipse.ui.views.PropertySheet",
-						"org.eclipse.gef.ui.palette_view", "org.eclipse.ui.views.ContentOutline"};
-
-                Map icons = getIconForView(views);
-                // TODO: is this the best way to do this?
-				if (manager.find(PropertiesViewAction.ID) == null) {
-					Action action = new PropertiesViewAction();
-					action.setId(PropertiesViewAction.ID);
-					action.setImageDescriptor((ImageDescriptor) icons
-							.get(views[0]));
-					manager.add(action);
-				}
-                    ISelection selection = context.getSelection();
-                    if (manager.find(PaletteViewAction.ID) == null) {
-                    if (selection instanceof IStructuredSelection)
-                    {
-                        IStructuredSelection strucSelection = 
-                            (IStructuredSelection) selection;
-                        Action action = null;
-                        
-                        if (strucSelection.getFirstElement() instanceof ElementEditPart)
-                        {                      
-                            Element selectedElem = (Element)
-                                ((ElementEditPart) strucSelection.getFirstElement()).getModel();
-        					action = new PaletteViewAction(selectedElem, _editDomain);
-                        }
-                        else
-                        {
-                            // if can't determine, just default open the palette
-                            action = new PaletteViewAction(null, null);
-                        }
-                        action.setId(PaletteViewAction.ID);
-                        action.setImageDescriptor((ImageDescriptor) icons
-                                .get(views[1]));
-                        manager.add(action);
-                    }
-				}
-                if (manager.find(OutlineViewAction.ID) == null)
-                {
-                    Action action = new OutlineViewAction();
-                    action.setId(OutlineViewAction.ID);
-                    action.setImageDescriptor((ImageDescriptor) icons
-                            .get(views[2]));
-                    manager.add(action);
-                }
-                
-			}
-		});
-		menu.appendToGroup(IWorkbenchActionConstants.MB_ADDITIONS, viewMgr);
-	}
-
-	private Map getIconForView(String[] viewids) {
-		List views = Arrays.asList(viewids);
-		Map icons = new HashMap();
-
-		IConfigurationElement[] elements = Platform.getExtensionRegistry()
-				.getConfigurationElementsFor("org.eclipse.ui.views");
-		for (int i = 0; i < elements.length; i++) {
-			String name = elements[i].getName();
-			String id = elements[i].getAttribute("id");
-			if ("view".equals(name) && views.contains(id)) {
-				String iconPath = elements[i].getAttribute("icon");
-				if (iconPath != null) {
-					icons.put(id, AbstractUIPlugin.imageDescriptorFromPlugin(
-							elements[i].getDeclaringExtension().getContributor().getName(),
-							iconPath));
-				} else {
-					icons.put(id, null);
-				}
-				if (icons.size() == viewids.length) {
-					break;
-				}
-			}
-		}
-		return icons;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ShowViewAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ShowViewAction.java
deleted file mode 100644
index 5422d60..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ShowViewAction.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * TODO: isn't there a workbench registry action for this?
- * @author cbateman
- *
- */
-public class ShowViewAction extends Action {
-    private static Logger _log = PDPlugin.getLogger(PropertiesViewAction.class);
-    private final String _viewId;
-    
-    /**
-     * @param text
-     * @param viewId
-     */
-    public ShowViewAction(String text, String viewId) 
-    {
-        _viewId = viewId;
-        setText(text); //$NON-NLS-1$
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.jface.action.IAction#run()
-     */
-    public void run() {
-        try {
-            getPage().showView(_viewId);
-        } catch (PartInitException e) {
-            _log.info("Open the view: "+_viewId, e);
-        }
-
-    }
-
-    private IWorkbenchPage getPage() {
-        IWorkbench workbench = PlatformUI.getWorkbench();
-        IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
-        return window.getActivePage();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/SourcePageActionContributor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/SourcePageActionContributor.java
deleted file mode 100644
index 7d48737..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/SourcePageActionContributor.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.actions;
-
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.texteditor.ITextEditor;
-import org.eclipse.ui.texteditor.ITextEditorActionConstants;
-import org.eclipse.wst.xml.ui.internal.actions.ActionContributorXML;
-
-/**
- * SourcePageActionContributor
- * 
- * This class is for multi page editor's source page contributor.
- * 
- * Use XMLEditorActionContributor for single page editor.
- */
-public class SourcePageActionContributor extends ActionContributorXML {
-
-	private IActionBars fBars;
-
-	/**
-	 * This method calls:
-	 * <ul>
-	 * <li><code>contributeToMenu</code> with <code>bars</code>' menu
-	 * manager</li>
-	 * <li><code>contributeToToolBar</code> with <code>bars</code>' tool
-	 * bar manager</li>
-	 * <li><code>contributeToStatusLine</code> with <code>bars</code>'
-	 * status line manager</li>
-	 * </ul>
-	 * The given action bars are also remembered and made accessible via
-	 * <code>getActionBars</code>.
-	 * 
-	 * @param bars
-	 *            the action bars
-	 * 
-	 */
-	public void init(IActionBars bars) {
-		fBars = bars;
-		contributeToMenu(bars.getMenuManager());
-		contributeToToolBar(bars.getToolBarManager());
-		contributeToStatusLine(bars.getStatusLineManager());
-	}
-
-	/**
-	 * Returns this contributor's action bars.
-	 * 
-	 * @return the action bars
-	 */
-	public IActionBars getActionBars() {
-		return fBars;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.ui.internal.ISourceViewerActionBarContributor#setViewerSpecificContributionsEnabled(boolean)
-	 */
-	public void setViewerSpecificContributionsEnabled(boolean enabled) {
-		super.setViewerSpecificContributionsEnabled(enabled);
-		IEditorPart editor = getActiveEditorPart();
-		ITextEditor targetEditor = null;
-		if (editor instanceof ITextEditor) {
-			targetEditor = (ITextEditor) editor;
-		} else if (editor instanceof HTMLEditor) {
-			targetEditor = ((HTMLEditor) editor).getTextEditor();
-		}
-		if (targetEditor != null) {
-			if (enabled) {
-				getActionBars()
-						.setGlobalActionHandler(
-								ITextEditorActionConstants.UNDO,
-								targetEditor
-										.getAction(ITextEditorActionConstants.UNDO));
-				getActionBars()
-						.setGlobalActionHandler(
-								ITextEditorActionConstants.REDO,
-								targetEditor
-										.getAction(ITextEditorActionConstants.REDO));
-			} else {
-				getActionBars().setGlobalActionHandler(
-						ITextEditorActionConstants.UNDO, null);
-				getActionBars().setGlobalActionHandler(
-						ITextEditorActionConstants.REDO, null);
-			}
-
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/DelegatingZoomManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/DelegatingZoomManager.java
deleted file mode 100644
index bc15858..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/DelegatingZoomManager.java
+++ /dev/null
@@ -1,374 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.pagedesigner;
-
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.draw2d.ScalableFigure;
-import org.eclipse.draw2d.Viewport;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.editparts.ZoomListener;
-import org.eclipse.gef.editparts.ZoomManager;
-
-/**
- * A delegating ZoomManager.
- */
-public class DelegatingZoomManager extends ZoomManager implements ZoomListener {
-	/** the current ZoomManager all work is delegated to */
-	private final static int DEFAULT_ZOOM = 1;
-
-	private final static String ZOOM_AS_TEXT = "100%";
-
-	private final static String ZOOM_LEVEL_AS_TEXT = "100%";
-
-	private ZoomManager _currentZoomManager;
-
-	/** listeners */
-	private ListenerList _zoomListeners = new ListenerList(ListenerList.IDENTITY);
-
-	/**
-	 * Creates a new DelegatingZoomManager instance.
-	 */
-	public DelegatingZoomManager() {
-		super((ScalableFigure) null, (Viewport) null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomListener#zoomChanged(double)
-	 */
-	public void zoomChanged(double zoom) {
-		Object[] listeners = _zoomListeners.getListeners();
-		for (int i = 0; i < listeners.length; ++i) {
-			((ZoomListener) listeners[i]).zoomChanged(zoom);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#addZoomListener(org.eclipse.gef.editparts.ZoomListener)
-	 */
-	public void addZoomListener(ZoomListener listener) {
-		_zoomListeners.add(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#removeZoomListener(org.eclipse.gef.editparts.ZoomListener)
-	 */
-	public void removeZoomListener(ZoomListener listener) {
-		_zoomListeners.remove(listener);
-	}
-
-	/**
-	 * Sets the ZoomManager all work should be delegated to.
-	 * 
-	 * @param zoomManager
-	 */
-	public void setCurrentZoomManager(ZoomManager zoomManager) {
-		if (null != _currentZoomManager) {
-			_currentZoomManager.removeZoomListener(this);
-		}
-
-		_currentZoomManager = zoomManager;
-		if (null != _currentZoomManager) {
-			_currentZoomManager.addZoomListener(this);
-			zoomChanged(_currentZoomManager.getZoom());
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#canZoomIn()
-	 */
-	public boolean canZoomIn() {
-		if (null == _currentZoomManager) {
-			return false;
-		}
-		return _currentZoomManager.canZoomIn();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#canZoomOut()
-	 */
-	public boolean canZoomOut() {
-		if (null == _currentZoomManager) {
-			return false;
-		}
-		return _currentZoomManager.canZoomOut();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#getMaxZoom()
-	 */
-	public double getMaxZoom() {
-		if (null == _currentZoomManager) {
-			return DEFAULT_ZOOM;
-		}
-
-		return _currentZoomManager.getMaxZoom();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#getMinZoom()
-	 */
-	public double getMinZoom() {
-		if (null == _currentZoomManager) {
-			return DEFAULT_ZOOM;
-		}
-		return _currentZoomManager.getMinZoom();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#getNextZoomLevel()
-	 */
-	public double getNextZoomLevel() {
-		if (null == _currentZoomManager) {
-			return DEFAULT_ZOOM;
-		}
-		return _currentZoomManager.getNextZoomLevel();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#getPreviousZoomLevel()
-	 */
-	public double getPreviousZoomLevel() {
-		if (null == _currentZoomManager) {
-			return DEFAULT_ZOOM;
-		}
-		return _currentZoomManager.getPreviousZoomLevel();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#getScalableFigure()
-	 */
-	public ScalableFigure getScalableFigure() {
-		if (null == _currentZoomManager) {
-			return null;
-		}
-
-		return _currentZoomManager.getScalableFigure();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#getUIMultiplier()
-	 */
-	public double getUIMultiplier() {
-		if (null == _currentZoomManager) {
-			return DEFAULT_ZOOM;
-		}
-
-		return _currentZoomManager.getUIMultiplier();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#getViewport()
-	 */
-	public Viewport getViewport() {
-		if (null == _currentZoomManager) {
-			return null;
-		}
-
-		return _currentZoomManager.getViewport();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#getZoom()
-	 */
-	public double getZoom() {
-		if (null == _currentZoomManager) {
-			return DEFAULT_ZOOM;
-		}
-
-		return _currentZoomManager.getZoom();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#getZoomAsText()
-	 */
-	public String getZoomAsText() {
-		if (null == _currentZoomManager) {
-			return ZOOM_AS_TEXT;
-		}
-		//$NON-NLS-1$
-
-		return _currentZoomManager.getZoomAsText();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#getZoomLevels()
-	 */
-	public double[] getZoomLevels() {
-		if (null == _currentZoomManager) {
-			return new double[] { DEFAULT_ZOOM };
-		}
-
-		return _currentZoomManager.getZoomLevels();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#getZoomLevelsAsText()
-	 */
-	public String[] getZoomLevelsAsText() {
-		if (null == _currentZoomManager) {
-			return new String[] { ZOOM_LEVEL_AS_TEXT };
-		}
-
-		return _currentZoomManager.getZoomLevelsAsText();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#setUIMultiplier(double)
-	 */
-	public void setUIMultiplier(double multiplier) {
-		if (null == _currentZoomManager) {
-			return;
-		}
-
-		_currentZoomManager.setUIMultiplier(multiplier);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#setViewLocation(org.eclipse.draw2d.geometry.Point)
-	 */
-	public void setViewLocation(Point p) {
-		if (null == _currentZoomManager) {
-			return;
-		}
-
-		_currentZoomManager.setViewLocation(p);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#setZoom(double)
-	 */
-	public void setZoom(double zoom) {
-		if (null == _currentZoomManager) {
-			return;
-		}
-
-		_currentZoomManager.setZoom(zoom);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#setZoomAnimationStyle(int)
-	 */
-	public void setZoomAnimationStyle(int style) {
-		if (null == _currentZoomManager) {
-			return;
-		}
-
-		_currentZoomManager.setZoomAnimationStyle(style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#setZoomAsText(java.lang.String)
-	 */
-	public void setZoomAsText(String zoomString) {
-		if (null == _currentZoomManager) {
-			return;
-		}
-
-		_currentZoomManager.setZoomAsText(zoomString);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#setZoomLevels(double[])
-	 */
-	public void setZoomLevels(double[] zoomLevels) {
-		if (null == _currentZoomManager) {
-			return;
-		}
-
-		_currentZoomManager.setZoomLevels(zoomLevels);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#zoomIn()
-	 */
-	public void zoomIn() {
-		if (null == _currentZoomManager) {
-			return;
-		}
-
-		_currentZoomManager.zoomIn();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#zoomOut()
-	 */
-	public void zoomOut() {
-		if (null == _currentZoomManager) {
-			return;
-		}
-
-		_currentZoomManager.zoomOut();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.ZoomManager#zoomTo(org.eclipse.draw2d.geometry.Rectangle)
-	 */
-	public void zoomTo(Rectangle rect) {
-		if (null == _currentZoomManager) {
-			return;
-		}
-
-		_currentZoomManager.zoomTo(rect);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/IPageDesignerConstants.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/IPageDesignerConstants.java
deleted file mode 100644
index b586f9d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/IPageDesignerConstants.java
+++ /dev/null
@@ -1,290 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.pagedesigner;
-
-/**
- * The designer constants
- * 
- * TODO: dead?
- *
- */
-interface IPageDesignerConstants {
-	/**
-	 * JSP UI Component Tag Node
-	 */
-	public static final String DEFAULT_TAG_NAME = "tagname";
-
-	/**
-	 * keyword
-	 */
-	public static final String ATTR_TYPE_CDATA = "CDATA";
-
-	/**
-	 * basename attribute
-	 */
-	public static final String ATTR_LOADBUNDLE_1 = "basename";
-
-	/**
-	 * var attribute
-	 */
-	public static final String ATTR_LOADBUNDLE_2 = "var";
-
-	/**
-	 * columns attribute
-	 */
-	public static final String ATTR_PANELGRID_1 = "columns";
-
-	/**
-	 * summary attribute
-	 */
-	public static final String ATTR_PANELGRID_2 = "summary";
-
-	/**
-	 * title attribute
-	 */
-	public static final String ATTR_PANELGRID_3 = "title";
-
-	/**
-	 * action attribute
-	 */
-	public static final String ATTR_BUTTON_1 = "action";
-
-	/**
-	 * value attribute
-	 */
-	public static final String ATTR_BUTTON_2 = "value";
-
-	/**
-	 * url attribute
-	 */
-	public static final String ATTR_GRAPHICIMAGE_1 = "url";
-
-	/**
-	 * binding attribute
-	 */
-	public static final String ATTR_GRAPHICIMAGE_2 = "binding";
-
-	/**
-	 * binding attribute
-	 */
-	public static final String ATTR_OUTPUTTEXT_1 = "binding";
-
-	/**
-	 * value attribute
-	 */
-	public static final String ATTR_OUTPUTTEXT_2 = "value";
-
-	/**
-	 * styleClass attribute
-	 */
-	public static final String ATTR_OUTPUTTEXT_3 = "styleClass";
-
-	/**
-	 * dataWindowBean attribute
-	 */
-	public static final String ATTR_DATAWINDOW_1 = "dataWindowBean";
-
-	/**
-	 * scriptName attribute
-	 */
-	public static final String ATTR_DATAWINDOW_2 = "scriptName";
-
-	/**
-	 * page attribute
-	 */
-	public static final String ATTR_INCLUDE = "page";
-
-	/**
-	 * prefix atttribute
-	 */
-	public static final String ATTR_TAGLIB_1 = "prefix";
-
-	/**
-	 * uri attribute
-	 */
-	public static final String ATTR_TAGLIB_2 = "uri";
-
-	/**
-	 * bundle attribute
-	 */
-	public static final String RESOURCE_BUNDLE_MARK = "bundle";
-
-	/**
-	 * value attribute
-	 */
-	public static final String ATTR_RESOURCE_BUNDLE = "value";
-
-	/**
-	 * value attribute
-	 */
-	public static final String ATTR_FACET = "value";
-
-	/**
-	 * view tag
-	 */
-	public static final String TAG_VIEW_TYPE = "view";
-
-	/**
-	 * for tag
-	 */
-	public static final String TAG_FORM_TYPE = "form";
-
-	/**
-	 * text tag
-	 */
-	public static final String TAG_TEXT_TYPE = "text";
-
-	/**
-	 * loadBundle tag
-	 */
-	public static final String TAG_LOADBUNDLE_TYPE = "loadBundle";
-
-	/**
-	 * panelGrid tag
-	 */
-	public static final String TAG_PANELGRID_TYPE = "panelGrid";
-
-	/**
-	 * 
-	 */
-	public static final String TAG_IMAGE_TYPE = "image";
-
-	/**
-	 * outputText tag
-	 */
-	public static final String TAG_OUTPUTTEXT_TYPE = "outputText";
-
-	/**
-	 * 
-	 */
-	public static final String TAG_BUTTON_TYPE = "button";
-
-	/**
-	 * 
-	 */
-	public static final String TAG_DATAWINDOW_TYPE = "datawindow";
-
-	/**
-	 * 
-	 */
-	public static final String TAG_TAGLIB_TYPE = "taglib";
-
-	/**
-	 * 
-	 */
-	public static final String TAG_INCLUDE_TYPE = "include";
-
-	/**
-	 * 
-	 */
-	public static final String TAG_OTHERS_TYPE = "";
-
-	/**
-	 * 
-	 */
-	public static final String TAG_NAME_VIEW = "view";
-
-	/**
-	 * 
-	 */
-	public static final String TAG_NAME_FORM = "form";
-
-	/**
-	 * 
-	 */
-	public static final String TAG_NAME_PANELGRID = "panelGrid";
-
-	/**
-	 * 
-	 */
-	public static final String TAG_NAME_PANELGROUP = "panelGroup";
-
-	/**
-	 * 
-	 */
-	public static final String TAG_NAME_FACET = "facet";
-
-	/**
-	 * 
-	 */
-	public static final String TAG_NAME_DATAWINDOW = "dataWindow";
-
-	/**
-	 * 
-	 */
-	public static final String TAG_NAME_OUTPUTTEXT = "outputText";
-
-	/**
-	 * 
-	 */
-	public static final String TAG_NAME_INCLUDE = "include";
-
-	/**
-	 * 
-	 */
-	public static final String TAG_NAME_LOADBUNDLE = "loadBundle";
-
-	/**
-	 * 
-	 */
-	public static final String TAG_NAME_TAGLIB = "taglib";
-
-	/**
-	 * graphicImage tag
-	 */
-	public static final String TAG_NAME_GRAPHICIMAGE = "graphicImage";
-
-	/**
-	 * commandButton tag
-	 */
-	public static final String TAG_NAME_COMMANDBUTTON = "commandButton";
-
-	/**
-	 * 
-	 */
-	public static final String REQUEST_TYPE_SELECT = "selection";
-
-	/**
-	 * 
-	 */
-	public static final int EOF = -1;
-
-	/**
-	 * 
-	 */
-	public static final char CHAR_TAB = '\t';
-
-	/**
-	 * 
-	 */
-	public static final char CHAR_N_RETURN = '\n';
-
-	/**
-	 * 
-	 */
-	public static final String STRING_N_RETURN = "\n";
-
-	/**
-	 * 
-	 */
-	public static final String STRING_BLANK = " ";
-
-	/**
-	 * 
-	 */
-	public static final char CHAR_BLANK = ' ';
-
-	/**
-	 * 
-	 */
-	public static final String FONT_NAME_HELVETICA = "Helvetica";
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/JSPEditorMessages.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/JSPEditorMessages.properties
deleted file mode 100644
index beecba5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/JSPEditorMessages.properties
+++ /dev/null
@@ -1,23 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-JSFPalette.DefaultGroup.LabelJSFPallete=Controls
-JSPSourceEditor.Page.Preview.PageText=Preview
-
-CommonResourceDialog.statusMessage=Select an image file
-ResourcesOnClasspathDialog.statusMessage=Select a property file
-TreeViewerSelectionDialog.Title=Select a file
-RangeSelectionTool.CommandLabel.Insert=Insert
-
-DesignerPaletteCustomizerDialog.label.import=Import
-DesignerPaletteCustomizerDialog.label.export=Export
-
-DesignerSourceDropTargetListener.InserCommandLabel=Create New Item
-SourceViewLocalDropCommand.Label.InsertSyntax=Insert Syntax
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/MessageFormater.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/MessageFormater.java
deleted file mode 100644
index 5b4d95d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/MessageFormater.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.pagedesigner;
-
-import java.text.MessageFormat;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-
-/**
- * @A tool class for message format
- */
-public final class MessageFormater {
-	private static Logger _log = PDPlugin.getLogger(MessageFormater.class);
-
-	/**
-	 * 
-	 * @param message
-	 *            the parts for filling is {number}
-	 * @param o1
-	 * @return the formatted string
-	 */
-	public static String format(String message, Object o1) {
-		try {
-			Object[] args = new Object[] { o1 };
-			MessageFormat formatter = new MessageFormat(message);
-			return formatter.format(args);
-		} catch (Exception e) {
-			_log.error("Log.Error.MessageFormater.Format0", e); //$NON-NLS-1$
-			return "";
-		}
-	}
-
-	/**
-	 * @param message
-	 * @param o1
-	 * @param o2
-	 * @return the formatted string
-	 */
-	public static String format(String message, Object o1, Object o2) {
-		try {
-			Object[] args = new Object[] { o1, o2 };
-			MessageFormat formatter = new MessageFormat(message);
-			return formatter.format(args);
-		} catch (Exception e) {
-			_log.error("Log.Error.MessageFormater.Format0", e);
-			return "";
-		}
-	}
-
-	/**
-	 * @param message
-	 * @param o1
-	 * @param o2
-	 * @param o3
-	 * @return the formatted string
-	 */
-	public static String format(String message, Object o1, Object o2, Object o3) {
-		try {
-			Object[] args = new Object[] { o1, o2, o3 };
-			MessageFormat formatter = new MessageFormat(message);
-			return formatter.format(args);
-		} catch (Exception e) {
-			_log.error("Log.Error.MessageFormater.Format0", e);
-			return "";
-		}
-	}
-
-	/**
-	 * @param message
-	 * @param o
-	 * @return the formatted string
-	 */
-	public static String format(String message, Object o[]) {
-		try {
-			MessageFormat formater = new MessageFormat(message);
-			return formater.format(o);
-		} catch (Exception e) {
-			_log.error("Log.Error.MessageFormater.Format0", e);
-			return "";
-		}
-	}
-	
-	private MessageFormater()
-	{
-	    // util class, no instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/PageDesignerResources.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/PageDesignerResources.java
deleted file mode 100644
index ec83204..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/pagedesigner/PageDesignerResources.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.pagedesigner;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.ResourceUtils;
-import org.eclipse.jst.pagedesigner.IJMTConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-
-/**
- * @author mengbo
- */
-public class PageDesignerResources extends ResourceUtils {
-	private static Logger _log = PDPlugin
-			.getLogger(PageDesignerResources.class);
-
-	private static PageDesignerResources _resource; // singleton
-
-	/**
-	 * Empty Constructor.
-	 */
-	protected PageDesignerResources() {
-		try {
-			_resources = ResourceBundle
-					.getBundle(IJMTConstants.PAGEDESIGNER_RESOURCE_BUNDLE_FILE);
-			// NOTE: this throws a runtime "MissingResourceException".
-		} catch (MissingResourceException ee) {
-			// catch this and the error is reported in setBundle.
-			// Log.Error.PageDesignerResources.Open=Error in getting source
-			// bundle
-			_log.error("Log.Error.PageDesignerResources.Open", ee); //$NON-NLS-1$
-		}
-		setBundle(_resources, IJMTConstants.PAGEDESIGNER_RESOURCE_BUNDLE_FILE);
-	}
-
-	/**
-	 * @return the singleton
-	 */
-	public static PageDesignerResources getInstance() {
-		if (_resource == null) {
-			_resource = new PageDesignerResources();
-		}
-		return _resource;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteCustomizationsHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteCustomizationsHelper.java
deleted file mode 100644
index 7235c12..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteCustomizationsHelper.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.Iterator;
-
-import javax.xml.parsers.DocumentBuilder;
-
-import org.eclipse.gef.palette.PaletteEntry;
-import org.eclipse.gef.ui.palette.PaletteCustomizer;
-import org.eclipse.gef.ui.palette.PaletteViewer;
-import org.eclipse.gef.ui.palette.customize.PaletteCustomizerDialog;
-import org.eclipse.jface.preference.IPersistentPreferenceStore;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.PaletteItemManager;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.TaglibPaletteDrawer;
-import org.eclipse.jst.pagedesigner.utils.XMLUtil;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.SAXException;
-
-/**
- * Helper class that all clients should use when dealing with palette customizations 
- */
-public final class DesignerPaletteCustomizationsHelper {
-	private static final String PREFS_TAGLIBHIDE_PREFIX = "hidden_taglib:";
-
-	private static Logger _log = PDPlugin.getLogger(DesignerPaletteCustomizationsHelper.class);
-	
-	/**
-	 * @return new DesignerPaletteCustomizer
-	 */
-	public static DesignerPaletteCustomizer getNewCustomizer(){
-		return new DesignerPaletteCustomizer();
-	}
-	
-	/**
-	 * @param paletteViewer
-	 * @param paletteCustomizer
-	 * @return new DesignerPaletteCustomizerDialog
-	 */
-	public static PaletteCustomizerDialog getNewCustomizerDialog(PaletteViewer paletteViewer, PaletteCustomizer paletteCustomizer){
-		return new DesignerPaletteCustomizerDialog(
-				paletteViewer.getControl().getShell(), paletteCustomizer, paletteViewer.getPaletteRoot());
-
-	}
-	
-	/**
-	 * Save palette item customizations
-	 * @param paletteRoot
-	 */
-	public static void save(DesignerPaletteRoot paletteRoot) {
-		IPersistentPreferenceStore prefs = getPreferenceStore();
-
-		for (Iterator it=paletteRoot.getChildren().iterator();it.hasNext();){
-			PaletteEntry entry = (PaletteEntry)it.next();
-			if (entry instanceof TaglibPaletteDrawer){
-				TaglibPaletteDrawer pd = (TaglibPaletteDrawer)entry;
-				prefs.putValue(PREFS_TAGLIBHIDE_PREFIX + pd.getURI(), Boolean.toString(! pd.isVisible()));
-			}
-		}
-		PaletteItemManager.notifyPaletteItemManagersOfCustomizationsUpdate(paletteRoot.getPaletteManager());
-		
-	}
-	
-	/**
-	 * Load user customizations
-	 * @param paletteItemManager
-	 */
-	public static void loadUserCustomizations(IPaletteItemManager paletteItemManager) {
-		IPreferenceStore store = getPreferenceStore();
-		for (Iterator it=paletteItemManager.getAllCategories().iterator();it.hasNext();){
-			TaglibPaletteDrawer tld = (TaglibPaletteDrawer)it.next();
-			if (store.contains(PREFS_TAGLIBHIDE_PREFIX+tld.getURI())){
-				tld.setVisible( ! store.getBoolean(PREFS_TAGLIBHIDE_PREFIX+tld.getURI()));
-			}
-		}
-	}
-	
-	/**
-	 * Hide a category (TaglibPaletteDrawer) that will be persisted as a customization
-	 * @param taglibPaletteDrawer
-	 */
-	public static void hideTaglibDrawer(TaglibPaletteDrawer taglibPaletteDrawer){
-		IPersistentPreferenceStore prefs = getPreferenceStore();
-		taglibPaletteDrawer.setVisible(false);
-		prefs.putValue(PREFS_TAGLIBHIDE_PREFIX + taglibPaletteDrawer.getURI(), Boolean.TRUE.toString());
-		save((DesignerPaletteRoot)taglibPaletteDrawer.getParent());
-	}
-	
-	private static IPersistentPreferenceStore getPreferenceStore() {
-		return (IPersistentPreferenceStore)PDPlugin.getDefault().getPreferenceStore();
-	}
-	
-	/**
-	 * Exports the current state of customizations of the current palette instance.
-	 * 
-	 * Unsaved data will be exported.
-	 * 
-	 * Currently only the "hide" flag of a category is exported.  All categories are exported.
-	 * 
-	 * @param paletteItemManager
-	 * @param filename
-	 */
-	public static void exportCustomizations(IPaletteItemManager paletteItemManager, String filename){
-
-		Document document = XMLUtil.getDocumentBuilder().getDOMImplementation()
-			.createDocument(null, IPaletteConstants.ROOT, null);
-		try {
-			FileOutputStream ostream = null;
-			int index = filename.lastIndexOf(File.separator);
-			String foldername = filename.substring(0, index); 
-			File folder = new File(foldername);
-			if (folder != null && !folder.exists()) {
-				folder.mkdir();
-			}
-			
-			ostream = new FileOutputStream(filename);
-
-			for (Iterator iter = paletteItemManager.getAllCategories().iterator(); iter.hasNext();) {
-				TaglibPaletteDrawer category = (TaglibPaletteDrawer) iter
-						.next();	
-				if (category == null) continue;
-
-				Element categoryElement = document.createElement(IPaletteConstants.CATEGORY_TAG);
-				categoryElement.setAttribute(IPaletteConstants.ID, category.getURI());
-				categoryElement.setAttribute(IPaletteConstants.ISHIDDEN, Boolean.toString(! category.isVisible()));
-				document.getDocumentElement().appendChild(categoryElement);
-			}
-			XMLUtil.serialize(document, ostream);
-			ostream.close();
-		} catch (IOException e) {
-			_log.error("DesignerPaletteCustomizationsHelper.save.error.IOException", e); //$NON-NLS-1$
-		}
-	}
-	
-	/**
-	 * Imports a palette customization export file.
-	 * 
-	 * If there are entries matching in the existing workspace customizations, they will be overridden.
-	 * 
-	 * @param customizer 
-	 * @param filename
-	 */
-	public static void importCustomizations(DesignerPaletteCustomizer customizer, String filename){
-		Document document = null;
-		try {
-			DocumentBuilder builder = XMLUtil.getDocumentBuilder();
-			if (builder != null) {
-				document = builder.parse(filename);
-			} else {
-				_log.error("DesignerPaletteCustomizationsHelper.importCustomizations.error.getDocumentBuilderFail");// $NON-NLS-1$
-			}
-		} catch (FileNotFoundException e) {
-			//should never get here as user chose file thru a file chooser dialog
-			_log.error(
-					"DesignerPaletteCustomizationsHelper.importCustomizations.error.FileNotFoundException");// $NON-NLS-1$
-			document = null;
-		} catch (IOException e) {
-			_log.error(
-					"DesignerPaletteCustomizationsHelper.importCustomizations.error.IOException", e.toString(), e); //$NON-NLS-1$
-		} catch (SAXException e) {
-			_log.error(
-					"DesignerPaletteCustomizationsHelper.importCustomizations.error.SAXException", e.toString(), e); //$NON-NLS-1$
-		}
-		if (document != null) {
-			Element root = document.getDocumentElement();
-			if (root != null) {
-				NodeList catetorylist = root.getChildNodes();
-				for (int i = 0, n = catetorylist.getLength(); i < n; i++) {
-					Node childNode = catetorylist.item(i);
-					if (childNode.getNodeType() == Node.ELEMENT_NODE
-							&& childNode.getNodeName().equals(
-									IPaletteConstants.CATEGORY_TAG)) {
-						
-						Element categoryElement = (Element) childNode;
-						//only checking for hidden flag currently
-						if (categoryElement.hasAttribute(IPaletteConstants.ISHIDDEN)){
-							boolean isHidden =Boolean.valueOf(categoryElement.getAttribute(IPaletteConstants.ISHIDDEN)).booleanValue();
-							
-							String uri = categoryElement.getAttribute(IPaletteConstants.ID);
-							applyImport(customizer, uri, isHidden);							
-						}
-						
-						
-					}
-				}
-			}
-		}
-	}
-
-	private static void applyImport(
-			DesignerPaletteCustomizer customizer, String uri, boolean isHidden) {
-		//apply the isHidden exported flag to the paletteRoot child if present 
-		for (Iterator it=customizer.getDesignerPaletteRoot().getChildren().iterator();it.hasNext();){
-			Object o = it.next();
-			if (o instanceof TaglibPaletteDrawer){
-				TaglibPaletteDrawer pd = (TaglibPaletteDrawer)o;
-				if (uri.equals(pd.getURI())){
-					pd.setVisible(! isHidden);
-					break;
-				}
-			}
-		}	
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteCustomizer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteCustomizer.java
deleted file mode 100644
index 9656cd1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteCustomizer.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.gef.palette.PaletteEntry;
-import org.eclipse.gef.ui.palette.PaletteCustomizer;
-import org.eclipse.gef.ui.palette.customize.PaletteSeparatorFactory;
-import org.eclipse.gef.ui.palette.customize.PaletteStackFactory;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.PaletteItemManager;
-
-/**
- * @author mengbo
- */
-public class DesignerPaletteCustomizer extends PaletteCustomizer {
-
-	
-	private DesignerPaletteRoot root;
-
-	/**
-	 * Set the palette root.   Must be set before the customizer can be used
-	 * @param root
-	 */
-	public void setPaletteRoot(DesignerPaletteRoot root){
-		this.root = root;
-	}
-	
-	/**
-	 * Return the palette root for this customizer
-	 * @return DesignerPaletteRoot
-	 */
-	public DesignerPaletteRoot getDesignerPaletteRoot(){
-		return root;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.gef.ui.palette.PaletteCustomizer#canMoveDown(org.eclipse.gef.palette.PaletteEntry)
-	 */
-	public boolean canMoveDown(PaletteEntry entry) {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.gef.ui.palette.PaletteCustomizer#canMoveUp(org.eclipse.gef.palette.PaletteEntry)
-	 */
-	public boolean canMoveUp(PaletteEntry entry) {
-		return false;
-	}
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.palette.PaletteCustomizer#canMoveDown(org.eclipse.gef.palette.PaletteEntry)
-	 */
-//	public boolean canMoveDown(PaletteEntry entry) {
-//		if (!(entry instanceof PaletteDrawer)) {
-//			return false;
-//		}
-//		return super.canMoveDown(entry);
-//	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.palette.PaletteCustomizer#canMoveUp(org.eclipse.gef.palette.PaletteEntry)
-	 */
-//	public boolean canMoveUp(PaletteEntry entry) {
-//		if (!(entry instanceof PaletteDrawer)) {
-//			return false;
-//		}
-//		if (entry.getParent().getChildren().indexOf(entry) == 1) {
-//			return false;
-//		}
-//		return super.canMoveUp(entry);
-//	}
-
-//	/*
-//	 * (non-Javadoc)
-//	 * 
-//	 * @see org.eclipse.gef.ui.palette.PaletteCustomizer#performMoveDown(org.eclipse.gef.palette.PaletteEntry)
-//	 */
-//	public void performMoveDown(PaletteEntry entry) {
-//		if (entry instanceof PaletteDrawer) {
-//			String id = entry.getId();
-//			TaglibPaletteDrawer cat = PaletteItemManager.getCurrentInstance().getTaglibPalletteDrawer(id);
-//			movedown(PaletteItemManager.getCurrentInstance(), cat);
-//			super.performMoveDown(entry);
-//		}
-//	}
-//	private void moveup(PaletteItemManager paletteItemManager, TaglibPaletteDrawer cat) {
-//		int i = paletteItemManager.getAllCategories().indexOf(cat);
-//		TaglibPaletteDrawer upCat = (TaglibPaletteDrawer) paletteItemManager.getAllCategories()
-//				.get(i - 1);
-//		movedown(paletteItemManager, upCat);
-//	}
-//
-//	private void movedown(PaletteItemManager paletteItemManager, TaglibPaletteDrawer cat) {
-//		int i = paletteItemManager.getAllCategories().indexOf(cat);
-//		paletteItemManager.getAllCategories().add(i + 2, cat);
-//		paletteItemManager.getAllCategories().remove(i);
-//	}
-//	/*
-//	 * (non-Javadoc)
-//	 * 
-//	 * @see org.eclipse.gef.ui.palette.PaletteCustomizer#performMoveUp(org.eclipse.gef.palette.PaletteEntry)
-//	 */
-//	public void performMoveUp(PaletteEntry entry) {
-//		if (entry instanceof PaletteDrawer) {
-//			String id = entry.getId();
-//			TaglibPaletteDrawer cat = PaletteItemManager.getCurrentInstance().getTaglibPalletteDrawer(id);
-//			moveup(PaletteItemManager.getCurrentInstance(), cat);
-//			super.performMoveUp(entry);
-//		}
-//	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.palette.PaletteCustomizer#canDelete(org.eclipse.gef.palette.PaletteEntry)
-	 */
-	public boolean canDelete(PaletteEntry entry) {
-		return false;
-	}
-
-	public List getNewEntryFactories() {
-		List list = new ArrayList(4);
-		list.add(new PaletteSeparatorFactory());
-		list.add(new PaletteStackFactory());
-		return list;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.palette.PaletteCustomizer#revertToSaved()
-	 */
-	public void revertToSaved() {
-		//note that reset is not currently part of IPaletteItemManager interface...
-		((PaletteItemManager)root.getPaletteManager()).reset();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.palette.PaletteCustomizer#save()
-	 */
-	public void save() {
-		DesignerPaletteCustomizationsHelper.save(root);
-//		PaletteItemManager.getCurrentInstance().reset();
-	}
-
-
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteCustomizerDialog.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteCustomizerDialog.java
deleted file mode 100644
index a46fbbf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteCustomizerDialog.java
+++ /dev/null
@@ -1,363 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.gef.palette.PaletteEntry;
-import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.gef.ui.palette.PaletteCustomizer;
-import org.eclipse.gef.ui.palette.customize.PaletteCustomizationAction;
-import org.eclipse.gef.ui.palette.customize.PaletteCustomizerDialog;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jst.jsf.common.ui.internal.utils.PluginImageHelper;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.editors.pagedesigner.PageDesignerResources;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.PaletteItemManager;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.TaglibPaletteDrawer;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Customization dialog for Web Page Designer palette items
- * @author mengbo
- * @version 1.5
- */
-public class DesignerPaletteCustomizerDialog extends PaletteCustomizerDialog {
-	private static final String DEFAULT_CUSTOMIZATIONS_EXPORT_FILENAME = "WPDPaletteCustomizations.xml";
-	
-	private static String DEFAULTEXTENSION = ".xml";//$NON-NLS-1$ 
-
-	/**
-	 * Constructor
-	 * @param shell
-	 * @param customizer
-	 * @param root
-	 */
-	public DesignerPaletteCustomizerDialog(Shell shell,
-			PaletteCustomizer customizer, PaletteRoot root) {
-		super(shell, customizer, root);
-
-	}
-
-	private PropertyChangeListener applyButtonUpdater = new PropertyChangeListener() {
-
-
-		public void propertyChange(PropertyChangeEvent evt) {
-			Button applyButton = getButton(PaletteCustomizerDialog.APPLY_ID);
-			if (applyButton == null) {
-				return;
-			}
-			applyButton.setEnabled(true);
-		}
-	};
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.window.Window#open()
-	 */
-	public int open() {
-		// save the current state before open
-		// save();
-		return super.open();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.palette.customize.PaletteCustomizerDialog#setActiveEntry(org.eclipse.gef.palette.PaletteEntry)
-	 */
-	protected void setActiveEntry(PaletteEntry entry) {
-		//remove listener on previous entry before adding to new entry
-		PaletteEntry pre = getSelectedPaletteEntry();
-		if (pre != null) {
-			pre.removePropertyChangeListener(applyButtonUpdater);
-		} else {
-			getButton(APPLY_ID).setEnabled(false);
-		}
-		
-		if (entry != null)
-			entry.addPropertyChangeListener(applyButtonUpdater);
-		
-		super.setActiveEntry(entry);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.palette.customize.PaletteCustomizerDialog#save()
-	 */
-	protected void save() {
-		super.save();
-		Button applyButton = getButton(PaletteCustomizerDialog.APPLY_ID);
-		if (applyButton != null) {
-			applyButton.setEnabled(false);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.gef.ui.palette.customize.PaletteCustomizerDialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
-	 */
-	protected void createButtonsForButtonBar(Composite parent) {
-		super.createButtonsForButtonBar(parent);
-		getButton(APPLY_ID).setEnabled(false);
-		// save();
-	}
-
-	/* (non-Javadoc)
-	 * Export action
-	 *
-	 */
-	private class ExportAction extends PaletteCustomizationAction {
-		
-		/**
-		 * Constructor
-		 */
-		public ExportAction() {
-			setEnabled(true);
-			setText(PageDesignerResources.getInstance().getString(
-					"DesignerPaletteCustomizerDialog.label.export")); //$NON-NLS-1$
-			setImageDescriptor(PluginImageHelper.getInstance()
-					.getImageDescriptor(DesignerPaletteImages.IMG_ELCL_EXPORT,
-							PDPlugin.getPluginId()));
-			setDisabledImageDescriptor(PluginImageHelper.getInstance()
-					.getImageDescriptor(DesignerPaletteImages.IMG_DLCL_EXPORT,
-							PDPlugin.getPluginId()));
-			setHoverImageDescriptor(PluginImageHelper.getInstance()
-					.getImageDescriptor(DesignerPaletteImages.IMG_CLCL_EXPORT,
-							PDPlugin.getPluginId()));
-		}
-
-		private void handleExport() {
-			final FileDialog fileDialog = new FileDialog(PDPlugin
-					.getActiveWorkbenchShell());
-			fileDialog.setFileName(DEFAULT_CUSTOMIZATIONS_EXPORT_FILENAME); //$NON-NLS-1$
-			String[] filterExtensions = new String[2];
-			filterExtensions[0] = "*.xml"; //$NON-NLS-1$
-			filterExtensions[1] = "*.*"; //$NON-NLS-1$
-			fileDialog.setFilterExtensions(filterExtensions);
-			fileDialog.setText("Export Palette Customizations");
-			String filename = fileDialog.open();
-			if (filename != null) {
-				if (!filename.endsWith(DEFAULTEXTENSION)) {
-					filename = filename + DEFAULTEXTENSION;
-				}
-				DesignerPaletteCustomizationsHelper
-					.exportCustomizations(PaletteItemManager.getCurrentInstance(), filename);
-
-
-				updateActions();
-			}
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.action.Action#run()
-		 */
-		public void run() {
-			handleExport();
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.gef.ui.palette.customize.PaletteCustomizationAction#update()
-		 */
-		public void update() {
-			//boolean enabled = false;
-//			PaletteEntry entry = getSelectedPaletteEntry();
-//			if (entry != null) {
-				// if (getCustomizer() instanceof DesignerPaletteCustomizer)
-				// enabled = ((DesignerPaletteCustomizer)
-				// getCustomizer()).canExport(entry);
-//			}
-			setEnabled(true);
-		}
-
-	}
-
-	/* (non-Javadoc)
-	 * Import action
-	 */
-	private class ImportAction extends PaletteCustomizationAction {
-		private DesignerPaletteCustomizerDialog designerPaletteCustomizerDialog;
-		
-		/**
-		 * Constructor
-		 * @param designerPaletteCustomizerDialog
-		 */
-		public ImportAction(DesignerPaletteCustomizerDialog designerPaletteCustomizerDialog) {
-			super();
-			this.designerPaletteCustomizerDialog = designerPaletteCustomizerDialog;
-			setEnabled(true);
-			setText(PageDesignerResources.getInstance().getString(
-					"DesignerPaletteCustomizerDialog.label.import")); //$NON-NLS-1$
-			setImageDescriptor(PluginImageHelper.getInstance()
-					.getImageDescriptor(DesignerPaletteImages.IMG_ELCL_IMPORT,
-							PDPlugin.getPluginId()));
-			setDisabledImageDescriptor(PluginImageHelper.getInstance()
-					.getImageDescriptor(DesignerPaletteImages.IMG_DLCL_IMPORT,
-							PDPlugin.getPluginId()));
-			setHoverImageDescriptor(PluginImageHelper.getInstance()
-					.getImageDescriptor(DesignerPaletteImages.IMG_CLCL_IMPORT,
-							PDPlugin.getPluginId()));
-			
-		}
-
-		private void handleImport() {
-//			PaletteEntry entry = designerPaletteCustomizerDialog.getSelectedPaletteEntry();
-			final FileDialog fileDialog = new FileDialog(PDPlugin
-					.getActiveWorkbenchShell());
-			fileDialog.setFileName(DEFAULT_CUSTOMIZATIONS_EXPORT_FILENAME); //$NON-NLS-1$
-			String[] filterExtensions = new String[2];
-			filterExtensions[0] = "*.xml"; //$NON-NLS-1$
-			filterExtensions[1] = "*.*"; //$NON-NLS-1$
-			fileDialog.setFilterExtensions(filterExtensions);
-			fileDialog.setText("Import Palette Customizations");
-			String filename = fileDialog.open();
-			if (filename != null) {		
-					//deselect current entry first
-					designerPaletteCustomizerDialog.close();		
-					
-//					getCustomizer().revertToSaved();
-					DesignerPaletteCustomizationsHelper
-						.importCustomizations((DesignerPaletteCustomizer)getCustomizer(), filename);
-					
-//					designerPaletteCustomizerDialog.setActiveEntry(entry);
-					((DesignerPaletteCustomizer)getCustomizer()).getDesignerPaletteRoot().refresh();
-					designerPaletteCustomizerDialog.open();
-//					designerPaletteCustomizerDialog.setActiveEntry(entry);
-			}
-		}
-
-		public void run() {
-			handleImport();
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.gef.ui.palette.customize.PaletteCustomizationAction#update()
-		 */
-		public void update() {
-			//nothing to do
-		}
-	}
-
-	/**
-	 * @return import action
-	 */
-	public Action getImportAction() {
-		return new ImportAction(this);
-	}
-
-	/**
-	 * @return export action
-	 */
-	public Action getExportAction() {
-		return new ExportAction();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.gef.ui.palette.customize.PaletteCustomizerDialog#createOutlineActions()
-	 */
-	protected List createOutlineActions() {
-		List actions = super.createOutlineActions();
-		actions.remove(0);// remove new action
-		actions.remove(0);// remove delete action
-		actions.add(new ImportAction(this));
-		actions.add(new ExportAction());
-
-		return actions;
-	}
-	
-	@Override
-	protected TreeViewer createOutlineTreeViewer(Composite composite) {
-		TreeViewer viewer = super.createOutlineTreeViewer(composite);
-		viewer.setContentProvider(new DesignerPaletteContentProvider());
-		return viewer;
-	}
-
-	
-	/**
-	 * Content provider for dialog.
-	 * Displays only {@link TaglibPaletteDrawer}s
-	 */
-	private static class DesignerPaletteContentProvider implements ITreeContentProvider {
-
-		public Object[] getChildren(Object parentElement) {
-			if (parentElement instanceof DesignerPaletteRoot){
-				List libs = new ArrayList();
-				List children = ((DesignerPaletteRoot)parentElement).getChildren();				
-				if (!children.isEmpty()) {
-					for (Iterator it=children.iterator();it.hasNext();){
-						PaletteEntry entry = (PaletteEntry)it.next();
-						if (entry instanceof TaglibPaletteDrawer)
-							libs.add(entry);
-					}
-					if (!libs.isEmpty())
-						return libs.toArray();
-				}
-			}
-			return null;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#getParent(java.lang.Object)
-		 */
-		public Object getParent(Object element) {
-			return ((PaletteEntry)element).getParent();
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren(java.lang.Object)
-		 */
-		public boolean hasChildren(Object element) {
-			return false;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {
-			Object[] elements = new Object[0];
-			if (inputElement instanceof DesignerPaletteRoot){
-				elements = getChildren(inputElement);
-				if (elements == null) {
-					elements = new Object[0];
-				}
-			}
-			return elements;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-			//nothing to do
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			//won't change			
-		}
-
-		
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteImages.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteImages.java
deleted file mode 100644
index 3b1d7e1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteImages.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-/**
- * Palette Image constants
- * @author mengbo
- */
-public class DesignerPaletteImages {
-	/**
-	 * Import hover image
-	 */
-	public static final String IMG_CLCL_IMPORT = "icons/palette/GENERIC/small/PD_Palette_Import_Hover.gif";
-
-	/**
-	 * Export hover image
-	 */
-	public static final String IMG_CLCL_EXPORT = "icons/palette/GENERIC/small/PD_Palette_Export_Hover.gif";
-
-	/**
-	 * Import disabled image
-	 */
-	public static final String IMG_DLCL_IMPORT = "icons/palette/GENERIC/small/PD_Palette_Import_Disabled.gif";
-
-	/**
-	 * Export disabled image
-	 */
-	public static final String IMG_DLCL_EXPORT = "icons/palette/GENERIC/small/PD_Palette_Export_Disabled.gif";
-
-	/**
-	 * Import image
-	 */
-	public static final String IMG_ELCL_IMPORT = "icons/palette/GENERIC/small/PD_Palette_Import.gif";
-
-	/**
-	 * Export image
-	 */
-	public static final String IMG_ELCL_EXPORT = "icons/palette/GENERIC/small/PD_Palette_Export.gif";
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteRoot.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteRoot.java
deleted file mode 100644
index 31c9d03..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteRoot.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.gef.Tool;
-import org.eclipse.gef.palette.MarqueeToolEntry;
-import org.eclipse.gef.palette.PaletteEntry;
-import org.eclipse.gef.palette.PaletteGroup;
-import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.gef.palette.SelectionToolEntry;
-import org.eclipse.gef.palette.ToolEntry;
-import org.eclipse.jst.pagedesigner.editors.pagedesigner.PageDesignerResources;
-import org.eclipse.jst.pagedesigner.tools.RangeSelectionTool;
-
-/**
- * @author mengbo
- */
-public class DesignerPaletteRoot extends PaletteRoot {
-	private IPaletteItemManager _manager;
-    
-	/**
-	 * Creates a new DesignerPaletteRoot instance.
-	 * @param manager 
-	 */
-	public DesignerPaletteRoot(IPaletteItemManager manager) {
-		// create root
-		super();
-
-		this._manager = manager;
-		setupBasicItems();
-		loadItems();
-
-		// TODO: register listener on the manager for toolpalette change event.
-
-	}
-
-	/**
-	 * @return IPaletteItemManager instance for this root
-	 */
-	public IPaletteItemManager getPaletteManager() {
-		return this._manager;
-	}
-
-	private void setupBasicItems() {
-		// Preferences prefs = PDPlugin.getDefault().getPluginPreferences();
-		// _showAll = prefs.getBoolean(IJMTConstants.PREF_PALETTE_SHOW_ALL);
-
-		// a group of default control tools
-		// JSFPalette.DefaultGroup.LabelJSFPallete=Controls
-		PaletteGroup controls = new PaletteGroup(PageDesignerResources
-				.getInstance().getString(
-						"JSFPalette.DefaultGroup.LabelJSFPallete")); //$NON-NLS-1$
-		add(controls);
-		// the selection tool
-		ToolEntry tool = new SelectionToolEntry() {
-			public Tool createTool() {
-				return new RangeSelectionTool();
-			}
-		};
-		controls.add(tool);
-
-		// use selection tool as default entry
-		setDefaultEntry(tool);
-
-		// the marquee selection tool
-		controls.add(new MarqueeToolEntry());
-	}
-
-	private void loadItems() {
-		// _showAll =
-		// PDPlugin.getDefault().getPluginPreferences().getBoolean(IJMTConstants.PREF_PALETTE_SHOW_ALL);
-		// remove other things first.
-		removeItems();
-
-		List categories = _manager.getAllCategories();
-		this.addAll(categories);
-	}
-
-	/**
-	 * remove everything from the paletteroot
-	 * 
-	 */
-	protected void removeItems() {
-		// we try to remove anything other than the basic
-		// group that have the selectentry and marqeeentry
-		List children1 = new ArrayList(getChildren());
-		children1.remove(0); // remove the first one
-		for (int i = 0, n = children1.size(); i < n; i++) {
-			this.remove((PaletteEntry) children1.get(i));
-		}
-	}
-
-	/**
-	 * refresh the palette, normally caused by preference change.
-	 */
-	public void refresh() {
-		loadItems();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteRootFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteRootFactory.java
deleted file mode 100644
index 3f81a7f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteRootFactory.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.gef.ui.palette.FlyoutPaletteComposite.FlyoutPreferences;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.PaletteItemManager;
-
-/**
- * Factory for creating DesignerPaletteRoots
- * @author mengbo 
- */
-public class DesignerPaletteRootFactory {
-	/** Default palette size. */
-	private static final int DEFAULT_PALETTE_SIZE = 125;
-
-	/** Preference ID used to persist the palette location. */
-	private static final String PALETTE_DOCK_LOCATION = "DesignerPaletteRootFactory.Location";
-
-	/** Preference ID used to persist the palette size. */
-	private static final String PALETTE_SIZE = "DesignerPaletteRootFactory.Size";
-
-	/** Preference ID used to persist the flyout palette's state. */
-	private static final String PALETTE_STATE = "DesignerPaletteRootFactory.State";
-
-	/**
-	 * Return a {@link FlyoutPreferences} instance used to save/load the preferences of
-	 * a flyout palette.
-	 * @return FlyoutPreferences
-	 */
-	public static FlyoutPreferences createPalettePreferences() {
-		// set default flyout palette preference values, in case the preference
-		// store
-		// does not hold stored values for the given preferences
-		getPreferenceStore().setDefault(PALETTE_DOCK_LOCATION, -1);
-		getPreferenceStore().setDefault(PALETTE_STATE, -1);
-		getPreferenceStore().setDefault(PALETTE_SIZE, DEFAULT_PALETTE_SIZE);
-
-		return new FlyoutPreferences() {
-			public int getDockLocation() {
-				return getPreferenceStore().getInt(PALETTE_DOCK_LOCATION);
-			}
-
-			public int getPaletteState() {
-				return getPreferenceStore().getInt(PALETTE_STATE);
-			}
-
-			public int getPaletteWidth() {
-				return getPreferenceStore().getInt(PALETTE_SIZE);
-			}
-
-			public void setDockLocation(int location) {
-				getPreferenceStore().setValue(PALETTE_DOCK_LOCATION, location);
-			}
-
-			public void setPaletteState(int state) {
-				getPreferenceStore().setValue(PALETTE_STATE, state);
-			}
-
-			public void setPaletteWidth(int width) {
-				getPreferenceStore().setValue(PALETTE_SIZE, width);
-			}
-		};
-	}
-
-	/**
-	 * Returns the preference store for the PDPlugin.
-	 * 
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#getPreferenceStore()
-	 */
-	private static IPreferenceStore getPreferenceStore() {
-		return PDPlugin.getDefault().getPreferenceStore();
-	}
-
-	/**
-	 * Creates the PaletteRoot and adds all palette elements. Use this factory
-	 * method to create a new palette for your graphical editor.
-	 * @param project 
-	 * @return a new PaletteRoot
-	 */
-	public static PaletteRoot createPaletteRoot(IProject project) {
-		PaletteItemManager manager = PaletteItemManager.getInstance(project);
-		if (manager == null) {
-			return null;
-		}
-		manager.reset();
-		PaletteRoot palette = new DesignerPaletteRoot(manager);
-		return palette;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteViewer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteViewer.java
deleted file mode 100644
index d25c94f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteViewer.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import java.util.List;
-
-import org.eclipse.core.runtime.Preferences;
-import org.eclipse.core.runtime.Preferences.PropertyChangeEvent;
-import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.gef.ui.palette.PaletteCustomizer;
-import org.eclipse.gef.ui.palette.PaletteViewer;
-import org.eclipse.gef.ui.palette.customize.PaletteCustomizerDialog;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.PaletteItemManager;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * XXX: currently create this class is just for add/remove listener to
- * preference change, so can refresh the palette.
- * 
- * @author mengbo
- * @author mengbo
- * @version 1.5
- */
-public class DesignerPaletteViewer extends PaletteViewer {
-
-	private PaletteCustomizerDialog _customizerDialog = null;
-
-	private DesignerPaletteCustomizer _customizer;
-
-	/**
-	 * 
-	 */
-	public DesignerPaletteViewer() {
-		super();
-
-		this.enableVerticalScrollbar(true);
-	}
-
-	Preferences.IPropertyChangeListener listener = new Preferences.IPropertyChangeListener() {
-		public void propertyChange(PropertyChangeEvent event) {
-			PaletteRoot root = getPaletteRoot();
-			if (root instanceof DesignerPaletteRoot) {
-//				((DesignerPaletteRoot) root).refresh();
-				// XXX: setActiveTool to null to workaround GEF bug of NPE
-				// setActiveTool(null);
-			}
-		}
-	};
-	
-	IEntryChangeListener _paletteModelListener = new IEntryChangeListener() {
-
-		public void modelChanged(List oldDefinitions, List newDefinitions) {
-			final PaletteRoot root = getPaletteRoot();
-			if (root instanceof DesignerPaletteRoot) {
-                Control viewerControl = getControl();
-                
-                if (viewerControl != null && !viewerControl.isDisposed())
-                {
-                    Display  display = viewerControl.getDisplay();
-                    
-                    if (display != null && !display.isDisposed())
-                    {
-                        // this updates the UI, so it must be run on
-                        // the display thread
-                        display.asyncExec(new Runnable()
-                        {
-                            public void run() {
-                                ((DesignerPaletteRoot) root).refresh();
-                            }
-                        });
-                    }
-                }
-			}
-		}
-
-	};
-
-//
-//	IResourceChangeListener _resourceChangeListener = new IResourceChangeListener() {
-//
-//		public void resourceChanged(IResourceChangeEvent event) {
-//			IResourceDeltaVisitor visitor = new IResourceDeltaVisitor() {
-//				public boolean visit(IResourceDelta delta) throws CoreException {
-//					IResource resource = delta.getResource();
-//					// FIXME need make performance better
-//					if (resource.getType() == IResource.FILE
-//							&& (delta.getFlags() & IResourceDelta.CONTENT) != 0) {
-//						String ext = ((IFile) resource).getFileExtension();
-//						// resource.getFullPath().
-//						if (ext != null
-//								&& ("tld".equalsIgnoreCase(ext) || "jar"
-//										.equalsIgnoreCase(ext))) {
-//							PaletteRoot root = getPaletteRoot();
-//							if (root instanceof DesignerPaletteRoot) {
-//								IPaletteItemManager imanager = ((DesignerPaletteRoot) root)
-//										.getPaletteManager();
-//								if (imanager instanceof PaletteItemManager) {
-//									PaletteItemManager manager = (PaletteItemManager) imanager;
-//									manager.reset();
-//								}
-//
-//							}
-//						}
-//					}
-//					return true;
-//				}
-//			};
-//			try {
-//				IResourceDelta delta = event.getDelta();
-//				if (delta != null) {
-//					delta.accept(visitor);
-//				}
-//			} catch (CoreException e) {
-//				// ignore
-//			}
-//		}
-//
-//	};
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.palette.PaletteViewer#hookControl()
-	 */
-	protected void hookControl() {
-		super.hookControl();
-		PDPlugin.getDefault().getPluginPreferences().addPropertyChangeListener(
-				listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.palette.PaletteViewer#unhookControl()
-	 */
-	protected void unhookControl() {
-		PDPlugin.getDefault().getPluginPreferences()
-				.removePropertyChangeListener(listener);
-		// remove palette model change listener
-		PaletteRoot root = getPaletteRoot();
-		if (root instanceof DesignerPaletteRoot) {
-			if (_customizer != null){
-				_customizer.setPaletteRoot(null);
-			}
-			IPaletteItemManager imanager = ((DesignerPaletteRoot) root)
-					.getPaletteManager();
-			if (imanager instanceof PaletteItemManager) {
-				PaletteItemManager manager = (PaletteItemManager) imanager;
-//				ResourcesPlugin.getWorkspace().removeResourceChangeListener(
-//						_resourceChangeListener);
-				manager.removeEntryChangeListener(_paletteModelListener);
-				PaletteItemManager.clearPaletteItemManager();
-			}
-		}
-		super.unhookControl();
-	}
-
-	public PaletteCustomizerDialog getCustomizerDialog() {
-		if (_customizerDialog == null){
-			_customizerDialog = DesignerPaletteCustomizationsHelper.getNewCustomizerDialog(this, getCustomizer() );	
-		}
-		return _customizerDialog;
-	}
-
-	public PaletteCustomizer getCustomizer() {
-		if (_customizer == null){
-			_customizer = DesignerPaletteCustomizationsHelper.getNewCustomizer();
-			_customizer.setPaletteRoot((DesignerPaletteRoot)this.getPaletteRoot());
-		}
-		return _customizer;
-	}
-	
-	public void setPaletteRoot(PaletteRoot root) {
-		super.setPaletteRoot(root);
-		// add palette model change listener
-		// PaletteRoot root = getPaletteRoot();
-		if (root instanceof DesignerPaletteRoot) {
-			((DesignerPaletteRoot) root).getPaletteManager()
-					.addEntryChangeListener(_paletteModelListener);
-//			ResourcesPlugin.getWorkspace().addResourceChangeListener(
-//					_resourceChangeListener);
-		}
-
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteViewerProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteViewerProvider.java
deleted file mode 100644
index 203e40f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteViewerProvider.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import org.eclipse.gef.EditDomain;
-import org.eclipse.gef.internal.ui.palette.editparts.DrawerEditPart;
-import org.eclipse.gef.ui.palette.PaletteContextMenuProvider;
-import org.eclipse.gef.ui.palette.PaletteViewer;
-import org.eclipse.gef.ui.palette.PaletteViewerProvider;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dnd.internal.DesignerTemplateTransferDragSourceListener;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.TaglibPaletteDrawer;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * @author mengbo
- */
-public class DesignerPaletteViewerProvider extends PaletteViewerProvider {
-	/**
-	 * @param graphicalViewerDomain
-	 */
-	public DesignerPaletteViewerProvider(EditDomain graphicalViewerDomain) {
-		super(graphicalViewerDomain);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.palette.PaletteViewerProvider#configurePaletteViewer(org.eclipse.gef.ui.palette.PaletteViewer)
-	 */
-	protected void configurePaletteViewer(PaletteViewer viewer) {
-		// super.configurePaletteViewer(viewer);
-		viewer.setContextMenu(new PaletteContextMenuProvider(viewer) {
-			public void buildContextMenu(IMenuManager menu) {
-				StructuredSelection sel = (StructuredSelection)getViewer().getSelection();
-				if (sel != null 
-						&& sel.getFirstElement() instanceof DrawerEditPart
-						&& ((DrawerEditPart)sel.getFirstElement()).getDrawer() instanceof TaglibPaletteDrawer)
-					menu.add(new HideTagLibAction((DrawerEditPart)sel.getFirstElement(), "Hide"));
-				super.buildContextMenu(menu);
-			}
-		});
-
-		// XXX: should only use the following when we use Template
-		viewer
-				.addDragSourceListener(new DesignerTemplateTransferDragSourceListener(
-						viewer));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.palette.PaletteViewerProvider#createPaletteViewer(org.eclipse.swt.widgets.Composite)
-	 */
-	public PaletteViewer createPaletteViewer(Composite parent) {
-		PaletteViewer pViewer = new DesignerPaletteViewer();
-		pViewer.createControl(parent);
-		configurePaletteViewer(pViewer);
-		pViewer.setCustomizer(new DesignerPaletteCustomizer());
-		hookPaletteViewer(pViewer);
-
-		PlatformUI
-				.getWorkbench()
-				.getHelpSystem()
-				.setHelp(
-						parent,
-						PDPlugin
-								.getResourceString("DesignerPaletteViewerProvider.help.id"));
-
-		return pViewer;
-	}
-	
-	private static class HideTagLibAction extends Action {
-		private DrawerEditPart tagLib;
-		
-		/**
-		 * Constructor
-		 * @param tagLibDrawer
-		 * @param string
-		 */
-		public HideTagLibAction(DrawerEditPart tagLibDrawer, String string) {
-			super(string);
-			this.tagLib = tagLibDrawer;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.action.Action#run()
-		 */
-		public void run() {
-			TaglibPaletteDrawer pd = (TaglibPaletteDrawer)tagLib.getDrawer();
-			pd.setVisible(false);
-			DesignerPaletteCustomizationsHelper.hideTaglibDrawer(pd);
-		}		
-		
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IEntryChangeListener.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IEntryChangeListener.java
deleted file mode 100644
index 2f4667e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IEntryChangeListener.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import java.util.List;
-
-/**
- * @author mengbo
- */
-public interface IEntryChangeListener {
-	/**
-	 * @param oldDefinitions
-	 *            the old taglib definitions
-	 * @param newDefinitions
-	 *            the new taglib definitions
-	 */
-	void modelChanged(List oldDefinitions, List newDefinitions);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IPaletteConstants.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IPaletteConstants.java
deleted file mode 100644
index dcbf651..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IPaletteConstants.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-/**
- * Constants used by palette customizations persistence
- * 
- * @author mengbo
- */
-public interface IPaletteConstants {
-	/**
-	 * 
-	 */
-	public static final String BUNDLE_ID = "org.eclipse.jst.pagedesigner"; //$NON-NLS-1$
-
-	/**
-	 * contant for palett-item element name
-	 */
-	public static final String ROOT = "palette-item"; //$NON-NLS-1$
-
-	/**
-	 * constant for uri attribute
-	 */
-	public static final String URI = "uri"; //$NON-NLS-1$
-
-	/**
-	 * Constant for hidden attribute
-	 */
-	public static final String ISHIDDEN = "hidden"; //$NON-NLS-1$
-
-	/**
-	 * constant for id attribute
-	 */
-	public static final String ID = "id"; //$NON-NLS-1$
-	
-	/**
-	 * constant for category element name
-	 */
-	public static final String CATEGORY_TAG = "category"; //$NON-NLS-1$
-	
-//OLD - no longer/currently used
-
-//	public static final String EXTENSION_POINT_ID = "ResourceContributions"; //$NON-NLS-1$
-//	public static final String FILENAME = "/tag.xml"; //$NON-NLS-1$
-//	public static final String TAGNAME = "tagName"; //$NON-NLS-1$
-//	public static final String ITEM_TAG = "item"; //$NON-NLS-1$
-//	public static final String EXPERT = "expert"; //$NON-NLS-1$
-//	public static final String LARGEICON = "largeIcon"; //$NON-NLS-1$
-//	public static final String SMALLICON = "smallIcon"; //$NON-NLS-1$
-//	public static final String LABEL = "label"; //$NON-NLS-1$
-//	public static final String INITIALSTATE = "initialState"; //$NON-NLS-1$
-//	public static final String SHORTDESC = "shortDesc"; //$NON-NLS-1$
-//	public static final String ATTRIBUTE_TAG = "attribute"; //$NON-NLS-1$
-//	public static final String NAME = "name"; //$NON-NLS-1$
-//	public static final String VALUE = "value"; //$NON-NLS-1$
-//	public static final String ICONPREFIX = "iconPrefix"; //$NON-NLS-1$
-//	public static final String TAGLIBEXT = "capability"; //$NON-NLS-1$
-//	public static final String JARPROTO = "jar:file://"; //$NON-NLS-1$
-//	public static final String FILEPROTO = "file://"; //$NON-NLS-1$
-//	public static final String REQUIREHFORM = "requireHForm"; //$NON-NLS-1$
-//	public static final String JSFCOMPONENTCATEGORY = "jsfComponentCategory"; //$NON-NLS-1$
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IPaletteItemManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IPaletteItemManager.java
deleted file mode 100644
index aa047ff..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/IPaletteItemManager.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.TaglibPaletteDrawer;
-
-/**
- * PaletteItemManager interface.
- * 
- * NOT intended to be implemented by clients
- * 
- * @author mengbo
- */
-public interface IPaletteItemManager {
-	/**
-	 * @return IProject
-	 */
-	public IProject getProject();
-	
-	/**
-	 * @return list of {@link TaglibPaletteDrawer}s being managed for this project 
-	 */
-	public List/*TaglibPaletteDrawer*/ getAllCategories();
-
-	/**
-	 * Create a TaglibPaletteDrawer with given label for given id
-	 * 
-	 * @param id
-	 * @param label 
-	 * @return TaglibPaletteDrawer
-	 */
-	public TaglibPaletteDrawer createTaglibPaletteDrawer(String id, String label);
-
-	/**
-	 * Retrieve the TaglibPaletteDrawer by id.  May be null.
-	 * 
-	 * @param id
-	 * @return TaglibPaletteDrawer
-	 */
-	public TaglibPaletteDrawer getTaglibPalletteDrawer(String id);
-
-	/**
-	 * Locate by id, and if not found,  create a TaglibPaletteDrawer using label and id
-	 * 
-	 * @param id
-	 * @param label
-	 * @return TaglibPaletteDrawer
-	 */
-	public TaglibPaletteDrawer findOrCreateCategory(String id, String label);
-
-	/**
-	 * Adds a listener to the list of those notified when the model contents are
-	 * replaced
-	 * 
-	 * @param listener -
-	 *            the listener to add
-	 */
-	void addEntryChangeListener(IEntryChangeListener listener);
-
-	/**
-	 * Adds a listener to the list of those notified when the model contents are
-	 * replaced
-	 * 
-	 * @param listener -
-	 *            the listener to remove
-	 */
-	void removeEntryChangeListener(IEntryChangeListener listener);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/ShowAllAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/ShowAllAction.java
deleted file mode 100644
index f115bfe..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/ShowAllAction.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import org.eclipse.core.runtime.Preferences;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.pagedesigner.IJMTConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-
-/**
- * @author mengbo
- */
-public class ShowAllAction extends Action {
-	Preferences _preferences = null;
-
-	/**
-	 * @param pluginPreferences
-	 */
-	public ShowAllAction(Preferences pluginPreferences) {
-		super(PDPlugin.getResourceString("ShowAllAction.ActionLabel.ShowAll")); //$NON-NLS-1$
-		_preferences = pluginPreferences;
-		boolean showAll = _preferences
-				.getBoolean(IJMTConstants.PREF_PALETTE_SHOW_ALL);
-		this.setChecked(showAll);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		boolean showAll = _preferences
-				.getBoolean(IJMTConstants.PREF_PALETTE_SHOW_ALL);
-		// toggle the show all status. preference will fire out change event,
-		// and palettes
-		// receive this event will refresh
-		_preferences.setValue(IJMTConstants.PREF_PALETTE_SHOW_ALL, !showAll);
-		this.setChecked(!showAll);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/TagImageManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/TagImageManager.java
deleted file mode 100644
index d76a0b9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/TagImageManager.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette;
-
-import java.util.Iterator;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.Model;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.internal.IImageDescriptorProvider;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider;
-import org.eclipse.jst.jsf.common.metadata.internal.TraitValueHelper;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.utils.JSFSharedImages;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfos;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * Locates and creates Images for tags using the common metadata framework.
- * 
- * Images are cached in the PDPlugin's ImageRegistry.  
- * 
- * Some code is being duplicated in palette helper.   PaletteHelper should be re-factored to use this code
- * 
- */
-public class TagImageManager {
-	private static TagImageManager INSTANCE = null;
-	
-	private final static ImageDescriptor DEFAULT_SMALL_ICON = JSFUICommonPlugin
-	.getDefault().getImageDescriptor(
-		JSFSharedImages.DEFAULT_PALETTE_TAG_IMG);
-
-	private final static ImageDescriptor DEFAULT_LARGE_ICON = PDPlugin
-		.getDefault().getImageDescriptor(
-				"palette/GENERIC/large/PD_Palette_Default.gif");
-
-	private static final String TRAIT_ICON_SMALL = "small-icon";
-
-	private static final String TRAIT_ICON_LARGE = "large-icon";
-	
-	/**
-	 * @return singleton instance 
-	 */
-	public synchronized static TagImageManager getInstance() {
-		if (INSTANCE == null) {
-			INSTANCE = new TagImageManager();
-		}
-		return INSTANCE;
-	}	
-	
-	/**
-	 * Returns small image using metadata and may be null.  Caller should NOT dispose the image, but should call TagImageManager's dispose(image)
-	 * @param project
-	 * @param nsUri
-	 * @param tagName
-	 * @return small image using metadata.  May be null.
-	 */
-	public Image getSmallIconImage(IProject project, String nsUri, String tagName) {
-		Image image = null;
-		Model model = getModel(project, nsUri);
-		if (model != null){
-			ImageDescriptor imgDesc = getSmallIconImageDescriptor(model, tagName);
-			image = getOrCreateImage(imgDesc);
-		}
-		
-		return image;
-	}
-
-	/**
-	 * @param project
-	 * @param nsUri
-	 * @param tagName
-	 * @return large image using metadata.  May be null.
-	 */
-	public Image getLargeIconImage(IProject project, String nsUri, String tagName) {
-		Image image = null;
-		Model model = getModel(project, nsUri);
-		if (model != null){
-			ImageDescriptor imgDesc = getLargeIconImageDescriptor(model, nsUri);
-			image = getOrCreateImage(imgDesc);	
-		}
-		
-		return image;
-	}
-	
-	/**
-	 * Gets, and creates if necessary, a shared image.
-	 * @param imageDescriptor
-	 * @return Image from shared cache
-	 */
-	public static Image getOrCreateImage(ImageDescriptor imageDescriptor) {
-		Image image = null;
-		if (imageDescriptor != null){
-			image = PDPlugin.getDefault().getImageRegistry().get(imageDescriptor.toString());
-			if (image == null ){
-				image = imageDescriptor.createImage();
-				PDPlugin.getDefault().getImageRegistry().put(imageDescriptor.toString(), image);
-			} else if (image.isDisposed()){ //should not occur, but handling just in case				
-				PDPlugin.getDefault().getImageRegistry().remove(imageDescriptor.toString());
-				image = imageDescriptor.createImage();
-				PDPlugin.getDefault().getImageRegistry().put(imageDescriptor.toString(), image);
-			}
-		}
-		return image;
-	}
-	
-	private Model getModel(IProject project, String nsUri) {
-		ITaglibDomainMetaDataModelContext modelContext = TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(project, nsUri);
-		Model model =TaglibDomainMetaDataQueryHelper.getModel(modelContext);
-		// no caching at this time so there is no need to listen to model notifications
-//		if (model != null && !hasAdapter(model))
-//			addAdapter(model);
-		return model;
-	}
-
-
-//	private void addAdapter(Model model) {
-//		if (model != null){			
-////			model.eAdapters().add(INSTANCE);  
-//		}		
-//	}
-//
-//	private boolean hasAdapter(Model model) {
-//		for(Adapter a : model.eAdapters()){
-//			if (a == INSTANCE)
-//				return true;
-//		}
-//		return false;
-//	}
-
-	private ImageDescriptor getSmallIconImageDescriptor(Model model, String tagName) {
-		return getIconImageDescriptor(model, tagName, true);
-	}
-	
-	private ImageDescriptor getLargeIconImageDescriptor(Model model, String tagName) {
-		return getIconImageDescriptor(model, tagName, false);
-	}
-	
-	private ImageDescriptor getIconImageDescriptor(Model model, String tagName, boolean small) {		
-		ImageDescriptor icon = null;
-		
-		//use palette infos if available
-		Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(model, "paletteInfos");
-		if (trait != null){
-			PaletteInfos tags = (PaletteInfos)trait.getValue();
-			for (Iterator it=tags.getInfos().iterator();it.hasNext();){
-				PaletteInfo tag = (PaletteInfo)it.next();
-				if (tag.getId().equalsIgnoreCase(tagName)){					
-					IMetaDataSourceModelProvider sourceProvider = ((Trait)tag.eContainer().eContainer()).getSourceModelProvider();
-					if (small)
-						icon = getImageDescriptorFromString(sourceProvider, tag.getSmallIcon(), DEFAULT_SMALL_ICON);
-					else
-						icon = getImageDescriptorFromString(sourceProvider, tag.getLargeIcon(), DEFAULT_LARGE_ICON);
-					
-					break;
-				}
-			}	
-		}
-		if (icon == null) {
-			for (Iterator it=model.getChildEntities().iterator();it.hasNext();){
-				Entity tagAsEntity = (Entity)it.next();
-				if (tagAsEntity.getId().equalsIgnoreCase(tagName)){										
-					if (small)
-						icon = getImageDescriptorFromTagTraitValueAsString(tagAsEntity, TRAIT_ICON_SMALL, DEFAULT_SMALL_ICON);
-					else
-						icon = getImageDescriptorFromTagTraitValueAsString(tagAsEntity, TRAIT_ICON_LARGE, DEFAULT_LARGE_ICON);	
-					
-					break;
-				}				
-			}
-			
-		}
-
-		return icon;
-	}
-		
-	private ImageDescriptor getImageDescriptorFromString(IMetaDataSourceModelProvider sourceModelProvider,  String imgDesc, ImageDescriptor defaultValue){
-		ImageDescriptor image = defaultValue;
-		IImageDescriptorProvider imageProvider = (IImageDescriptorProvider)sourceModelProvider.getAdapter(IImageDescriptorProvider.class);			
-		if (imageProvider != null){
-			image = imageProvider.getImageDescriptor(imgDesc);
-		}
-		return image;
-	}
-	
-	private ImageDescriptor getImageDescriptorFromTagTraitValueAsString(Entity entity, String key, ImageDescriptor defaultValue){
-		Trait t = TaglibDomainMetaDataQueryHelper.getTrait(entity, key);
-		if (t != null){
-			String imgDesc = TraitValueHelper.getValueAsString(t);
-			return getImageDescriptorFromString(t.getSourceModelProvider(), imgDesc, defaultValue);
-		}
-		return defaultValue;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/TagToolPaletteEntry.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/TagToolPaletteEntry.java
deleted file mode 100644
index 7f14afb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/TagToolPaletteEntry.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.pagedesigner.editors.palette;
-
-import org.eclipse.gef.Tool;
-import org.eclipse.gef.palette.ToolEntry;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.TaglibPaletteDrawer;
-import org.eclipse.jst.pagedesigner.itemcreation.ItemCreationTool;
-
-/**
- * Represents a tag palette item entry in the web page designer palette
- *
- */
-public class TagToolPaletteEntry extends ToolEntry {
-
-	private String tagName;
-	
-	/**
-	 * Constructor
-	 * @param tagName
-	 * @param label
-	 * @param shortDescription
-	 * @param iconSmall
-	 * @param iconLarge
-	 */
-	public TagToolPaletteEntry(String tagName, String label, String shortDescription,
-			ImageDescriptor iconSmall, ImageDescriptor iconLarge) {
-		super(label, shortDescription, iconSmall, iconLarge);
-		this.tagName = tagName;
-	}
-
-	/**
-	 * @return tagName
-	 */
-	public String getTagName(){
-		return tagName;
-	}
-	
-	/**
-	 * Convenience method returning the tag libraries default prefix, if applicable
-	 * @return default prefix 
-	 */
-	public String getDefaultPrefix(){
-		return ((TaglibPaletteDrawer)getParent()).getDefaultPrefix();
-	}
-
-	/**
-	 * @return uri of the tag's library
-	 */
-	public String getURI(){
-		return ((TaglibPaletteDrawer)getParent()).getURI();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.gef.palette.ToolEntry#createTool()
-	 */
-	public Tool createTool() {
-		return new ItemCreationTool(this);
-	}
-	
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/PaletteElementTemplateHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/PaletteElementTemplateHelper.java
deleted file mode 100644
index 5c1cfa6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/PaletteElementTemplateHelper.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette.impl;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationInfo;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.editors.palette.TagToolPaletteEntry;
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMText;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-import org.xml.sax.SAXException;
-
-/**
- * 
- * @author mengbo
- */
-public class PaletteElementTemplateHelper {
-	//private static final String TEMPLATE_ITEM_NAME = "template";
-
-	private static final String PREFIX_ATTRIBUTE = "_uri_";
-
-//	private static Logger _log = PDPlugin
-//			.getLogger(PaletteElementTemplateHelper.class);
-
-	/**
-	 * This method is used to process template element which is read from .xmi
-	 * file and generate default element.
-	 * 
-	 * @param model
-	 * @param element
-	 * @param tagItem
-	 * @param tagCreationInfo 
-	 */
-	public static void applyTemplate(IDOMModel model, Element element,
-			TagToolPaletteEntry tagItem, TagCreationInfo tagCreationInfo) {
-		if (element == null || element.getLocalName() == null) {
-			return;
-		}
-		
-		Node[] templateNodes = getTemplateNodes(model,  tagCreationInfo);
-		if (templateNodes != null) {
-			for (int i=0;i<templateNodes.length;i++){
-				Node anode = templateNodes[i];
-				element.appendChild(anode);				
-			}
-		}
-	}
-
-	private static Node[] getTemplateNodes(IDOMModel model,
-			TagCreationInfo tagCreationInfo) {
-
-		if (tagCreationInfo == null)
-			return null;
-		
-		String template = (String)tagCreationInfo.getTemplate();
-		if (template != null){
-			
-			final String nodeStr = prepareNode(template);//(String)template.getTemplate();
-			final Logger logger = PDPlugin.getLogger(PaletteElementTemplateHelper.class); 
-			try {
-				DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-				factory.setNamespaceAware(true);
-				factory.setValidating(false);
-				DocumentBuilder builder = factory.newDocumentBuilder();
-				Document doc = builder.parse(new ByteArrayInputStream( nodeStr.getBytes()));
-				Node beginNode = doc.getFirstChild();
-				Node templateNode = beginNode.cloneNode(true);//model.getDocument().importNode(beginNode, true);
-				Node[] templateNodes = applyPrefixes(model, tagCreationInfo, templateNode.getChildNodes(), model.getDocument());
-				return templateNodes;
-			} catch (ParserConfigurationException e) {
-			    logger.error(e);
-			} catch (SAXException e) {
-                logger.error(e);
-			} catch (IOException e) {
-                logger.error(e);
-			} catch (Exception e){
-                logger.error(e);
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param template
-	 * @return xml as String wrapped by a <begin> node as template may not have a single root element
-	 */
-	private static String prepareNode(String template) {
-		StringBuffer buf = new StringBuffer("<begin>");
-		buf.append(template);
-		buf.append("</begin>");
-		return buf.toString();
-	}
-
-	/**
-	 * Use the actrual prefixs of jsf html and jsf core to set the prefix of
-	 * each node declared in template.
-	 * @param model 
-	 * @param info 
-	 * @param templateNodes 
-	 * @param document 
-	 * @return Node[]
-	 * 
-	 */
-	public static Node[] applyPrefixes(IDOMModel model, TagCreationInfo info,
-			NodeList templateNodes, Document document) {
-		List result = new ArrayList();
-		for (int i = 0, n = templateNodes.getLength(); i < n; i++) {
-			Node node = cloneNodeDeep(model, document, templateNodes.item(i));
-			if (node instanceof Element) {
-				result.add(node);
-			}
-		}
-		return (Node[]) result.toArray(new Node[result.size()]);
-	}
-
-	/**
-	 * TODO: Later we may add some logic to reference the tld file through tag
-	 * name to resolve the prefixs directly.
-	 */
-	private static void internalApplyPrefixes(IDOMModel model, Element refNode, Element node) {
-		if (node != null && refNode != null) {
-			String uri = refNode.getAttribute(PREFIX_ATTRIBUTE); //$NON-NLS-1$
-			if (uri != null) {
-				String prefix = JSPUtil.getOrCreatePrefix(model, uri, null);
-				node.setPrefix(prefix);
-			}
-		}
-	}
-
-
-	/**
-	 * A deep clone of the sourceNode
-	 * @param model
-	 * @param destDoc
-	 * @param sourceNode
-	 * @return Node
-	 */
-	public static Node cloneNodeDeep(IDOMModel model, Document destDoc, Node sourceNode) {
-		switch (sourceNode.getNodeType()) {
-		case Node.ELEMENT_NODE:
-			Element sourceEle = (Element) sourceNode;
-			Element resultEle = destDoc.createElement(sourceEle.getTagName());
-			internalApplyPrefixes(model, sourceEle, resultEle);
-			NamedNodeMap attrs = sourceEle.getAttributes();
-			for (int i = 0, size = attrs.getLength(); i < size; i++) {
-				Attr a = (Attr) attrs.item(i);
-				if (!PREFIX_ATTRIBUTE.equalsIgnoreCase(a.getNodeName())) {
-					resultEle.setAttribute(a.getName(), a.getValue());
-				}
-			}
-			NodeList children = sourceEle.getChildNodes();
-			for (int i = 0, size = children.getLength(); i < size; i++) {
-				Node n = children.item(i);
-				Node d = cloneNodeDeep(model, destDoc, n);
-				if (d != null) {
-					resultEle.appendChild(d);
-				}
-			}
-			return resultEle;
-		case Node.TEXT_NODE:
-			Text txt = destDoc.createTextNode(sourceNode.getNodeValue());
-			if (txt instanceof IDOMText && sourceNode instanceof IDOMText) {
-				try {
-					((IDOMText) txt).setSource(((IDOMText) sourceNode)
-							.getSource());
-				} catch (Exception ex) {
-					// ignore
-				}
-			}
-			return txt;
-		case Node.CDATA_SECTION_NODE:
-			return destDoc.createCDATASection(sourceNode.getNodeValue());
-		default:
-			return null; // not support.
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/PaletteHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/PaletteHelper.java
deleted file mode 100644
index fc79558..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/PaletteHelper.java
+++ /dev/null
@@ -1,420 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette.impl;
-
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-import java.util.regex.Pattern;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.gef.palette.PaletteDrawer;
-import org.eclipse.gef.palette.PaletteEntry;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.Model;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.internal.IImageDescriptorProvider;
-import org.eclipse.jst.jsf.common.metadata.internal.IMetaDataSourceModelProvider;
-import org.eclipse.jst.jsf.common.metadata.internal.TraitValueHelper;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.utils.JSFSharedImages;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfos;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDDocument;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDElementDeclaration;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.editors.palette.IPaletteItemManager;
-import org.eclipse.jst.pagedesigner.editors.palette.TagToolPaletteEntry;
-import org.eclipse.wst.html.core.internal.contentmodel.HTMLCMDocument;
-import org.eclipse.wst.html.core.internal.contentmodel.JSPCMDocument;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
-import org.eclipse.wst.xml.core.internal.provisional.contentmodel.CMDocType;
-
-/**
- * Helper class.
- * 
- * @author mengbo
- */
-public class PaletteHelper {
-	
-    // 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("[ ]+");
-    
-    // pattern to find all new lines for removal
-    final private static Pattern removeNewLines = Pattern.compile("[\n]");
-    
-	private final static ImageDescriptor DEFAULT_SMALL_ICON = JSFUICommonPlugin
-		.getDefault().getImageDescriptor(
-			JSFSharedImages.DEFAULT_PALETTE_TAG_IMG);
-
-	private final static ImageDescriptor DEFAULT_LARGE_ICON = PDPlugin
-		.getDefault().getImageDescriptor(
-				"palette/GENERIC/large/PD_Palette_Default.gif");
-
-
-
-// how many characters to truncate a palette item's description to.
-// TODO: add preference?
-// the soft length is the ideal length we try to truncate to. We first
-// try to find a period (end of sentence; TODO: should have a character class)
-// inside the first SOFT_LENGTH chars at which to truncate a description string.
-// if we can't find one then we search for the first one between SOFT_LENGTH
-// and min(HARD_LENGTH, str.length()).  If found, we truncate there.  If not,
-// we truncate to HARD_LENGTH-" ...".length() and append the ellipsis.
-// In all cases the truncated description string returned should <= HARD_LENGTH.
-//	private final static int  DESCRIPTION_TRUNCATE_SOFT_LENGTH = 150;
-	private final static int  DESCRIPTION_TRUNCATE_HARD_LENGTH = 250;
-	
-	
-	/**
-	 * Creates a TaglibPaletteDrawer with TagTool palette entries for each tag from the CMDocument
-	 * @param manager
-	 * @param project
-	 * @param doc
-	 * @return TaglibPaletteDrawer
-	 */
-	public static TaglibPaletteDrawer configPaletteItemsByTLD(IPaletteItemManager manager, IProject project,
-			CMDocument doc) {
-		//bit of a hack... could be greatly improved		
-		String tldURI = null;
-		if (doc instanceof TLDDocument){
-			tldURI = ((TLDDocument)doc).getUri();
-		}
-		else if (doc instanceof HTMLCMDocument){
-			tldURI = CMDocType.HTML_DOC_TYPE;
-		}
-		else if (doc instanceof JSPCMDocument){
-			tldURI = CMDocType.JSP11_DOC_TYPE;
-		}
-		
-		if (tldURI == null) 
-			return null;
-			
-		TaglibPaletteDrawer category = findCategory(manager, tldURI);
-		if (category != null) 
-			return category;
-		
-		ITaglibDomainMetaDataModelContext modelContext = TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(project, tldURI);
-		Model model = TaglibDomainMetaDataQueryHelper.getModel(modelContext);
-		category = createTaglibPaletteDrawer(manager, doc, model);
-		
-		if (category != null){		
-			loadTags(category, doc, model);		
-			sortTags(category.getChildren());
-		}
-		return category;
-	}
-
-	private static void sortTags(List tags) {
-		//note that once we store ordering customizations, we will need to do something different
-		//it will also be complicated if we decide to do 181958 and 181866
-		Collections.sort(tags, new Comparator(){
-
-			public int compare(Object o1, Object o2) {
-				String label1 = ((PaletteEntry)o1).getLabel();
-				String label2 = ((PaletteEntry)o2).getLabel();
-				
-				if (label1 == null)
-				{
-				    // if both null, then equal
-				    if (label2 == null)
-				    {
-				        return 0;
-				    }
-				    // otherwise, sort label 2 before
-			        return 1;
-				}
-				
-				
-				if (label2 == null)
-				{
-				    // if both null then equal
-				    if (label1 == null)
-				    {
-				        return 0;
-				    }
-				    // if label1 not null, then sort it first
-				    return -1;
-				}
-				return label1.compareTo(label2);
-			}
-			
-		});
-		
-	}
-
-	private static void loadTags(TaglibPaletteDrawer category,
-			CMDocument doc,Model model) {
-		
-		if (model != null) {//load from metadata - should always drop in here
-			Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(model, "paletteInfos");
-			if (trait != null){
-				PaletteInfos tags = (PaletteInfos)trait.getValue();
-				for (Iterator it=tags.getInfos().iterator();it.hasNext();){
-					PaletteInfo tag = (PaletteInfo)it.next();
-					createTagEntry(category, tag);
-				}
-			} else {
-				for (Iterator it=model.getChildEntities().iterator();it.hasNext();){
-					Entity tagAsEntity = (Entity)it.next();
-					createTagEntry(category, tagAsEntity);
-				}
-			}
-		}
-		else {//fail safe loading from cmDoc... should no longer go in here 
-			loadFromCMDocument(category, doc);
-		}
-		
-	}
-
-	private static TaglibPaletteDrawer createTaglibPaletteDrawer(IPaletteItemManager manager,
-			CMDocument doc, Model model) {
-		
-		TaglibPaletteDrawer	 category = null;
-		if (model != null){
-			//do we create it?
-			boolean isHidden = getBooleanTagTraitValue(model, "hidden", false);			
-			if (isHidden){
-				return null;
-			}
-						
-			String label = getStringTagTraitValue(model, "display-label", model.getId());
-			label = label.equals("") ? model.getId() : label;
-			category = manager.createTaglibPaletteDrawer(model.getId(), label);
-			
-			String desc = getStringTagTraitValue(model, "description", model.getId());
-			category.setDescription(formatDescription(desc));
-			
-			ImageDescriptor largeIconImage = getImageDescriptorFromTagTraitValueAsString(model, "small-icon", null);
-			if (largeIconImage != null)
-				category.setLargeIcon(largeIconImage);			
-			
-			String prefix = getStringTagTraitValue(model, "default-prefix", null);
-			category.setDefaultPrefix(prefix);
-			
-			boolean isVisible = !(getBooleanTagTraitValue(model, "expert", false));
-			category.setVisible(isVisible);
-			
-			category.setInitialState(PaletteDrawer.INITIAL_STATE_CLOSED);
-		
-		}
-		return category;
-	}
-
-	private static TaglibPaletteDrawer findCategory(IPaletteItemManager manager,
-			String tldURI) {
-		TaglibPaletteDrawer lib = null;
-		for (Iterator it = manager.getAllCategories().iterator();it.hasNext();){
-			lib = (TaglibPaletteDrawer)it.next();
-			if (tldURI.equals(lib.getURI()))
-				return lib;					
-		}
-		return null;
-	}
-
-	/* (non-JavaDoc)
-	 * This method will read information from the CMDocument to create the tag entries. It will
-	 * check the existing items in the registry. If the corresponding tag is not
-	 * in palette manager, then it will create one, and mark the newly created
-	 * item as "expert". Otherwise, it will check whether the tld contains more
-	 * information than the palette manager, and adding those information to it
-	 * (such as description, icons for tags)
-	 * 
-	 * @param category 
-	 * @param cmdoc
-	 */
-	private static void loadFromCMDocument(TaglibPaletteDrawer category,
-			CMDocument cmdoc) {
-		
-		CMNamedNodeMap nodeMap = cmdoc.getElements();
-		for (int i = 0, size = nodeMap.getLength(); i < size; i++) {
-			CMElementDeclaration eledecl = (CMElementDeclaration) nodeMap
-					.item(i);
-			String tagName = eledecl.getElementName();
-			TagToolPaletteEntry item;
-			if (tagName.equalsIgnoreCase(IHTMLConstants.TAG_INPUT)) {//TODO:  fix this nonsense!
-				StringBuffer name = new StringBuffer(category.getURI());
-				name.append(":").append(tagName).append(":").append(tagName);
-				item = category.getTagPaletteEntryById(name.toString());
-			} else {
-				item = category.getTagPaletteEntryByTagName(tagName);
-			}
-			if (item == null) {
-				createTagEntry(category, eledecl);
-
-			}
-		}
-	}
-	
-	private static void createTagEntry(TaglibPaletteDrawer category,
-			PaletteInfo info) {
-		
-		Boolean hidden = info.getHidden();
-		if ((hidden != null) && (hidden.booleanValue()))//do not create a palette entry
-			return; 
-		
-		IMetaDataSourceModelProvider sourceProvider = ((Trait)info.eContainer().eContainer()).getSourceModelProvider();
-		String tagName = info.getTag();
-		String id = info.getId();		
-		String label = info.getDisplayLabel();
-		String desc = formatDescription(info.getDescription());		
-		ImageDescriptor smallIcon = getImageDescriptorFromString(sourceProvider, info.getSmallIcon(), DEFAULT_SMALL_ICON);
-		ImageDescriptor largeIcon = getImageDescriptorFromString(sourceProvider, info.getLargeIcon(), DEFAULT_LARGE_ICON);
-		Boolean expert = info.getExpert();
-				
-		internalCreateTagEntry(category, id, tagName, label, desc, smallIcon, largeIcon, (expert !=null && expert.booleanValue()));		
-		
-	}
-
-	private static void createTagEntry(TaglibPaletteDrawer category,
-			Entity entity) {
-		
-		boolean hidden = getBooleanTagTraitValue(entity, "hidden", false);
-		if (hidden)//do not create a palette entry
-			return; 
-		
-		String tagName = entity.getId();
-		String label = getStringTagTraitValue(entity, "display-label", tagName);
-		String desc = formatDescription(getStringTagTraitValue(entity, "description", tagName));		
-		ImageDescriptor smallIcon = getImageDescriptorFromTagTraitValueAsString(entity, "small-icon", DEFAULT_SMALL_ICON);
-		ImageDescriptor largeIcon = getImageDescriptorFromTagTraitValueAsString(entity, "large-icon", DEFAULT_LARGE_ICON);
-		boolean expert = getBooleanTagTraitValue(entity, "expert", false);
-				
-		internalCreateTagEntry(category, tagName, tagName, label, desc, smallIcon, largeIcon, expert);
-		
-	}
-
-	private static TagToolPaletteEntry internalCreateTagEntry(TaglibPaletteDrawer category, String id, String tagName, String label, String desc, ImageDescriptor smallIcon, ImageDescriptor largeIcon, boolean expert){
-		TagToolPaletteEntry item = new TagToolPaletteEntry(tagName, label, desc, smallIcon, largeIcon);
-		item.setId(id);
-		
-		item.setVisible(!expert);
-		category.getChildren().add(item);
-		item.setParent(category);
-		
-		return item;
-	}
-
-	private static boolean getBooleanTagTraitValue(Entity entity,
-			String key, boolean defaultValue) {
-		Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(entity, key);
-		if (trait != null){
-			return TraitValueHelper.getValueAsBoolean(trait);
-		}
-		return defaultValue;	
-	}
-
-	private static String getStringTagTraitValue(Entity entity, String key, String defaultValue){
-		Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(entity, key);
-		if (trait != null){
-			String val = TraitValueHelper.getValueAsString(trait);
-			if (val != null)
-				return val;
-		}
-		return defaultValue;		
-	}
-
-	private static ImageDescriptor getImageDescriptorFromTagTraitValueAsString(Entity entity, String key, ImageDescriptor defaultValue){
-		Trait t = TaglibDomainMetaDataQueryHelper.getTrait(entity, key);
-		if (t != null){
-			String imgDesc = TraitValueHelper.getValueAsString(t);
-			return getImageDescriptorFromString(t.getSourceModelProvider(), imgDesc, defaultValue);
-		}
-		return defaultValue;
-	}
-	
-	private static ImageDescriptor getImageDescriptorFromString(IMetaDataSourceModelProvider sourceModelProvider,  String imgDesc, ImageDescriptor defaultValue){
-		ImageDescriptor image = defaultValue;
-		IImageDescriptorProvider imageProvider = (IImageDescriptorProvider)sourceModelProvider.getAdapter(IImageDescriptorProvider.class);			
-		if (imageProvider != null){
-			image = imageProvider.getImageDescriptor(imgDesc);
-		}
-		return image;
-	}
-	
-	private static void createTagEntry(TaglibPaletteDrawer category,
-			CMElementDeclaration eledecl) {
-		
-		String tagName = eledecl.getElementName();
-		String label = null;
-		String desc = null;
-
-		if (eledecl instanceof TLDElementDeclaration){
-			TLDElementDeclaration tag = (TLDElementDeclaration)eledecl;			
-			label = tag.getDisplayName();			
-			desc = tag.getDescription();						
-		}
-		
-		if (label == null || label.equals(""))
-			label = tagName;
-		
-		if (desc == null )
-			desc = "";
-		else
-			desc = formatDescription(desc);
-		
-		TagToolPaletteEntry item = internalCreateTagEntry(category, tagName, tagName, label, desc, getDefaultSmallIcon(), getDefaultLargeIcon(), false);
-		item.setToolProperty("CMElementDeclaration", eledecl);
-		
-	}
-	
-	/**
-	 * @return DEFAULT_LARGE_ICON
-	 */
-	private static ImageDescriptor getDefaultLargeIcon() {
-		return DEFAULT_LARGE_ICON;
-	}
-
-	/**
-	 * @return DEFAULT_SMALL_ICON
-	 */
-	private static ImageDescriptor getDefaultSmallIcon() {
-		return DEFAULT_SMALL_ICON;
-	}
-	
-	private static String formatDescription(final String desc) {
-		//TODO: modify and use a formatter in the future?
-		String aDesc = filterConvertString(desc);
-		if (aDesc != null){
-			if (aDesc.length() > DESCRIPTION_TRUNCATE_HARD_LENGTH) {
-				StringBuffer result = new StringBuffer(aDesc.substring(0, DESCRIPTION_TRUNCATE_HARD_LENGTH));
-				result.append("...");
-				return result.toString();
-			}
-			return aDesc;
-
-		}
-		return "";
-	}
-	
-	private static String filterConvertString(String text) {
-		if (text == null) {
-			return "";
-		}
-         
-		String result = removeHTMLTags.matcher(text).replaceAll("");
-		result = removeNewLines.matcher(result).replaceAll(" ");
-        result = trimInteriorWhitespace.matcher(result).replaceAll(" ");        
-
-		return result;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/PaletteItemManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/PaletteItemManager.java
deleted file mode 100644
index 3d9ce38..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/PaletteItemManager.java
+++ /dev/null
@@ -1,341 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette.impl;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-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.resources.IProject;
-import org.eclipse.gef.palette.PaletteEntry;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.CMDocumentFactoryTLD;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDDocument;
-import org.eclipse.jst.jsp.core.taglib.ITaglibRecord;
-import org.eclipse.jst.jsp.core.taglib.TaglibIndex;
-import org.eclipse.jst.pagedesigner.editors.palette.DesignerPaletteCustomizationsHelper;
-import org.eclipse.jst.pagedesigner.editors.palette.IEntryChangeListener;
-import org.eclipse.jst.pagedesigner.editors.palette.IPaletteConstants;
-import org.eclipse.jst.pagedesigner.editors.palette.IPaletteItemManager;
-import org.eclipse.wst.html.core.internal.contentmodel.HTMLCMDocumentFactory;
-import org.eclipse.wst.xml.core.internal.provisional.contentmodel.CMDocType;
-
-/**
- * TODO: C.B.: parts of this class need a re-write.  This is very complex.
- *  
- * @author mengbo
- */
-public class PaletteItemManager implements IPaletteItemManager,
-		IPaletteConstants {
-	
-	private static Map _managers = new HashMap();
-	private List _categories = new ArrayList();
-	
-	// if _curProject is null, then is the default manager.
-	private IProject _curProject = null;
-	private IEntryChangeListener[] _listeners;
-
-	// the default manager is for those _curProject == null
-	private static PaletteItemManager _defaultManager = null;
-	private static PaletteItemManager _currentInstance;
-
-
-	/**
-	 * Return singleton paletteItemManager for a given project
-	 * @param project
-	 * @return PaletteItemManager
-	 */
-	public static synchronized PaletteItemManager getInstance(IProject project) {
-		if (project == null) {
-			// sometimes when the editor is editing a file in jar file, may not
-			// be able to
-			// get the project.
-			return getDefaultPaletteItemManager();
-		}
-		PaletteItemManager manager = (PaletteItemManager) _managers
-				.get(project);
-		if (manager == null) {
-			manager = new PaletteItemManager(project);
-			_managers.put(project, manager);
-		}
-		_currentInstance = manager;
-		
-		return manager;
-	}
-	
-	/**
-	 * @return current PaletteItemManager instance.  May return null
-	 */
-	public static synchronized PaletteItemManager getCurrentInstance(){
-		return _currentInstance != null ? _currentInstance : null;
-	}
-
-	private IProject getCurProject() {
-		return _curProject;
-	}
-
-	/**
-	 * Removes an intstance of a paletteItemManager from the system
-	 * @param manager
-	 */
-	public static synchronized void removePaletteItemManager(
-			PaletteItemManager manager) {
-		// FIXME: does nothing? manager.dispose();
-		_managers.remove(manager.getCurProject());
-	}
-
-
-	/**
-	 * 
-	 */
-	public static synchronized void clearPaletteItemManager() {
-		_managers.clear();
-	}
-
-	/**
-	 * @return
-	 */
-	private static PaletteItemManager getDefaultPaletteItemManager() {
-		if (_defaultManager == null) {
-			_defaultManager = new PaletteItemManager(null);
-			
-		}
-		return _defaultManager;
-	}
-
-	/**
-	 * 
-	 */
-	private PaletteItemManager(IProject project) {
-		_curProject = project;
-
-		init();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.pagedesigner.editors.palette.IPaletteItemManager#getAllCategories()
-	 */
-	public List getAllCategories() {
-		if (_categories == null) {
-			_categories = new ArrayList();
-		}
-		return _categories;
-	}
-
-	/**
-	 * Initializes the palette items for the current project
-	 */
-	protected synchronized void init() {
-		getAllCategories().clear();
-		initFromProject(_curProject);
-
-		DesignerPaletteCustomizationsHelper.loadUserCustomizations(this);
-		
-		sortCategories();
-		
-	}
-
-	private void sortCategories() {
-		//note that once we store ordering customizations, we will need to do something different
-		Collections.sort(getAllCategories(), new Comparator(){
-
-			public int compare(Object o1, Object o2) {
-				String label1 = ((PaletteEntry)o1).getLabel();
-				String label2 = ((PaletteEntry)o2).getLabel();
-				
-				return label1.compareTo(label2);
-			}
-			
-		});
-
-	}
-
-	/**
-	 * Reinitializes the palatteItemManager and informs all palette roots that use the manager to refresh
-	 */
-	public void reset() {
-		init();
-		fireModelChanged(null, null);
-	}
-
-	private void initFromProject(IProject project) {
-		registerHTMLCategory();
-		registerJSPCategory();
-		registerTldFromClasspath(project);
-	}
-
-	private void registerHTMLCategory() {
-		PaletteHelper.configPaletteItemsByTLD(this, getCurProject(), HTMLCMDocumentFactory
-				.getCMDocument(CMDocType.HTML_DOC_TYPE));
-	}
-
-	private void registerJSPCategory() {
-		PaletteHelper.configPaletteItemsByTLD(this, getCurProject(), HTMLCMDocumentFactory
-				.getCMDocument(CMDocType.JSP11_DOC_TYPE));		
-	}
-
-	/**
-	 * Search Classpath entry list to find if the entry is jar libraray and the
-	 * libray have the tld descriptor, if have ,build a palette category mapping
-	 * the tld descriptor.
-	 * 
-	 * @param project
-	 */
-	private void registerTldFromClasspath(IProject project) {
-		if (project != null) {
-			ITaglibRecord[] tldrecs = TaglibIndex.getAvailableTaglibRecords(project.getFullPath());
-			CMDocumentFactoryTLD factory = new CMDocumentFactoryTLD();
-			for (int i=0;i<tldrecs.length;i++){
-				TLDDocument doc = (TLDDocument)factory.createCMDocument(tldrecs[i]);
-				PaletteHelper.configPaletteItemsByTLD(this, getCurProject(), doc);			
-			}
-		}			
-	}
-
-	/**
-	 * @param id (most likely the uri)
-	 * @param label 
-	 * @return TaglibPaletteDrawer
-	 */
-	public TaglibPaletteDrawer findOrCreateCategory(String id, String label) {
-		TaglibPaletteDrawer category;
-		for (Iterator iter = getAllCategories().iterator(); iter.hasNext();) {
-			category = (TaglibPaletteDrawer) iter.next();
-			if (id.equals(category.getId())) {
-				return category;
-			}
-		}
-		category = createTaglibPaletteDrawer(id, label);
-		return category;
-	}
-
-	/**
-	 * @param uri
-	 * @return TaglibPaletteDrawer
-	 */
-	public TaglibPaletteDrawer findCategoryByURI(String uri) {
-		TaglibPaletteDrawer category;
-		for (Iterator iter = getAllCategories().iterator(); iter.hasNext();) {
-			category = (TaglibPaletteDrawer) iter.next();
-			if (uri.equals(category.getURI())) {
-				return category;
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.pagedesigner.editors.palette.IPaletteItemManager#createCategory(java.lang.String)
-	 */
-	public TaglibPaletteDrawer createTaglibPaletteDrawer(String uri, String label) {
-		TaglibPaletteDrawer r = new TaglibPaletteDrawer(uri, label);
-		getAllCategories().add(r);
-		return r;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.pagedesigner.editors.palette.IPaletteItemManager#getCategoryByURI(java.lang.String)
-	 */
-	public TaglibPaletteDrawer getTaglibPalletteDrawer(String uri) {
-		for (Iterator iter = getAllCategories().iterator(); iter.hasNext();) {
-			TaglibPaletteDrawer cat = (TaglibPaletteDrawer) iter.next();
-			if (uri.equals(cat.getId())) {
-				return cat;
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.pagedesigner.editors.palette.IPaletteItemManager#addEntryChangeListener(com.sybase.stf.jmt.pagedesigner.editors.palette.IEntryChangeListener)
-	 */
-	public void addEntryChangeListener(IEntryChangeListener listener) {
-
-		if (_listeners == null) {
-			_listeners = new IEntryChangeListener[] { listener };
-		} else {
-			IEntryChangeListener[] newListeners = new IEntryChangeListener[_listeners.length + 1];
-			newListeners[0] = listener;
-			System.arraycopy(_listeners, 0, newListeners, 1, _listeners.length);
-			_listeners = newListeners;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.sybase.stf.jmt.pagedesigner.editors.palette.IPaletteItemManager#removeEntryChangeListener(com.sybase.stf.jmt.pagedesigner.editors.palette.IEntryChangeListener)
-	 */
-	public void removeEntryChangeListener(IEntryChangeListener listener) {
-		if (_listeners == null) {
-			return;
-		}
-		if (_listeners.length == 1) {
-			_listeners = null;
-		} else {
-			List newListenersList = new ArrayList(Arrays.asList(_listeners));
-			newListenersList.remove(listener);
-			IEntryChangeListener[] newListeners = new IEntryChangeListener[newListenersList
-					.size() - 1];
-			newListeners = (IEntryChangeListener[]) newListenersList
-					.toArray(newListeners);
-			_listeners = newListeners;
-		}
-	}
-
-	/**
-	 * Notify model change event
-	 * 
-	 * @param oldDefinitions
-	 * @param newDefinitions
-	 */
-	private void fireModelChanged(List oldDefinitions, List newDefinitions) {
-		if (_listeners == null) {
-			return;
-		}
-		for (int i = 0; i < _listeners.length; i++) {
-			_listeners[i].modelChanged(oldDefinitions, newDefinitions);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jst.pagedesigner.editors.palette.IPaletteItemManager#getProject()
-	 */
-	public IProject getProject() {
-		return getCurProject();
-	}
-	
-	/**
-	 * Informs all paletteItemManagers, except the notifying paletteManager, of updates to the customizations
-	 * All palette viewer roots will be notifed of possible updates
-	 * @param notifyingManager 
-	 */
-	public static void notifyPaletteItemManagersOfCustomizationsUpdate(IPaletteItemManager notifyingManager){
-		for (Iterator it=_managers.values().iterator();it.hasNext();){
-			PaletteItemManager mgr = (PaletteItemManager)it.next();
-			if (mgr != null && notifyingManager != mgr)
-				mgr.reset();
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/TaglibPaletteDrawer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/TaglibPaletteDrawer.java
deleted file mode 100644
index 5f7ba74..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/impl/TaglibPaletteDrawer.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.palette.impl;
-
-import java.util.Iterator;
-
-import org.eclipse.gef.palette.PaletteDrawer;
-import org.eclipse.gef.palette.ToolEntry;
-import org.eclipse.jst.pagedesigner.editors.palette.TagToolPaletteEntry;
-
-/**
- * Palette Drawer for Tag lib items
- *
- */
-public class TaglibPaletteDrawer extends PaletteDrawer {
-	private String prefix;	
-
-	/**
-	 * Constructor
-	 * @param uri
-	 * @param label
-	 */
-	public TaglibPaletteDrawer(String uri, String label) {
-		super(label);
-		super.setId(uri);
-		setDrawerType(ToolEntry.PALETTE_TYPE_TOOL);
-	}
-	
-	/**
-	 * @return default prefix for tag during creation
-	 */
-	public String getDefaultPrefix() {
-		return prefix;
-	}
-
-	/**
-	 * Set the default prefix for use during item creation
-	 * @param prefix
-	 */
-	public void setDefaultPrefix(String prefix) {
-		this.prefix = prefix;
-	}
-
-	/**
-	 * @return uri identifying the library of tags
-	 */
-	public String getURI(){
-		return getId();
-	}
-	
-	/**
-	 * @param uri for the libary of tags
-	 */
-	public void setURI(String uri){
-		setId(uri);
-	}
-	
-	/**
-	 * @param id
-	 * @return TagToolPaletteEntry for the tag using the id
-	 */
-	public TagToolPaletteEntry getTagPaletteEntryById(String id){
-		for (Iterator it=getChildren().iterator();it.hasNext();){
-			TagToolPaletteEntry tag = (TagToolPaletteEntry)it.next();
-			if (tag.getId().equals(id))
-				return tag;
-		}
-		return null;
-	}
-	
-	/**
-	 * @param tagName
-	 * @return TagToolPaletteEntry using the tag name
-	 */
-	public TagToolPaletteEntry getTagPaletteEntryByTagName(String tagName){
-		for (Iterator it=getChildren().iterator();it.hasNext();){
-			TagToolPaletteEntry tag = (TagToolPaletteEntry)it.next();
-			if (tag.getTagName().equalsIgnoreCase(tagName))
-				return tag;
-		}
-		return null;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.gef.palette.PaletteDrawer#acceptsType(java.lang.Object)
-	 */
-	public boolean acceptsType(Object object){
-			return true;
-	}
-	
-	/**
-	 * @return PERMISSION_HIDE_ONLY
-	 * @see org.eclipse.gef.palette.PaletteEntry#getUserModificationPermission()
-	 */
-	public int getUserModificationPermission() {
-		return PERMISSION_HIDE_ONLY;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/IPropertyPageDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/IPropertyPageDescriptor.java
deleted file mode 100644
index faa0e6e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/IPropertyPageDescriptor.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.properties;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * Property descriptor for metadata enabled tag attributes in the WPE property pages.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * Not intended to be implemented by clients. 
- */
-public interface IPropertyPageDescriptor extends IMetaDataEnabledFeature, IAdaptable{
-	/**
-	 * Trait id for defining quick edit tab sections.   Value must be of type qe:QuickEditTabSections
-	 * eg. <value xsi:type="qe:QuickEditTabSections">
-	 */
-	public static final String QUICK_EDIT_TAB = "quick-edit-tab";
-	/**
-	 * Trait id for category name value
-	 */
-	public static final String PROP_DESC_CATEGORY = "category";
-	
-//	/**
-//	 * Trait id for fully qualified cell editor class name
-//	 */
-//	public static final String PROP_DESC_CELL_EDITOR = "cell-editor";
-//	/**
-//	 * Trait id for fully qualified dialog field editor name
-//	 */
-//	public static final String PROP_DESC_DIALOG_FIELD_EDITOR = "dialog-field-editor";
-	
-	/**
-	 * @return name of attribute.  Must not be null.
-	 */
-	public String getAttributeName();
-	/**
-	 * @return category name.  Must not be null.
-	 */
-	public String getCategory();
-	/**
-	 * @return label to use.  Must not be null.
-	 */
-	public String getLabel();
-	/**
-	 * @return description.   May return null.
-	 */
-	public String getDescription();
-	/**
-	 * @return whether this is a required property.   Default false.
-	 */
-	public boolean isRequired();
-	/**
-	 * @param parent
-	 * @return cell editor to use.   May be null.
-	 */
-	public CellEditor getCellEditor(Composite parent);
-	/**
-	 * @return dialog field editor to use.   May be null.
-	 */
-	public DialogField getDialogFieldEditor();
-	/**
-	 * @return uri. Must not be null.
-	 */
-	public String getUri();
-	/**
-	 * @return tag name.  Must not be null.
-	 */
-	public String getTagName();
-	/**
-	 * @return fully qualified attribute-value-runtime-type as String
-	 */
-	public String getValueType();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/internal/EditorValidatorAdapter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/internal/EditorValidatorAdapter.java
deleted file mode 100644
index a2f6304..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/internal/EditorValidatorAdapter.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.properties.internal;
-
-import org.eclipse.jface.dialogs.IInputValidator;
-import org.eclipse.jface.viewers.ICellEditorValidator;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidationMessage;
-
-/**
- * Adapts IValidValues to ICellEditorValidator
- *
- */
-public class EditorValidatorAdapter implements ICellEditorValidator, IInputValidator {
-
-	private IValidValues _vvs;
-
-	/**
-	 * Constructor
-	 * @param vvs
-	 */
-	public EditorValidatorAdapter(IValidValues vvs) {
-		_vvs = vvs;
-	}
-
-	public String isValid(Object value) {
-		//for now, if value is not a string, return true
-		if (value instanceof String)
-			return isValid((String)value);
-		return null;
-	}
-	
-	public String isValid(String value) {
-		_vvs.getValidationMessages().clear();
-		if (_vvs.isValidValue(value))
-			return null;//is valid
-
-		return ((IValidationMessage)_vvs.getValidationMessages().get(0)).getMessage();
-
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/internal/PropertyDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/internal/PropertyDescriptor.java
deleted file mode 100644
index acb552e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/internal/PropertyDescriptor.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.properties.internal;
-
-import java.util.List;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.dialogs.IInputValidator;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ICellEditorValidator;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.metadataprocessors.AbstractMetaDataEnabledFeature;
-import org.eclipse.jst.jsf.metadataprocessors.IMetaDataEnabledFeature;
-import org.eclipse.jst.jsf.metadataprocessors.MetaDataEnabledProcessingFactory;
-import org.eclipse.jst.jsf.metadataprocessors.features.IDefaultValue;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues;
-import org.eclipse.jst.jsf.metadataprocessors.features.IValidValues;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.jst.pagedesigner.meta.EditorCreator;
-import org.eclipse.jst.pagedesigner.meta.internal.CellEditorFactoryRegistry;
-import org.eclipse.jst.pagedesigner.properties.ITabbedPropertiesConstants;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.w3c.dom.Element;
-
-/**
- * MD enabled feature of an attribute value runtime type allowing for the tabbed property
- * page to work
- *
- */
-public class PropertyDescriptor extends AbstractMetaDataEnabledFeature
-		implements IMetaDataEnabledFeature, IPropertyPageDescriptor, IAdaptable {
-
-	/**
-	 * Constructor
-	 */
-	public PropertyDescriptor() {
-		// TODO Auto-generated constructor stub
-	}
-
-	//IPropertyPageDescriptor 
-	public String getCategory() {		
-		String cat = getTraitValueAsString(IPropertyPageDescriptor.PROP_DESC_CATEGORY);
-		return cat != null ? cat : ITabbedPropertiesConstants.OTHER_CATEGORY;
-	}
-
-	public CellEditor getCellEditor(Composite parent) {
-//		TODO: allow for override of the factory by using MD
-//		Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(
-//				getMetaDataContext().getEntity(),
-//				IPropertyPageDescriptor.PROP_DESC_CELL_EDITOR);
-//		
-//		if (trait != null) {
-//			String classname = TraitValueHelper.getValueAsString(trait);
-//			if (classname != null && ! classname.equals("")){
-//				try {
-//					Class klass = PDPlugin.getDefault().getBundle().loadClass(classname);
-//					if (klass != null){
-//						//
-//					}
-//				} catch (ClassNotFoundException e) {//
-//					String msg = "Unable to locate cell editor:"+classname+ " for "+toString();
-//					PDPlugin.getDefault().getLog().log(new Status(IStatus.ERROR, PDPlugin.getPluginId(), msg));
-//				}
-//			}
-//		}
-		//otherwise use factory
-		Element element = (Element)IStructuredDocumentContextResolverFactory.INSTANCE.getDOMContextResolver(getStructuredDocumentContext()).getNode();		
-		return CellEditorFactoryRegistry.getInstance().createCellEditor(parent, this, element);
-	}
-
-	public String getDescription() {
-		return getTraitValueAsString("description");
-	}
-
-	public String getLabel() {
-		String label = getTraitValueAsString("display-label");
-		if (label == null) {
-			label = getMetaDataContext().getEntity().getId();
-		}
-		return label + ":";
-	}
-
-	public boolean isRequired() {
-		return getTraitValueAsBoolean("required");
-	}
-
-	public DialogField getDialogFieldEditor() {
-		//TODO: allow for override of the factory by using MD
-//		Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(
-//				getMetaDataContext().getEntity(),
-//				IPropertyPageDescriptor.PROP_DESC_DIALOG_FIELD_EDITOR);
-//		
-//		if (trait != null) {
-//			String classname = TraitValueHelper.getValueAsString(trait);
-//			if (classname != null && ! classname.equals("")){
-//				try {
-//					Class klass = PDPlugin.getDefault().getBundle().loadClass(classname);
-//					if (klass != null){
-//						//
-//					}
-//				} catch (ClassNotFoundException e) {//
-//					String msg = "Unable to locate cell editor:"+classname+ " for "+toString();
-//					PDPlugin.getDefault().getLog().log(new Status(IStatus.ERROR, PDPlugin.getPluginId(), msg));
-//				}
-//			}
-//		}
-		//otherwise use factory
-		EditorCreator creator = EditorCreator.getInstance();
-		return creator.createDialogFieldWithWrapper(getUri(),
-				getTagName(),this, null);
-	}
-
-	public String getTagName() {
-		return getTagEntity().getId();
-	}
-
-	public String getUri() {
-		return getMetaDataContext().getEntity().getModel().getCurrentModelContext().getUri();
-	}
-	
-	public String getValueType() {
-		return getTraitValueAsString(MetaDataEnabledProcessingFactory.ATTRIBUTE_VALUE_RUNTIME_TYPE_PROP_NAME);
-	}
-
-	public String getAttributeName() {
-		return getMetaDataContext().getEntity().getId();
-	}
-
-	public Object getAdapter(Class adapter) {
-		if (IPropertyDescriptor.class == adapter) {
-			return new PropertyDescriptorAdapter(this);
-		}
-		else if (IPossibleValues.class == adapter) {
-			List pvs = MetaDataEnabledProcessingFactory.getInstance().getAttributeValueRuntimeTypeFeatureProcessors(
-						IPossibleValues.class, 
-						getStructuredDocumentContext(), 
-						getAttributeEntity());
-			if (!pvs.isEmpty())
-				return pvs.get(0);
-		}
-		else if (IDefaultValue.class == adapter) {
-			List dvs = MetaDataEnabledProcessingFactory.getInstance().getAttributeValueRuntimeTypeFeatureProcessors(
-						IDefaultValue.class, 
-						getStructuredDocumentContext(), 
-						getAttributeEntity());
-			if (!dvs.isEmpty())
-				return dvs.get(0);
-		}
-		else if (ICellEditorValidator.class == adapter) {
-			IValidValues vvs = (IValidValues)getAdapter(IValidValues.class);
-			if (vvs != null)
-				return new EditorValidatorAdapter(vvs);			
-		
-		}
-		else if (IInputValidator.class == adapter) {
-				IValidValues vvs = (IValidValues)getAdapter(IValidValues.class);
-				if (vvs != null)	
-					return new EditorValidatorAdapter(vvs);				
-		}
-		else if (IValidValues.class == adapter) {
-			List vvs = MetaDataEnabledProcessingFactory.getInstance().getAttributeValueRuntimeTypeFeatureProcessors(
-						IValidValues.class, 
-						getStructuredDocumentContext(), 
-						getAttributeEntity());
-			if (!vvs.isEmpty())
-				return vvs.get(0);
-		}
-		return null;
-	}
-	
-	private Entity getTagEntity() {
-		return (Entity)getAttributeEntity().eContainer();
-	}
-	
-	private Entity getAttributeEntity() {
-		return getMetaDataContext().getEntity();
-	}
-	
-	public String toString() {
-		return getUri()+"/"+getTagName()+"/"+getAttributeName();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/internal/PropertyDescriptorAdapter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/internal/PropertyDescriptorAdapter.java
deleted file mode 100644
index a946b29..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/internal/PropertyDescriptorAdapter.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editors.properties.internal;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-
-/**
- * Adapts the MetadataEnabledFeature <code>org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor</code>, to a <code>org.eclipse.ui.views.properties.IPropertyDescriptor</code> 
- *
- */
-public class PropertyDescriptorAdapter implements IPropertyDescriptor{
-
-	private IPropertyPageDescriptor _ppd;
-
-	/**
-	 * Constructor
-	 * @param propertyPageDescriptor
-	 */
-	public PropertyDescriptorAdapter(IPropertyPageDescriptor propertyPageDescriptor) {
-		_ppd = propertyPageDescriptor;
-	}
-
-	public CellEditor createPropertyEditor(Composite parent) {
-		return _ppd.getCellEditor(parent);
-	}
-
-	public String getCategory() {
-		return _ppd.getCategory();
-	}
-
-	public String getDescription() {
-		return _ppd.getDescription();
-	}
-
-	public String getDisplayName() {
-		return _ppd.getAttributeName();
-	}
-
-	public String[] getFilterFlags() {
-		return null;
-	}
-
-	public Object getHelpContextIds() {
-		return null;//FIXME
-	}
-
-	public Object getId() {
-		return _ppd.getAttributeName();
-	}
-
-	public ILabelProvider getLabelProvider() {	
-		return null;//FIXME: do better?  Used to supply labels for attribute property sheet (not quick edit)
-	}
-
-	public boolean isCompatibleWith(IPropertyDescriptor anotherProperty) {
-		return false;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/package-info.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/package-info.java
deleted file mode 100644
index 4dae0fb..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/package-info.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * Web Page Editor tag attribute property page interfaces. 
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.pagedesigner.editors.properties;
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/QuickEditTabSections.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/QuickEditTabSections.java
deleted file mode 100644
index f0cfad4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/QuickEditTabSections.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: QuickEditTabSections.java,v 1.1 2007/12/07 23:43:40 gkessler Exp $
- */
-package org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Quick Edit Tab Sections</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSections#getSections <em>Sections</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage#getQuickEditTabSections()
- * @model
- * @generated
- */
-public interface QuickEditTabSections extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation";
-	
-	/**
-	 * trait id to use
-	 * @generated NOT
-	 */
-	String TRAIT_ID = "quick-edit-tab";
-	
-	/**
-	 * Returns the value of the '<em><b>Sections</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Sections</em>' containment reference list isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Sections</em>' containment reference list.
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage#getQuickEditTabSections_Sections()
-	 * @model containment="true"
-	 *        extendedMetaData="kind='element' name='section'"
-	 * @generated
-	 */
-	EList<SectionInfo> getSections();
-
-} // QuickEditTabSections
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/QuickEditTabSectionsFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/QuickEditTabSectionsFactory.java
deleted file mode 100644
index 3484b03..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/QuickEditTabSectionsFactory.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: QuickEditTabSectionsFactory.java,v 1.1 2007/12/07 23:43:40 gkessler Exp $
- */
-package org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections;
-
-import org.eclipse.emf.ecore.EFactory;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Factory</b> for the model.
- * It provides a create method for each non-abstract class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage
- * @generated
- */
-public interface QuickEditTabSectionsFactory extends EFactory {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The singleton instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	QuickEditTabSectionsFactory eINSTANCE = org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.QuickEditTabSectionsFactoryImpl.init();
-
-	/**
-	 * Returns a new object of class '<em>Quick Edit Tab Sections</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Quick Edit Tab Sections</em>'.
-	 * @generated
-	 */
-	QuickEditTabSections createQuickEditTabSections();
-
-	/**
-	 * Returns a new object of class '<em>Section Info</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Section Info</em>'.
-	 * @generated
-	 */
-	SectionInfo createSectionInfo();
-
-	/**
-	 * Returns the package supported by this factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the package supported by this factory.
-	 * @generated
-	 */
-	QuickEditTabSectionsPackage getQuickEditTabSectionsPackage();
-
-} //QuickEditTabSectionsFactory
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/QuickEditTabSectionsPackage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/QuickEditTabSectionsPackage.java
deleted file mode 100644
index 1367dfe..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/QuickEditTabSectionsPackage.java
+++ /dev/null
@@ -1,288 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: QuickEditTabSectionsPackage.java,v 1.4 2008/02/01 21:52:33 gkessler Exp $
- */
-package org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EEnum;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Package</b> for the model.
- * It contains accessors for the meta objects to represent
- * <ul>
- *   <li>each class,</li>
- *   <li>each feature of each class,</li>
- *   <li>each enum,</li>
- *   <li>and each data type</li>
- * </ul>
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsFactory
- * @model kind="package"
- * @generated
- */
-@SuppressWarnings("hiding")
-public interface QuickEditTabSectionsPackage extends EPackage {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The package name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNAME = "quickedittabsections";
-
-	/**
-	 * The package namespace URI.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_URI = "http://org.eclipse.jsf.pagedesigner/QuickEditTabSections.ecore";
-
-	/**
-	 * The package namespace name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_PREFIX = "qe";
-
-	/**
-	 * The singleton instance of the package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	QuickEditTabSectionsPackage eINSTANCE = org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.QuickEditTabSectionsPackageImpl.init();
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.QuickEditTabSectionsImpl <em>Quick Edit Tab Sections</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.QuickEditTabSectionsImpl
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.QuickEditTabSectionsPackageImpl#getQuickEditTabSections()
-	 * @generated
-	 */
-	int QUICK_EDIT_TAB_SECTIONS = 0;
-
-	/**
-	 * The feature id for the '<em><b>Sections</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int QUICK_EDIT_TAB_SECTIONS__SECTIONS = 0;
-
-	/**
-	 * The number of structural features of the '<em>Quick Edit Tab Sections</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int QUICK_EDIT_TAB_SECTIONS_FEATURE_COUNT = 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.SectionInfoImpl <em>Section Info</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.SectionInfoImpl
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.QuickEditTabSectionsPackageImpl#getSectionInfo()
-	 * @generated
-	 */
-	int SECTION_INFO = 1;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SECTION_INFO__ID = 0;
-
-	/**
-	 * The feature id for the '<em><b>Type</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SECTION_INFO__TYPE = 1;
-
-	/**
-	 * The number of structural features of the '<em>Section Info</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int SECTION_INFO_FEATURE_COUNT = 2;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE <em>SECTION TYPE</em>}' enum.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.QuickEditTabSectionsPackageImpl#getSECTION_TYPE()
-	 * @generated
-	 */
-	int SECTION_TYPE = 2;
-
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSections <em>Quick Edit Tab Sections</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Quick Edit Tab Sections</em>'.
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSections
-	 * @generated
-	 */
-	EClass getQuickEditTabSections();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSections#getSections <em>Sections</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Sections</em>'.
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSections#getSections()
-	 * @see #getQuickEditTabSections()
-	 * @generated
-	 */
-	EReference getQuickEditTabSections_Sections();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo <em>Section Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Section Info</em>'.
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo
-	 * @generated
-	 */
-	EClass getSectionInfo();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo#getId <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo#getId()
-	 * @see #getSectionInfo()
-	 * @generated
-	 */
-	EAttribute getSectionInfo_Id();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo#getType <em>Type</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Type</em>'.
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo#getType()
-	 * @see #getSectionInfo()
-	 * @generated
-	 */
-	EAttribute getSectionInfo_Type();
-
-	/**
-	 * Returns the meta object for enum '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE <em>SECTION TYPE</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for enum '<em>SECTION TYPE</em>'.
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE
-	 * @generated
-	 */
-	EEnum getSECTION_TYPE();
-
-	/**
-	 * Returns the factory that creates the instances of the model.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the factory that creates the instances of the model.
-	 * @generated
-	 */
-	QuickEditTabSectionsFactory getQuickEditTabSectionsFactory();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * Defines literals for the meta objects that represent
-	 * <ul>
-	 *   <li>each class,</li>
-	 *   <li>each feature of each class,</li>
-	 *   <li>each enum,</li>
-	 *   <li>and each data type</li>
-	 * </ul>
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-//    @SuppressWarnings("hiding")
-	interface Literals {
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.QuickEditTabSectionsImpl <em>Quick Edit Tab Sections</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.QuickEditTabSectionsImpl
-		 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.QuickEditTabSectionsPackageImpl#getQuickEditTabSections()
-		 * @generated
-		 */
-        EClass QUICK_EDIT_TAB_SECTIONS = eINSTANCE.getQuickEditTabSections();
-
-		/**
-		 * The meta object literal for the '<em><b>Sections</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference QUICK_EDIT_TAB_SECTIONS__SECTIONS = eINSTANCE.getQuickEditTabSections_Sections();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.SectionInfoImpl <em>Section Info</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.SectionInfoImpl
-		 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.QuickEditTabSectionsPackageImpl#getSectionInfo()
-		 * @generated
-		 */
-		EClass SECTION_INFO = eINSTANCE.getSectionInfo();
-
-		/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute SECTION_INFO__ID = eINSTANCE.getSectionInfo_Id();
-
-		/**
-		 * The meta object literal for the '<em><b>Type</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute SECTION_INFO__TYPE = eINSTANCE.getSectionInfo_Type();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE <em>SECTION TYPE</em>}' enum.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE
-		 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.QuickEditTabSectionsPackageImpl#getSECTION_TYPE()
-		 * @generated
-		 */
-		EEnum SECTION_TYPE = eINSTANCE.getSECTION_TYPE();
-
-	}
-
-} //QuickEditTabSectionsPackage
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/SECTION_TYPE.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/SECTION_TYPE.java
deleted file mode 100644
index b85aaa0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/SECTION_TYPE.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: SECTION_TYPE.java,v 1.2 2007/12/12 16:43:21 gkessler Exp $
- */
-package org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.emf.common.util.Enumerator;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the literals of the enumeration '<em><b>SECTION TYPE</b></em>',
- * and utility methods for working with them.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage#getSECTION_TYPE()
- * @model
- * @generated
- */
-public enum SECTION_TYPE implements Enumerator {
-	/**
-	 * The '<em><b>ATTRIBUTE</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #ATTRIBUTE_VALUE
-	 * @generated
-	 * @ordered
-	 */
-	ATTRIBUTE(0, "ATTRIBUTE", "ATTRIBUTE"),
-
-	/**
-	 * The '<em><b>SECTION</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #SECTION_VALUE
-	 * @generated
-	 * @ordered
-	 */
-	SECTION(1, "SECTION", "SECTION");
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The '<em><b>ATTRIBUTE</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>ATTRIBUTE</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #ATTRIBUTE
-	 * @model
-	 * @generated
-	 * @ordered
-	 */
-	public static final int ATTRIBUTE_VALUE = 0;
-
-	/**
-	 * The '<em><b>SECTION</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>SECTION</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #SECTION
-	 * @model
-	 * @generated
-	 * @ordered
-	 */
-	public static final int SECTION_VALUE = 1;
-
-	/**
-	 * An array of all the '<em><b>SECTION TYPE</b></em>' enumerators.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static final SECTION_TYPE[] VALUES_ARRAY =
-		new SECTION_TYPE[] {
-			ATTRIBUTE,
-			SECTION,
-		};
-
-	/**
-	 * A public read-only list of all the '<em><b>SECTION TYPE</b></em>' enumerators.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final List<SECTION_TYPE> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
-
-	/**
-	 * Returns the '<em><b>SECTION TYPE</b></em>' literal with the specified literal value.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param literal 
-	 * @return SECTION_TYPE
-	 * @generated
-	 */
-	public static SECTION_TYPE get(String literal) {
-		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
-			SECTION_TYPE result = VALUES_ARRAY[i];
-			if (result.toString().equals(literal)) {
-				return result;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the '<em><b>SECTION TYPE</b></em>' literal with the specified name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param name 
-	 * @return SECTION_TYPE
-	 * @generated
-	 */
-	public static SECTION_TYPE getByName(String name) {
-		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
-			SECTION_TYPE result = VALUES_ARRAY[i];
-			if (result.getName().equals(name)) {
-				return result;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the '<em><b>SECTION TYPE</b></em>' literal with the specified integer value.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value 
-	 * @return SECTION_TYPE
-	 * @generated
-	 */
-	public static SECTION_TYPE get(int value) {
-		switch (value) {
-			case ATTRIBUTE_VALUE: return ATTRIBUTE;
-			case SECTION_VALUE: return SECTION;
-		}
-		return null;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private final int value;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private final String name;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private final String literal;
-
-	/**
-	 * Only this class can construct instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private SECTION_TYPE(int value, String name, String literal) {
-		this.value = value;
-		this.name = name;
-		this.literal = literal;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public int getValue() {
-	  return value;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getName() {
-	  return name;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getLiteral() {
-	  return literal;
-	}
-
-	/**
-	 * Returns the literal value of the enumerator, which is its string representation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public String toString() {
-		return literal;
-	}
-	
-} //SECTION_TYPE
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/SectionInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/SectionInfo.java
deleted file mode 100644
index fcb9161..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/SectionInfo.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: SectionInfo.java,v 1.1 2007/12/07 23:43:40 gkessler Exp $
- */
-package org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Section Info</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo#getType <em>Type</em>}</li>
- * </ul>
- * </p>
- *
- * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage#getSectionInfo()
- * @model
- * @generated
- */
-public interface SectionInfo extends EObject {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage#getSectionInfo_Id()
-	 * @model required="true"
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Type</b></em>' attribute.
-	 * The default value is <code>"ATTRIBUTE"</code>.
-	 * The literals are from the enumeration {@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Type</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Type</em>' attribute.
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE
-	 * @see #setType(SECTION_TYPE)
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage#getSectionInfo_Type()
-	 * @model default="ATTRIBUTE" unique="false"
-	 * @generated
-	 */
-	SECTION_TYPE getType();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo#getType <em>Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Type</em>' attribute.
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE
-	 * @see #getType()
-	 * @generated
-	 */
-	void setType(SECTION_TYPE value);
-
-} // SectionInfo
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/impl/QuickEditTabSectionsFactoryImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/impl/QuickEditTabSectionsFactoryImpl.java
deleted file mode 100644
index 3e13edd..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/impl/QuickEditTabSectionsFactoryImpl.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: QuickEditTabSectionsFactoryImpl.java,v 1.2 2008/01/09 19:40:28 cbateman Exp $
- */
-package org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EDataType;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.impl.EFactoryImpl;
-import org.eclipse.emf.ecore.plugin.EcorePlugin;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSections;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsFactory;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Factory</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class QuickEditTabSectionsFactoryImpl extends EFactoryImpl implements QuickEditTabSectionsFactory {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * Creates the default factory implementation.
-	 * <!-- begin-user-doc -->
-     * @return the factory 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static QuickEditTabSectionsFactory init() {
-		try {
-			QuickEditTabSectionsFactory theQuickEditTabSectionsFactory = (QuickEditTabSectionsFactory)EPackage.Registry.INSTANCE.getEFactory("http://org.eclipse.jsf.pagedesigner/QuickEditTabSections.ecore"); 
-			if (theQuickEditTabSectionsFactory != null) {
-				return theQuickEditTabSectionsFactory;
-			}
-		}
-		catch (Exception exception) {
-			EcorePlugin.INSTANCE.log(exception);
-		}
-		return new QuickEditTabSectionsFactoryImpl();
-	}
-
-	/**
-	 * Creates an instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public QuickEditTabSectionsFactoryImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public EObject create(EClass eClass) {
-		switch (eClass.getClassifierID()) {
-			case QuickEditTabSectionsPackage.QUICK_EDIT_TAB_SECTIONS: return createQuickEditTabSections();
-			case QuickEditTabSectionsPackage.SECTION_INFO: return createSectionInfo();
-			default:
-				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object createFromString(EDataType eDataType, String initialValue) {
-		switch (eDataType.getClassifierID()) {
-			case QuickEditTabSectionsPackage.SECTION_TYPE:
-				return createSECTION_TYPEFromString(eDataType, initialValue);
-			default:
-				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public String convertToString(EDataType eDataType, Object instanceValue) {
-		switch (eDataType.getClassifierID()) {
-			case QuickEditTabSectionsPackage.SECTION_TYPE:
-				return convertSECTION_TYPEToString(eDataType, instanceValue);
-			default:
-				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public QuickEditTabSections createQuickEditTabSections() {
-		QuickEditTabSectionsImpl quickEditTabSections = new QuickEditTabSectionsImpl();
-		return quickEditTabSections;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SectionInfo createSectionInfo() {
-		SectionInfoImpl sectionInfo = new SectionInfoImpl();
-		return sectionInfo;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @param eDataType 
-     * @param initialValue 
-     * @return the SECTION_TYPE enumerator 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SECTION_TYPE createSECTION_TYPEFromString(EDataType eDataType, String initialValue) {
-		SECTION_TYPE result = SECTION_TYPE.get(initialValue);
-		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
-		return result;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @param eDataType 
-     * @param instanceValue 
-     * @return the String version of the section type 
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String convertSECTION_TYPEToString(EDataType eDataType, Object instanceValue) {
-		return instanceValue == null ? null : instanceValue.toString();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public QuickEditTabSectionsPackage getQuickEditTabSectionsPackage() {
-		return (QuickEditTabSectionsPackage)getEPackage();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-     * @return the package 
-	 * <!-- end-user-doc -->
-	 * @deprecated
-	 * @generated
-	 */
-	@Deprecated
-	public static QuickEditTabSectionsPackage getPackage() {
-		return QuickEditTabSectionsPackage.eINSTANCE;
-	}
-
-} //QuickEditTabSectionsFactoryImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/impl/QuickEditTabSectionsImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/impl/QuickEditTabSectionsImpl.java
deleted file mode 100644
index b433d65..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/impl/QuickEditTabSectionsImpl.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: QuickEditTabSectionsImpl.java,v 1.1 2007/12/07 23:43:47 gkessler Exp $
- */
-package org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.NotificationChain;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSections;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Quick Edit Tab Sections</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.QuickEditTabSectionsImpl#getSections <em>Sections</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class QuickEditTabSectionsImpl extends EObjectImpl implements QuickEditTabSections {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The cached value of the '{@link #getSections() <em>Sections</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getSections()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList<SectionInfo> sections;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected QuickEditTabSectionsImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	protected EClass eStaticClass() {
-		return QuickEditTabSectionsPackage.Literals.QUICK_EDIT_TAB_SECTIONS;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EList<SectionInfo> getSections() {
-		if (sections == null) {
-			sections = new EObjectContainmentEList<SectionInfo>(SectionInfo.class, this, QuickEditTabSectionsPackage.QUICK_EDIT_TAB_SECTIONS__SECTIONS);
-		}
-		return sections;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case QuickEditTabSectionsPackage.QUICK_EDIT_TAB_SECTIONS__SECTIONS:
-				return ((InternalEList<?>)getSections()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case QuickEditTabSectionsPackage.QUICK_EDIT_TAB_SECTIONS__SECTIONS:
-				return getSections();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@SuppressWarnings("unchecked")
-	@Override
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case QuickEditTabSectionsPackage.QUICK_EDIT_TAB_SECTIONS__SECTIONS:
-				getSections().clear();
-				getSections().addAll((Collection<? extends SectionInfo>)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case QuickEditTabSectionsPackage.QUICK_EDIT_TAB_SECTIONS__SECTIONS:
-				getSections().clear();
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case QuickEditTabSectionsPackage.QUICK_EDIT_TAB_SECTIONS__SECTIONS:
-				return sections != null && !sections.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} //QuickEditTabSectionsImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/impl/QuickEditTabSectionsPackageImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/impl/QuickEditTabSectionsPackageImpl.java
deleted file mode 100644
index 3190f63..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/impl/QuickEditTabSectionsPackageImpl.java
+++ /dev/null
@@ -1,283 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: QuickEditTabSectionsPackageImpl.java,v 1.2 2008/01/09 19:40:28 cbateman Exp $
- */
-package org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EEnum;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.impl.EPackageImpl;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSections;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsFactory;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Package</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class QuickEditTabSectionsPackageImpl extends EPackageImpl implements QuickEditTabSectionsPackage {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass quickEditTabSectionsEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass sectionInfoEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EEnum sectioN_TYPEEEnum = null;
-
-	/**
-	 * Creates an instance of the model <b>Package</b>, registered with
-	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
-	 * package URI value.
-	 * <p>Note: the correct way to create the package is via the static
-	 * factory method {@link #init init()}, which also performs
-	 * initialization of the package, or returns the registered package,
-	 * if one already exists.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.emf.ecore.EPackage.Registry
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage#eNS_URI
-	 * @see #init()
-	 * @generated
-	 */
-	private QuickEditTabSectionsPackageImpl() {
-		super(eNS_URI, QuickEditTabSectionsFactory.eINSTANCE);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static boolean isInited = false;
-
-	/**
-	 * Creates, registers, and initializes the <b>Package</b> for this
-	 * model, and for any others upon which it depends.  Simple
-	 * dependencies are satisfied by calling this method on all
-	 * dependent packages before doing anything else.  This method drives
-	 * initialization for interdependent packages directly, in parallel
-	 * with this package, itself.
-	 * <p>Of this package and its interdependencies, all packages which
-	 * have not yet been registered by their URI values are first created
-	 * and registered.  The packages are then initialized in two steps:
-	 * meta-model objects for all of the packages are created before any
-	 * are initialized, since one package's meta-model objects may refer to
-	 * those of another.
-	 * <p>Invocation of this method will not affect any packages that have
-	 * already been initialized.
-	 * <!-- begin-user-doc -->
-     * @return the initialized package 
-	 * <!-- end-user-doc -->
-	 * @see #eNS_URI
-	 * @see #createPackageContents()
-	 * @see #initializePackageContents()
-	 * @generated
-	 */
-	public static QuickEditTabSectionsPackage init() {
-		if (isInited) return (QuickEditTabSectionsPackage)EPackage.Registry.INSTANCE.getEPackage(QuickEditTabSectionsPackage.eNS_URI);
-
-		// Obtain or create and register package
-		QuickEditTabSectionsPackageImpl theQuickEditTabSectionsPackage = (QuickEditTabSectionsPackageImpl)(EPackage.Registry.INSTANCE.getEPackage(eNS_URI) instanceof QuickEditTabSectionsPackageImpl ? EPackage.Registry.INSTANCE.getEPackage(eNS_URI) : new QuickEditTabSectionsPackageImpl());
-
-		isInited = true;
-
-		// Create package meta-data objects
-		theQuickEditTabSectionsPackage.createPackageContents();
-
-		// Initialize created meta-data
-		theQuickEditTabSectionsPackage.initializePackageContents();
-
-		// Mark meta-data to indicate it can't be changed
-		theQuickEditTabSectionsPackage.freeze();
-
-		return theQuickEditTabSectionsPackage;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getQuickEditTabSections() {
-		return quickEditTabSectionsEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getQuickEditTabSections_Sections() {
-		return (EReference)quickEditTabSectionsEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getSectionInfo() {
-		return sectionInfoEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getSectionInfo_Id() {
-		return (EAttribute)sectionInfoEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getSectionInfo_Type() {
-		return (EAttribute)sectionInfoEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EEnum getSECTION_TYPE() {
-		return sectioN_TYPEEEnum;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public QuickEditTabSectionsFactory getQuickEditTabSectionsFactory() {
-		return (QuickEditTabSectionsFactory)getEFactoryInstance();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private boolean isCreated = false;
-
-	/**
-	 * Creates the meta-model objects for the package.  This method is
-	 * guarded to have no affect on any invocation but its first.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void createPackageContents() {
-		if (isCreated) return;
-		isCreated = true;
-
-		// Create classes and their features
-		quickEditTabSectionsEClass = createEClass(QUICK_EDIT_TAB_SECTIONS);
-		createEReference(quickEditTabSectionsEClass, QUICK_EDIT_TAB_SECTIONS__SECTIONS);
-
-		sectionInfoEClass = createEClass(SECTION_INFO);
-		createEAttribute(sectionInfoEClass, SECTION_INFO__ID);
-		createEAttribute(sectionInfoEClass, SECTION_INFO__TYPE);
-
-		// Create enums
-		sectioN_TYPEEEnum = createEEnum(SECTION_TYPE);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private boolean isInitialized = false;
-
-	/**
-	 * Complete the initialization of the package and its meta-model.  This
-	 * method is guarded to have no affect on any invocation but its first.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void initializePackageContents() {
-		if (isInitialized) return;
-		isInitialized = true;
-
-		// Initialize package
-		setName(eNAME);
-		setNsPrefix(eNS_PREFIX);
-		setNsURI(eNS_URI);
-
-		// Create type parameters
-
-		// Set bounds for type parameters
-
-		// Add supertypes to classes
-
-		// Initialize classes and features; add operations and parameters
-		initEClass(quickEditTabSectionsEClass, QuickEditTabSections.class, "QuickEditTabSections", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getQuickEditTabSections_Sections(), this.getSectionInfo(), null, "sections", null, 0, -1, QuickEditTabSections.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(sectionInfoEClass, SectionInfo.class, "SectionInfo", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getSectionInfo_Id(), ecorePackage.getEString(), "id", null, 1, 1, SectionInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getSectionInfo_Type(), this.getSECTION_TYPE(), "type", "ATTRIBUTE", 0, 1, SectionInfo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		// Initialize enums and add enum literals
-		initEEnum(sectioN_TYPEEEnum, org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE.class, "SECTION_TYPE");
-		addEEnumLiteral(sectioN_TYPEEEnum, org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE.ATTRIBUTE);
-		addEEnumLiteral(sectioN_TYPEEEnum, org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE.SECTION);
-
-		// Create resource
-		createResource(eNS_URI);
-
-		// Create annotations
-		// http:///org/eclipse/emf/ecore/util/ExtendedMetaData
-		createExtendedMetaDataAnnotations();
-	}
-
-	/**
-	 * Initializes the annotations for <b>http:///org/eclipse/emf/ecore/util/ExtendedMetaData</b>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected void createExtendedMetaDataAnnotations() {
-		String source = "http:///org/eclipse/emf/ecore/util/ExtendedMetaData";		
-		addAnnotation
-		  (getQuickEditTabSections_Sections(), 
-		   source, 
-		   new String[] {
-			 "kind", "element",
-			 "name", "section"
-		   });
-	}
-
-} //QuickEditTabSectionsPackageImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/impl/SectionInfoImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/impl/SectionInfoImpl.java
deleted file mode 100644
index b3c7298..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/impl/SectionInfoImpl.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: SectionInfoImpl.java,v 1.1 2007/12/07 23:43:47 gkessler Exp $
- */
-package org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Section Info</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.SectionInfoImpl#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.impl.SectionInfoImpl#getType <em>Type</em>}</li>
- * </ul>
- * </p>
- *
- * @generated
- */
-public class SectionInfoImpl extends EObjectImpl implements SectionInfo {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getType() <em>Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getType()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final SECTION_TYPE TYPE_EDEFAULT = SECTION_TYPE.ATTRIBUTE;
-
-	/**
-	 * The cached value of the '{@link #getType() <em>Type</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getType()
-	 * @generated
-	 * @ordered
-	 */
-	protected SECTION_TYPE type = TYPE_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected SectionInfoImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	protected EClass eStaticClass() {
-		return QuickEditTabSectionsPackage.Literals.SECTION_INFO;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, QuickEditTabSectionsPackage.SECTION_INFO__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public SECTION_TYPE getType() {
-		return type;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setType(SECTION_TYPE newType) {
-		SECTION_TYPE oldType = type;
-		type = newType == null ? TYPE_EDEFAULT : newType;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, QuickEditTabSectionsPackage.SECTION_INFO__TYPE, oldType, type));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case QuickEditTabSectionsPackage.SECTION_INFO__ID:
-				return getId();
-			case QuickEditTabSectionsPackage.SECTION_INFO__TYPE:
-				return getType();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case QuickEditTabSectionsPackage.SECTION_INFO__ID:
-				setId((String)newValue);
-				return;
-			case QuickEditTabSectionsPackage.SECTION_INFO__TYPE:
-				setType((SECTION_TYPE)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case QuickEditTabSectionsPackage.SECTION_INFO__ID:
-				setId(ID_EDEFAULT);
-				return;
-			case QuickEditTabSectionsPackage.SECTION_INFO__TYPE:
-				setType(TYPE_EDEFAULT);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case QuickEditTabSectionsPackage.SECTION_INFO__ID:
-				return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-			case QuickEditTabSectionsPackage.SECTION_INFO__TYPE:
-				return type != TYPE_EDEFAULT;
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (id: ");
-		result.append(id);
-		result.append(", type: ");
-		result.append(type);
-		result.append(')');
-		return result.toString();
-	}
-
-} //SectionInfoImpl
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/util/QuickEditTabSectionsAdapterFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/util/QuickEditTabSectionsAdapterFactory.java
deleted file mode 100644
index 59994fd..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/util/QuickEditTabSectionsAdapterFactory.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: QuickEditTabSectionsAdapterFactory.java,v 1.1 2007/12/07 23:43:50 gkessler Exp $
- */
-package org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.util;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notifier;
-
-import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
-
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.*;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Adapter Factory</b> for the model.
- * It provides an adapter <code>createXXX</code> method for each class of the model.
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage
- * @generated
- */
-public class QuickEditTabSectionsAdapterFactory extends AdapterFactoryImpl {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The cached model package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static QuickEditTabSectionsPackage modelPackage;
-
-	/**
-	 * Creates an instance of the adapter factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public QuickEditTabSectionsAdapterFactory() {
-		if (modelPackage == null) {
-			modelPackage = QuickEditTabSectionsPackage.eINSTANCE;
-		}
-	}
-
-	/**
-	 * Returns whether this factory is applicable for the type of the object.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
-	 * <!-- end-user-doc -->
-	 * @return whether this factory is applicable for the type of the object.
-	 * @generated
-	 */
-	@Override
-	public boolean isFactoryForType(Object object) {
-		if (object == modelPackage) {
-			return true;
-		}
-		if (object instanceof EObject) {
-			return ((EObject)object).eClass().getEPackage() == modelPackage;
-		}
-		return false;
-	}
-
-	/**
-	 * The switch the delegates to the <code>createXXX</code> methods.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected QuickEditTabSectionsSwitch<Adapter> modelSwitch =
-		new QuickEditTabSectionsSwitch<Adapter>() {
-			@Override
-			public Adapter caseQuickEditTabSections(QuickEditTabSections object) {
-				return createQuickEditTabSectionsAdapter();
-			}
-			@Override
-			public Adapter caseSectionInfo(SectionInfo object) {
-				return createSectionInfoAdapter();
-			}
-			@Override
-			public Adapter defaultCase(EObject object) {
-				return createEObjectAdapter();
-			}
-		};
-
-	/**
-	 * Creates an adapter for the <code>target</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param target the object to adapt.
-	 * @return the adapter for the <code>target</code>.
-	 * @generated
-	 */
-	@Override
-	public Adapter createAdapter(Notifier target) {
-		return modelSwitch.doSwitch((EObject)target);
-	}
-
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSections <em>Quick Edit Tab Sections</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSections
-	 * @generated
-	 */
-	public Adapter createQuickEditTabSectionsAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo <em>Section Info</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo
-	 * @generated
-	 */
-	public Adapter createSectionInfoAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for the default case.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null.
-	 * <!-- end-user-doc -->
-	 * @return the new adapter.
-	 * @generated
-	 */
-	public Adapter createEObjectAdapter() {
-		return null;
-	}
-
-} //QuickEditTabSectionsAdapterFactory
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/util/QuickEditTabSectionsSwitch.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/util/QuickEditTabSectionsSwitch.java
deleted file mode 100644
index 3a7f3a7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/internal/util/QuickEditTabSectionsSwitch.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/**
- * Copyright (c) 2007 Oracle Corporation
- *
- * $Id: QuickEditTabSectionsSwitch.java,v 1.2 2008/01/09 19:40:28 cbateman Exp $
- */
-package org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.internal.util;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.*;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Switch</b> for the model's inheritance hierarchy.
- * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
- * to invoke the <code>caseXXX</code> method for each class of the model,
- * starting with the actual class of the object
- * and proceeding up the inheritance hierarchy
- * until a non-null result is returned,
- * which is the result of the switch.
- * 
- * @param <T> 
- * <!-- end-user-doc -->
- * @see org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSectionsPackage
- * @generated
- */
-public class QuickEditTabSectionsSwitch<T> {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public static final String copyright = "Copyright (c) 2007 Oracle Corporation";
-
-	/**
-	 * The cached model package
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected static QuickEditTabSectionsPackage modelPackage;
-
-	/**
-	 * Creates an instance of the switch.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public QuickEditTabSectionsSwitch() {
-		if (modelPackage == null) {
-			modelPackage = QuickEditTabSectionsPackage.eINSTANCE;
-		}
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-     * @param theEObject 
-	 * <!-- end-user-doc -->
-	 * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * @generated
-	 */
-	public T doSwitch(EObject theEObject) {
-		return doSwitch(theEObject.eClass(), theEObject);
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-     * @param theEClass 
-     * @param theEObject 
-	 * <!-- end-user-doc -->
-	 * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * @generated
-	 */
-	protected T doSwitch(EClass theEClass, EObject theEObject) {
-		if (theEClass.eContainer() == modelPackage) {
-			return doSwitch(theEClass.getClassifierID(), theEObject);
-		}
-        List<EClass> eSuperTypes = theEClass.getESuperTypes();
-        return
-        	eSuperTypes.isEmpty() ?
-        		defaultCase(theEObject) :
-        		doSwitch(eSuperTypes.get(0), theEObject);
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
-	 * <!-- begin-user-doc -->
-     * @param classifierID 
-     * @param theEObject 
-	 * <!-- end-user-doc -->
-	 * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * @generated
-	 */
-	protected T doSwitch(int classifierID, EObject theEObject) {
-		switch (classifierID) {
-			case QuickEditTabSectionsPackage.QUICK_EDIT_TAB_SECTIONS: {
-				QuickEditTabSections quickEditTabSections = (QuickEditTabSections)theEObject;
-				T result = caseQuickEditTabSections(quickEditTabSections);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			case QuickEditTabSectionsPackage.SECTION_INFO: {
-				SectionInfo sectionInfo = (SectionInfo)theEObject;
-				T result = caseSectionInfo(sectionInfo);
-				if (result == null) result = defaultCase(theEObject);
-				return result;
-			}
-			default: return defaultCase(theEObject);
-		}
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Quick Edit Tab Sections</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Quick Edit Tab Sections</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public T caseQuickEditTabSections(QuickEditTabSections object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Section Info</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Section Info</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public T caseSectionInfo(SectionInfo object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>EObject</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch, but this is the last case anyway.
-	 * <!-- end-user-doc -->
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>EObject</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)
-	 * @generated
-	 */
-	public T defaultCase(EObject object) {
-		return null;
-	}
-
-} //QuickEditTabSectionsSwitch
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/package-info.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/package-info.java
deleted file mode 100644
index e51e80c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/properties/quickedittabsections/package-info.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * Web Page Editor tag attribute QuickEdit property page classes.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections;
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/AbsolutePointLocator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/AbsolutePointLocator.java
deleted file mode 100644
index 0ebdeb2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/AbsolutePointLocator.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Locator;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-
-/**
- * @author cbateman
- *
- */
-public class AbsolutePointLocator implements Locator 
-{
-    private static AbsolutePointLocator   INSTANCE;
-    private final static Point    DEFAULT_POINT = new Point(0,0);
-    
-    private Point  _referencePoint = DEFAULT_POINT; 
-    private int    _xOffset = 0;
-    private int    _yOffset = 0;
-    private IFigure _intersectFigure;
-    
-    /**
-     * @return the singleton instance
-     */
-    public synchronized static AbsolutePointLocator getInstance()
-    {
-        if (INSTANCE == null)
-        {
-            INSTANCE = new AbsolutePointLocator();
-        }
-        return INSTANCE;
-    }
-    
-    /** 
-     * Relocates the target figure to the reference point with possible x and y
-     * offsetting.  Uses the target's preferredSize as the new size.
-     */
-    public void relocate(IFigure target) 
-    {
-        Point leftTop = new Point(_referencePoint.x+_xOffset, _referencePoint.y+_yOffset);
-        
-
-        //figure.translateToAbsolute(leftTop);
-        target.translateToRelative(leftTop);
-        Dimension d = target.getPreferredSize();
-        Rectangle rect = new Rectangle(leftTop, d);
-
-        // to avoid enlargemeent
-        if (_intersectFigure != null)
-        {
-            rect = rect.intersect(_intersectFigure.getBounds());
-        }
-        
-        target.setBounds(rect);
-    }
-
-    /**
-     * Sets the reference point used to calculate the location to which
-     * relocate will relocate its target.  The x and y offset values are added
-     * to the reference point before final re-location.  If point is null
-     * then the reference is set to (0,0)
-     * @param point
-     * @param xoffset 
-     * @param yoffset 
-     */
-    public void setReferencePoint(Point point, int xoffset, int yoffset)
-    {
-        if (point == null)
-        {
-            _referencePoint = DEFAULT_POINT;
-        }
-        else
-        {
-            _referencePoint = point;
-        }
-       
-        _xOffset = xoffset;
-        _yOffset = yoffset;
-    }
-    
-    /**
-     * Sets the figure used to calculate a rectangular intersect of the 
-     * relocated target.  This normally set to the parent of the target
-     * such as a layer to ensure that the relocate target does not enlarge
-     * its parent by relocating outside it's rectangle.
-     * 
-     * If intersectFigure is set to null, then no intersect calculation will
-     * be performed.
-     * 
-     * @param intersectFigure
-     */
-    public void setIntersectFigure(IFigure intersectFigure)
-    {
-        _intersectFigure = intersectFigure;
-    }
-    
-    private AbsolutePointLocator() {/*no external instantiation*/}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/BasicLabelToolTip.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/BasicLabelToolTip.java
deleted file mode 100644
index bd216a6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/BasicLabelToolTip.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.LineBorder;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * A tool tip based on a label
- * @author cbateman
- *
- */
-public class BasicLabelToolTip extends Label
-{
-    /**
-     * @param i
-     */
-    public BasicLabelToolTip(Image i) {
-        super(i);
-        initialize();
-    }
-
-    /**
-     * @param s
-     * @param i
-     */
-    public BasicLabelToolTip(String s, Image i) {
-        super(s, i);
-        initialize();
-    }
-
-    /**
-     * @param s
-     */
-    public BasicLabelToolTip(String s) {
-        super(s);
-        initialize();
-    }
-
-    /**
-     * 
-     */
-    protected void initialize()
-    {
-        setOpaque(true);
-        setBackgroundColor(ColorConstants.tooltipBackground);
-        setBorder(
-                new LineBorder(ColorConstants.tooltipForeground, 1)
-                {
-                    // add an extra pixel of inset to make sure the text
-                    // isn't pressed against the border
-                    public Insets getInsets(IFigure figure) {
-                        return new Insets(getWidth()+1);
-                    }
-                }
-        );
-        setTextAlignment(PositionConstants.CENTER); 
-        setForegroundColor(ColorConstants.tooltipForeground);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ColumnHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ColumnHelper.java
deleted file mode 100644
index 6574e59..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ColumnHelper.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.LayoutManager;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.PrecisionRectangle;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.table.CSSTableLayout2;
-
-/**
- * @author mengbo
- */
-public class ColumnHelper {
-    
-    /**
-     * @param editPart
-     * @return a rectangle that bounds the actual visual rectangle of the column represented
-     * by editPart.  The editPart's figure normally only maps to the td in the rendered table.
-     * 
-     * The rectangle is translated to absolute bounds
-     */
-    public static Rectangle getAdjustedColumnBoundingRectangle(GraphicalEditPart editPart)
-    {
-        Rectangle bounds = editPart.getFigure().getBounds().getCopy();
-
-        if (editPart.getParent() != null) {
-            IFigure figure = ((GraphicalEditPart) editPart.getParent())
-                    .getFigure();
-            if (figure instanceof CSSFigure) {
-                CSSFigure cssFigure = (CSSFigure) figure;
-                LayoutManager layoutManager = cssFigure.getLayoutManager();
-                if (layoutManager instanceof CSSTableLayout2) {
-                    CSSTableLayout2 tableLayout = (CSSTableLayout2) layoutManager;
-                    bounds.y = tableLayout.getHSpacing();
-                    bounds.height = figure.getClientArea().height
-                            - tableLayout.getHSpacing() * 2;
-                }
-            }
-        }
-        bounds = new PrecisionRectangle(bounds.getResized(-1, -1));
-        editPart.getFigure().translateToAbsolute(bounds);
-        
-        return bounds;
-    }
-    
-	static Rectangle getColumnBounds(GraphicalEditPart editPart,
-			IFigure target) {
-	    Rectangle bounds = getAdjustedColumnBoundingRectangle(editPart);
-        target.translateToRelative(bounds);
-        Insets insets = target.getInsets();
-		bounds.translate(-insets.left, -insets.top);
-		bounds.resize(insets.getWidth() + 1, insets.getHeight() + 1);
-		return bounds;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ColumnResizableEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ColumnResizableEditPolicy.java
deleted file mode 100644
index 8530091..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ColumnResizableEditPolicy.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Locator;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Handle;
-import org.eclipse.gef.SharedCursors;
-import org.eclipse.gef.handles.MoveHandle;
-import org.eclipse.gef.handles.ResizeHandle;
-import org.eclipse.gef.handles.SquareHandle;
-import org.eclipse.gef.tools.DragEditPartsTracker;
-import org.eclipse.gef.tools.SelectEditPartTracker;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Cursor;
-import org.eclipse.swt.graphics.Image;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class ColumnResizableEditPolicy extends ElementResizableEditPolicy {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.ResizableEditPolicy#createSelectionHandles()
-	 */
-	protected List createSelectionHandles() {
-		String elementName = ((Element) getHost().getModel()).getLocalName();
-		if ("column".equalsIgnoreCase(elementName)) {
-			List list = new ArrayList();
-
-			GraphicalEditPart part = (GraphicalEditPart) getHost();
-            
-            {
-    			MoveHandle borderhandle = new MoveHandle(part, new ColumnBorderHandleLocator(
-    					part));
-    			list.add(borderhandle);
-            }
-            
-            {
-    			MyMoveHandle cornerHandle = new MyMoveHandle(part, new ColumnHandleLocator(part, getHostFigure(),
-    					PositionConstants.NORTH_WEST));
-    			list.add(cornerHandle);
-            }
-            
-			SelectEditPartTracker tracker = new SelectEditPartTracker(getHost());
-			list.add(createHandle(part, PositionConstants.SOUTH_EAST, tracker,
-					SharedCursors.ARROW));
-			list.add(createHandle(part, PositionConstants.SOUTH_WEST, tracker,
-					SharedCursors.ARROW));
-			list.add(createHandle(part, PositionConstants.NORTH_WEST, tracker,
-					SharedCursors.ARROW));
-			list.add(createHandle(part, PositionConstants.NORTH_EAST, tracker,
-					SharedCursors.ARROW));
-			return list;
-
-		}
-		return super.createSelectionHandles();
-	}
-
-	private Handle createHandle(GraphicalEditPart owner, int direction,
-			DragTracker tracker, Cursor cursor) {
-		ResizeHandle handle = new ResizeHandle(owner, new ColumnCornerLocator(
-				owner, direction), cursor);
-		handle.setCursor(cursor);
-		handle.setDragTracker(tracker);
-		return handle;
-	}
-
-    private class ColumnHandleLocator extends CornerRelativeHandleLocator {
-		private GraphicalEditPart editPart;
-
-		/**
-		 * @param editPart
-		 * @param reference
-		 * @param location
-		 */
-		public ColumnHandleLocator(GraphicalEditPart editPart, IFigure reference, int location) {
-            super(reference, location);
-			this.editPart = editPart;
-		}
-        
-        protected Dimension getNewTargetSize(IFigure relocateFigure) {
-            return relocateFigure.getPreferredSize();
-        }
-
-        protected Rectangle getCurrentTargetBounds(IFigure relocateFigure) {
-            return ColumnHelper.getColumnBounds(editPart, relocateFigure);
-        }
-	}
-
-	private class ColumnCornerLocator implements Locator {
-		private double relativeX;
-
-		private double relativeY;
-
-		private GraphicalEditPart editPart;
-
-		/**
-		 * Constructs a RelativeLocator with the given reference figure and
-		 * relative location. The location is a constant from
-		 * {@link PositionConstants} used as a convenient and readable way to
-		 * set both the relativeX and relativeY values.
-		 * 
-		 * @param editPart
-		 *            the reference figure
-		 * @param location
-		 *            one of NORTH, NORTH_EAST, etc.
-		 */
-		public ColumnCornerLocator(GraphicalEditPart editPart, int location) {
-			this.editPart = editPart;
-			switch (location & PositionConstants.NORTH_SOUTH) {
-			case PositionConstants.NORTH:
-				relativeY = 0;
-				break;
-			case PositionConstants.SOUTH:
-				relativeY = 1.0;
-				break;
-			default:
-				relativeY = 0.5;
-			}
-
-			switch (location & PositionConstants.EAST_WEST) {
-			case PositionConstants.WEST:
-				relativeX = 0;
-				break;
-			case PositionConstants.EAST:
-				relativeX = 1.0;
-				break;
-			default:
-				relativeX = 0.5;
-			}
-		}
-
-		/**
-		 * Relocates the target using the relative offset locations.
-		 * 
-		 * @see org.eclipse.draw2d.Locator#relocate(org.eclipse.draw2d.IFigure)
-		 */
-		public void relocate(IFigure target) {
-			Rectangle targetBounds = ColumnHelper.getColumnBounds(editPart,
-					target);
-
-			Dimension targetSize = target.getPreferredSize();
-
-			targetBounds.x += (int) (targetBounds.width * relativeX - ((targetSize.width + 1) / 2));
-			targetBounds.y += (int) (targetBounds.height * relativeY - ((targetSize.height + 1) / 2));
-			targetBounds.setSize(targetSize);
-			target.setBounds(targetBounds);
-		}
-	}
-
-    private class ColumnBorderHandleLocator implements Locator {
-        private GraphicalEditPart editPart;
-
-        /**
-         * @param editPart
-         */
-        public ColumnBorderHandleLocator(GraphicalEditPart editPart) {
-            this.editPart = editPart;
-        }
-
-        public void relocate(IFigure target) {
-            target.setBounds(ColumnHelper.getColumnBounds(editPart, target));
-        }
-    }
-    
-    private static class MyMoveHandle extends SquareHandle
-    {
-        /**
-         * @param owner
-         * @param loc
-         */
-        public MyMoveHandle(GraphicalEditPart owner, Locator loc) {
-            super(owner, loc);
-            setCursor(SharedCursors.SIZEALL);
-        }
-
-        protected void init() {
-            setPreferredSize(16,16);
-        }
-
-        protected Color getBorderColor() {
-            return ColorConstants.black;
-        }
-
-        protected Color getFillColor() {
-            return ColorConstants.white;
-        }
-
-        protected DragTracker createDragTracker() {
-            DragTracker tracker = new DragEditPartsTracker(getOwner());
-            
-            return tracker;
-        }
-
-        public void paintFigure(Graphics graphics) {
-            super.paintFigure(graphics);
-            final  Image moveImage = PDPlugin.getDefault().getImage("MoveHandle.png");
-            Point topLeft = getBounds().getTopLeft().getCopy();
-            topLeft.performTranslate(3,3);
-            graphics.drawImage(moveImage, topLeft);
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/CornerRelativeHandleLocator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/CornerRelativeHandleLocator.java
deleted file mode 100644
index e43befe..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/CornerRelativeHandleLocator.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-/**
- * 
- */
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.PrecisionRectangle;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.handles.RelativeHandleLocator;
-
-/**
- * A locator for handles that attach to the corner of square figures
- * @author cbateman
- *
- */
-class CornerRelativeHandleLocator extends RelativeHandleLocator
-{
-    private double relativeX = 0;
-    private double relativeY = 0;
-    private double offsetXMultiplier = 0;
-    private double offsetYMultiplier = 0;
-    
-    /**
-     * @param reference
-     * @param location
-     */
-    public CornerRelativeHandleLocator(IFigure reference, int location) {
-        super(reference, location);
-        
-        // unfortunately, relativeX and relativeY are private in super
-        // so duplicate calc code here
-        switch (location & PositionConstants.NORTH_SOUTH) 
-        {
-            case PositionConstants.NORTH:
-                relativeY = 0; 
-                offsetYMultiplier = -1.0;
-            break;
-
-            case PositionConstants.SOUTH:
-                relativeY = 1.0; 
-                offsetYMultiplier = 0;
-            break;
-            default:
-                relativeY = 0.5;
-        }
-
-        switch (location & PositionConstants.EAST_WEST) 
-        {
-            case PositionConstants.WEST:
-                relativeX = 0; 
-                offsetXMultiplier = -1.0;
-            break;
-            case PositionConstants.EAST:
-                relativeX = 1.0;
-                offsetXMultiplier = 0;                    
-            break;
-            default:
-                relativeX = 0.5;
-        }
-    }
-
-    /**
-     * Pass in targetBounds to be updated and newTargetSize.  targetBounds will
-     * be applied to the figure that is being relocated immediately after this method
-     * @param targetBounds
-     * @param newTargetSize
-     */
-    protected void relocateBounds(Rectangle targetBounds, Dimension newTargetSize)
-    {
-        // copied from super.relocate because relativeX/Y are private in super
-        // changed from super to remove div by 2 that centers target; we want
-        // it to be corner-to-corner
-        targetBounds.x
-            += (int) (((targetBounds.width+2) * relativeX) + ((newTargetSize.width+1)*offsetXMultiplier));
-        targetBounds.y
-            += (int) (targetBounds.height * relativeY + ((newTargetSize.height+1)*offsetYMultiplier));
-
-        targetBounds.setSize(newTargetSize);
-    }
-
-    /**
-     * @param relocateFigure
-     * @return a modifiable Rectangle that represents the bounds of the figure to be relocated
-     */
-    protected Rectangle getCurrentTargetBounds(IFigure relocateFigure)
-    {
-        IFigure reference = getReferenceFigure();
-        Rectangle targetBounds = new PrecisionRectangle(getReferenceBox().getResized(-1, -1));
-        reference.translateToAbsolute(targetBounds);
-        relocateFigure.translateToRelative(targetBounds);
-        return targetBounds;
-    }
-    
-    /**
-     * @param relocateFigure
-     * @return the new target dimensions
-     */
-    protected Dimension getNewTargetSize(IFigure relocateFigure)
-    {
-        return relocateFigure.getPreferredSize();
-    }
-    
-    public void relocate(IFigure target) {
-        Rectangle targetBounds = getCurrentTargetBounds(target);
-        Dimension targetSize = getNewTargetSize(target);
-        relocateBounds(targetBounds, targetSize);
-
-        target.setBounds(targetBounds);        
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/DesignerElementEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/DesignerElementEditPolicy.java
deleted file mode 100644
index d374946..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/DesignerElementEditPolicy.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import org.eclipse.gef.editpolicies.ComponentEditPolicy;
-
-/**
- * @author mengbo
- */
-public class DesignerElementEditPolicy extends ComponentEditPolicy {
-
-	// /*
-	// * (non-Javadoc)
-	// *
-	// * @see
-	// org.eclipse.gef.editpolicies.ComponentEditPolicy#createDeleteCommand(org.eclipse.gef.requests.GroupRequest)
-	// */
-	// protected Command createDeleteCommand(GroupRequest deleteRequest)
-	// {
-	// // Object model = getHost().getModel();
-	// // ;
-	// // Node parent = null;
-	// // if (model instanceof Node)
-	// // {
-	// // parent = ((Node) model).getParentNode();
-	// // }
-	// // EditDomain domain = getHost().getViewer().getEditDomain();
-	// // IEditorPart editor = null;
-	// // //FIXME: must do this cast?
-	// // if (domain instanceof DefaultEditDomain)
-	// // {
-	// // editor = ((DefaultEditDomain) domain).getEditorPart();
-	// // }
-	// // if (editor instanceof HTMLEditor)
-	// // {
-	// // DeleteNodeCommand deleteCmd = new DeleteNodeCommand(((HTMLEditor)
-	// editor).getTextEditor().getTextViewer());
-	// // deleteCmd.setParent(parent);
-	// // deleteCmd.setChild((Node) getHost().getModel());
-	// // return deleteCmd;
-	// // }
-	// // else
-	// // {
-	// // return null;
-	// // }
-	// }
-	//
-	// /*
-	// * (non-Javadoc)
-	// *
-	// * @see org.eclipse.gef.EditPolicy#getCommand(org.eclipse.gef.Request)
-	// */
-	// public Command getCommand(Request request)
-	// {
-	// if (request.getType() == DesignCutAction.CUT_TYPE && request instanceof
-	// GroupRequest)
-	// {
-	// return createCutCommand((GroupRequest) request);
-	// }
-	// else if (request.getType() == DesignPasteAction.PASTE_TYPE && request
-	// instanceof GroupRequest)
-	// {
-	// return createPasteCommand((GroupRequest) request);
-	// }
-	// return super.getCommand(request);
-	// }
-	//
-	// protected Command createCutCommand(GroupRequest cutRequest)
-	// {
-	// Object model = getHost().getModel();
-	// ;
-	// Node parent = null;
-	// if (model instanceof Node)
-	// {
-	// parent = ((Node) model).getParentNode();
-	// }
-	// EditDomain domain = getHost().getViewer().getEditDomain();
-	// IEditorPart editor = null;
-	// //FIXME: must do this cast?
-	// if (domain instanceof DefaultEditDomain)
-	// {
-	// editor = ((DefaultEditDomain) domain).getEditorPart();
-	// }
-	// if (editor instanceof HTMLEditor)
-	// {
-	// CutNodeCommand cutCmd = new CutNodeCommand(((HTMLEditor)
-	// editor).getTextEditor().getTextViewer());
-	// cutCmd.setParent(parent);
-	// cutCmd.setChild((Node) getHost().getModel());
-	// return cutCmd;
-	// }
-	// else
-	// {
-	// return null;
-	// }
-	// }
-	//
-	// protected Command createPasteCommand(GroupRequest cutRequest)
-	// {
-	// Object model = getHost().getModel();
-	// ;
-	// Node parent = null;
-	// if (model instanceof Node)
-	// {
-	// parent = ((Node) model).getParentNode();
-	// }
-	// EditDomain domain = getHost().getViewer().getEditDomain();
-	// IEditorPart editor = null;
-	// //FIXME: must do this cast?
-	// if (domain instanceof DefaultEditDomain)
-	// {
-	// editor = ((DefaultEditDomain) domain).getEditorPart();
-	// }
-	// if (editor instanceof HTMLEditor)
-	// {
-	// PasteNodeCommand pasteCmd = new PasteNodeCommand(((HTMLEditor)
-	// editor).getTextEditor().getTextViewer());
-	// pasteCmd.setParent(parent);
-	// pasteCmd.setChild((Node) getHost().getModel());
-	// return pasteCmd;
-	// }
-	// else
-	// {
-	// return null;
-	// }
-	// }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/DragMoveEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/DragMoveEditPolicy.java
deleted file mode 100644
index 0a805da..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/DragMoveEditPolicy.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.commands.UnexecutableCommand;
-import org.eclipse.gef.requests.ChangeBoundsRequest;
-import org.eclipse.gef.requests.DropRequest;
-import org.eclipse.jst.pagedesigner.commands.CloneNodeCommand;
-import org.eclipse.jst.pagedesigner.commands.MoveNodeCommand;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.DnDPositionValidator;
-import org.eclipse.jst.pagedesigner.validation.caret.DropActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.DropActionData.DropData;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.IDropLocationStrategy;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DragMoveEditPolicy extends DropEditPolicy
-{
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#getCommand(org.eclipse.gef.Request)
-	 */
-	public final Command getCommand(Request request) {
-		if (!(request instanceof ChangeBoundsRequest)) {
-			return null;
-		}
-
-		ChangeBoundsRequest r = (ChangeBoundsRequest) request;
-
-		// we only support move/copy a single node.
-		if (!MoveSupport.isSingleNode(r)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-
-		// the edit policy only handle at the target part, so only care about
-		// the
-		// target part request.
-		final Object type = r.getType();
-		if (type != REQ_ADD && type != REQ_CLONE && type != REQ_MOVE_CHILDREN) {
-
-			return null;
-		}
-
-		Node draggedNode = MoveSupport.getDraggedNode(r);
-		Node hostNode = ((NodeEditPart) getHost()).getIDOMNode();
-
-		if (DOMUtil.isAncester(draggedNode, hostNode)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-
-		DesignPosition position = findPosition(r);
-		if (position == null || !position.isValid()) {
-			return null;
-		}
-
-		// can't move/copy into self.
-		Node node = position.getContainerNode();
-		if (DOMUtil.isAncester(draggedNode, node)) {
-			return UnexecutableCommand.INSTANCE;
-		}
-
-		// ok, we are about to move/copy into the specified position.
-		IDOMPosition domposition = DOMPositionHelper.toDOMPosition(position);
-
-		if (REQ_CLONE.equals(type)) {
-			return new CloneNodeCommand((IHTMLGraphicalViewer) getHost()
-					.getViewer(), domposition, draggedNode);
-		}
-        return new MoveNodeCommand((IHTMLGraphicalViewer) getHost()
-        		.getViewer(), domposition, draggedNode);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#getTargetEditPart(org.eclipse.gef.Request)
-	 */
-	public EditPart getTargetEditPart(Request request) {
-		if (request instanceof ChangeBoundsRequest) {
-			return this.getHost();
-		}
-		return super.getTargetEditPart(request);
-	}
-
-	protected final DesignPosition findPosition(DropRequest r) {
-		final IPositionMediator mediator = getDropChildValidator(r);
-        if (mediator == null)
-        {
-            return null;
-        }
-        final IDropLocationStrategy dropStrategy = createDropLocationStrategy(r);
-		final DesignPosition position = 
-            dropStrategy.calculateDesignPosition(getHost(), r.getLocation(), mediator);
-        
-        // verify that the drop strategy has honoured it's contract that our
-        // mediator be respected
-        if (position != null)
-        {
-            if (!mediator.isValidPosition(position))
-            {
-                // if our mediator says no go, then veto the requestor
-                // there is no drop location
-                return null;
-            }
-        }
-		return position;
-	}
-
-    public void showTargetFeedback(Request request) 
-    {
-        Object type = request.getType();
-        // only show feedback for these request types
-        if (type == REQ_ADD || type == REQ_CLONE
-                || type == REQ_MOVE_CHILDREN || type == REQ_MOVE) {
-            super.showTargetFeedback(request);
-        }
-    }
-
-    protected final IPositionMediator createDefaultDropChildValidator(DropData r)
-    {
-        return new DnDPositionValidator(new DropActionData(
-                ActionData.COMPONENT_MOVE, r));
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/DropEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/DropEditPolicy.java
deleted file mode 100644
index 682243d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/DropEditPolicy.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.editpolicies.GraphicalEditPolicy;
-import org.eclipse.gef.requests.DropRequest;
-import org.eclipse.gef.requests.GroupRequest;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.pagedesigner.editors.palette.TagToolPaletteEntry;
-import org.eclipse.jst.pagedesigner.elementedit.ElementEditFactoryRegistry;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEdit;
-import org.eclipse.jst.pagedesigner.itemcreation.ItemCreationRequest;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.DropActionData.DropData;
-import org.eclipse.jst.pagedesigner.viewer.DefaultDropLocationStrategy;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.IDropLocationStrategy;
-
-/**
- * @author cbateman
- *
- */
-public abstract class DropEditPolicy extends GraphicalEditPolicy 
-{
-    private List        _feedbackFigures;
-
-    /**
-     * @param r
-     * @return a mediator that can validate valid model drops into the
-     * host's edit part
-     */
-    protected IPositionMediator createDropChildValidator(DropRequest r)
-    {
-        // sub-class may override to customize the drop container validator
-        return null;
-    }
-    
-    /**
-     * @param r
-     * @return the appropriate design position for the drop request
-     */
-    protected abstract DesignPosition findPosition(DropRequest r);
-    
-    /**
-     * @param data
-     * @return a default validation mediator to be used if nothing custom is provided
-     */
-    protected abstract IPositionMediator createDefaultDropChildValidator(DropData data);
-    
-    /**
-     * @param r
-     * @return the validator to be used to validate the 'request' to drop
-     * the edit parts specified by 'r' into this policy's host edit part
-     */
-    protected final IPositionMediator getDropChildValidator(DropRequest r)
-    {
-        IPositionMediator mediator = createDropChildValidator(r);
-        
-        if (mediator == null)
-        {
-            DropData data = createDropData(r);
-            
-            if (data == null)
-            {
-                return null;
-            }
-            mediator = createDefaultDropChildValidator(data);
-        }
-       
-        return mediator;
-    }
-    
-    /**
-     * @param request
-     * @return the data about the drop request
-     */
-    protected DropData createDropData(DropRequest request)
-    {
-        if (request instanceof GroupRequest)
-        {
-            List editParts = ((GroupRequest)request).getEditParts();
-            
-            // TODO: currently we only support one drop item
-            if (editParts.size() > 0)
-            {
-                EditPart part = (EditPart) editParts.get(0);
-                if (part instanceof NodeEditPart)
-                {
-                    NodeEditPart nodePart = (NodeEditPart) part;
-                    TagIdentifier tagId = nodePart.getTagIdentifier();
-                    if (tagId != null)
-                    {
-                        List tagIds = new ArrayList();
-                        tagIds.add(tagId);
-                        return new DropData(tagIds);
-                    }
-                }
-            }
-        }
-        else if (request instanceof ItemCreationRequest)
-        {
-        	TagToolPaletteEntry desc = ((ItemCreationRequest)request).getTagToolPaletteEntry();
-            TagIdentifier tagId = 
-                TagIdentifierFactory.
-                    createJSPTagWrapper(desc.getURI(), desc.getTagName());
-            List tagIds = new ArrayList();
-            tagIds.add(tagId);
-            return new DropData(tagIds);
-        }
-        
-        return null;
-    }
-    
-    /**
-     * @param r
-     * @return the drop location strategy
-     */
-    protected final IDropLocationStrategy createDropLocationStrategy(DropRequest r)
-    {
-        DropData dropData = createDropData(r);
-        if (dropData != null && dropData.getTagIdentifiers().size() > 0)
-        {
-            // TODO: only supporting single item drop currently
-            TagIdentifier tagIdentifier = 
-                (TagIdentifier) dropData.getTagIdentifiers().get(0);
-
-            IElementEdit elementEdit = 
-                ElementEditFactoryRegistry.getInstance()
-                    .createElementEdit(tagIdentifier); 
-
-            // element edit not guaranteed to exist
-            if (elementEdit != null)
-            {
-                IDropLocationStrategy strategy = 
-                    elementEdit.getDropRequestorLocationStrategy(tagIdentifier, getHost().getViewer());
-                
-                if (strategy != null)
-                {
-                    return strategy;
-                }
-            }
-        }
-        
-        // by default, return the default strategy
-        return new DefaultDropLocationStrategy(getHost().getViewer());
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#eraseTargetFeedback(org.eclipse.gef.Request)
-     */
-    public void eraseTargetFeedback(Request request) {
-        if (_feedbackFigures != null)
-        {
-            for (final Iterator it = _feedbackFigures.iterator(); it.hasNext();)
-            {
-                final IFigure figure = (IFigure) it.next();
-                
-                if (figure != null)
-                {
-                    removeFeedback(figure);
-                }
-            }
-            
-            _feedbackFigures.clear();
-            _feedbackFigures = null;
-        }
-    }
-    
-    public void showTargetFeedback(Request request) 
-    {
-        if (request instanceof DropRequest) 
-        {
-            DesignPosition position = findPosition((DropRequest)request);
-            if (position != null) {
-                // erase any prior feedback
-                eraseTargetFeedback(request);
-                // add figures to feedback layer and save them in _feedbackFigures
-                // for later.
-                _feedbackFigures = createDropLocationStrategy((DropRequest)request).showTargetFeedback(getHost(), position, (DropRequest)request); 
-            }
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ElementDecoratorSquareHandle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ElementDecoratorSquareHandle.java
deleted file mode 100644
index 5ba2257..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ElementDecoratorSquareHandle.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.Locator;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.handles.SquareHandle;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Cursor;
-
-/**
- * A square handle for element decoration
- * @author cbateman
- *
- */
-public class ElementDecoratorSquareHandle extends SquareHandle {
-
-    
-    /**
-     * @param owner
-     * @param loc
-     * @param c
-     */
-    public ElementDecoratorSquareHandle(GraphicalEditPart owner, Locator loc,
-            Cursor c) {
-        super(owner, loc, c);
-    }
-    /**
-     * @param owner
-     * @param loc
-     */
-    public ElementDecoratorSquareHandle(GraphicalEditPart owner, Locator loc) {
-        super(owner, loc);
-    }
-    protected DragTracker createDragTracker() {
-        return null;
-    }
-    protected Color getBorderColor() {
-        return ColorConstants.black;
-    }
-
-    protected Color getFillColor() 
-    {
-        return ColorConstants.white;
-    }
-
-    /**
-     * @return the transparency alpha channel (0-255)
-     */
-    protected int getAlpha()
-    {
-        return 255;
-    }
-    
-    /**
-     * Draws the handle with fill color and outline color dependent 
-     * on the primary selection status of the owner editpart.
-     *
-     * @param g The graphics used to paint the figure.
-     */
-    public void paintFigure(Graphics g) {
-        Rectangle r = getBounds();
-        r.shrink(1, 1);
-        try {
-            g.setBackgroundColor(getFillColor());
-            g.setAlpha(getAlpha());
-            g.fillRectangle(r.x, r.y, r.width, r.height);
-            g.setForegroundColor(getBorderColor()); 
-            g.drawRectangle(r.x, r.y, r.width, r.height);
-        } finally {
-            //We don't really own rect 'r', so fix it.
-            r.expand(1, 1);
-        }
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ElementMenuBar.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ElementMenuBar.java
deleted file mode 100644
index ee61b03..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ElementMenuBar.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-/**
- * 
- */
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.ToolbarLayout;
-import org.eclipse.gef.EditPart;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.parts.NonVisualComponentEditPart;
-
-/**
- * A menu bar for a specific element edit part
- * 
- * @author cbateman
- *
- */
-public class ElementMenuBar extends Figure implements ISelectionProvider, ISelectionChangedListener
-{
-    private ElementEditPart   _hostPart;
-    /**
-     * Should always be accessed for use through getChildParts().  Not automatically
-     * allocated because of high probability that a host part will have no children of interest
-     */
-    private Set                    _childParts;
-    private List                    _selectionListeners;
-    private IStructuredSelection    _selection;
-
-    /**
-     * @param hostPart
-     */
-    public ElementMenuBar(ElementEditPart hostPart)
-    {
-        hostPart.getViewer().addSelectionChangedListener(this);
-        
-        _hostPart = hostPart;
-        ToolbarLayout layout = new ToolbarLayout(false);
-        layout.setSpacing(4);
-        setLayoutManager(layout);
-    }
-
-    /**
-     * @return true if there are child parts in the menu
-     */
-    public boolean hasChildParts()
-    {
-        return _childParts != null &&_childParts.size() > 0;
-    }
-    
-    /**
-     * 
-     */
-    public void dispose()
-    {
-        _hostPart.getViewer().removeSelectionChangedListener(this);
-        if (_childParts != null)
-        {
-            _childParts.clear();
-            _childParts = null;
-        }
-        
-        if (_selectionListeners != null)
-        {
-            _selectionListeners.clear();
-            _selectionListeners = null;
-        }
-        
-        _selection = null;
-    }
-    
-    /**
-     * @param editpart
-     */
-    public void addNonVisualChild(NonVisualComponentEditPart editpart)
-    {
-        add(editpart.getFigure());
-        getChildParts().add(editpart);
-    }
-    
-    /**
-     * Removes editpart from the list of non-visual edit parts that this menu
-     * bar is managing the visuals for. 
-     * @param editpart
-     */
-    public void removeNonVisualChild(final NonVisualComponentEditPart editpart)
-    {
-        // TODO: I have relaxed the checking to see if editpart is valid
-        // child because of the way ElementEditPart refreshes itself
-        // when the model changes.  It's possible this will get called more
-        // than once for the same editpart argument
-        getChildParts().remove(editpart);
-        if (editpart.getFigure().getParent() == this)
-        {
-            remove(editpart.getFigure());
-        }
-    }
-
-    /**
-     * @return true if a member of the menu bar has edit part focus
-     */
-    public boolean hasEditPartFocus()
-    {
-        for (Iterator it = getChildParts().iterator(); it.hasNext();)
-        {
-            EditPart editPart = (EditPart) it.next();
-            
-            if (editPart.getSelected() == EditPart.SELECTED_PRIMARY)
-            {
-                return true;
-            }
-        }
-        return false;
-    }
-    
-    private Set getChildParts()
-    {
-        if (_childParts == null) 
-        {
-            _childParts = new HashSet();
-        }
-
-        return _childParts;
-    }
-
-    protected void paintChildren(Graphics graphics) 
-    {
-        // force all children to paint with my alpha setting
-        graphics.setAlpha(getAlpha());
-        //push the current state so it is what the children revert to
-        graphics.pushState();
-        super.paintChildren(graphics);
-        // pop that state we pushed above
-        graphics.popState();
-    }
-
-    private int getAlpha()
-    {
-        return isEnabled() ? 255 : 75;
-    }
-
-    public void addSelectionChangedListener(ISelectionChangedListener listener) {
-        List listeners = getSelectionListeners();
-        
-        if (!listeners.contains(listener))
-        {
-            listeners.add(listener);
-        }
-    }
-
-    public ISelection getSelection() {
-        return _selection;
-    }
-
-    public void removeSelectionChangedListener(
-            ISelectionChangedListener listener) {
-        getSelectionListeners().remove(listener);
-    }
-
-    public void setSelection(ISelection selection) {
-        // no external selection change supported
-    }
-    
-    private List getSelectionListeners()
-    {
-        if (_selectionListeners == null)
-        {
-            _selectionListeners = new ArrayList(1);
-        }
-        
-        return _selectionListeners;
-    }
-
-    private void fireSelectionChanged() 
-    {
-        for (final Iterator it = _selectionListeners.iterator(); it.hasNext();)
-        {
-            ISelectionChangedListener listener = (ISelectionChangedListener) it.next();
-            listener.selectionChanged(new SelectionChangedEvent(this, _selection));
-        }
-    }
-
-    public void selectionChanged(SelectionChangedEvent event) {
-        ISelection selection = event.getSelection();
-        
-        if (selection instanceof IStructuredSelection)
-        {
-            // the number of selections we care about will be no bigger than the total number of selections
-            final List mySelections = new ArrayList(((IStructuredSelection)selection).size());
-            
-            if (_childParts != null)
-            {
-                for (final Iterator it = ((IStructuredSelection)selection).iterator()
-                        ; it.hasNext();)
-                {
-                    Object selectedObj = it.next();
-                    if (_childParts.contains(selectedObj))
-                    {
-                        mySelections.add(selectedObj);
-                    }
-                }
-            }
-
-            _selection = new StructuredSelection(mySelections);
-            
-            fireSelectionChanged();
-        }
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ElementResizableEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ElementResizableEditPolicy.java
deleted file mode 100644
index 7109d86..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ElementResizableEditPolicy.java
+++ /dev/null
@@ -1,493 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.RectangleFigure;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.PrecisionRectangle;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.LayerConstants;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.RequestConstants;
-import org.eclipse.gef.SharedCursors;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.ResizableEditPolicy;
-import org.eclipse.gef.handles.NonResizableHandleKit;
-import org.eclipse.gef.requests.ChangeBoundsRequest;
-import org.eclipse.gef.requests.LocationRequest;
-import org.eclipse.gef.requests.SelectionRequest;
-import org.eclipse.gef.tools.SelectEditPartTracker;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeStyleCommand;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.BlockBox;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.requests.LocationModifierRequest;
-import org.eclipse.jst.pagedesigner.tools.ObjectModeDragTracker;
-import org.eclipse.jst.pagedesigner.tools.RangeDragTracker;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Cursor;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ElementResizableEditPolicy extends ResizableEditPolicy implements IEnhancedSelectionEditPolicy 
-{
-	private static final Insets INSETS_1 = new Insets(1, 1, 1, 1);
-
-	private static final int THRESHHOLD = 3;
-    
-    // the number of pixels to offset the top left of tooltop feedback
-    // below the current mouse cursor location
-    private static final int TOOLTIP_VERTICAL_OFFSET = 25;
-
-	private static final Insets INSETS_CONST = new Insets(THRESHHOLD,
-			THRESHHOLD, THRESHHOLD, THRESHHOLD);
-
-	private boolean _showLabelFeedback = true;
-
-	private IFigure[] _hoverFeedbackFigure;
-    
-    //private NonVisualChildDecorator   _selectionDecoratorNorthWest; // = null;
-    private MouseSelectableChildDecorator   _nonVisualChildDecorator; // = null;
-    
-	private final static Color HOVER_FEEDBACK_COLOR = ColorConstants.blue;
-
-	public void deactivate() 
-    {
-        super.deactivate();
-        if (_nonVisualChildDecorator != null)
-        {
-            _nonVisualChildDecorator.dispose();
-            _nonVisualChildDecorator = null;
-        }
-    }
-
-    /*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#showTargetFeedback(org.eclipse.gef.Request)
-	 */
-	public void showTargetFeedback(Request request) {
-		if (RequestConstants.REQ_SELECTION_HOVER.equals(request.getType())) {
-			if (_hoverFeedbackFigure != null) {
-				for (int i = 0; i < _hoverFeedbackFigure.length; i++) {
-					removeFeedback(_hoverFeedbackFigure[i]);
-				}
-				_hoverFeedbackFigure = null;
-            }
-            
-            // <gripe>this is what I hate about GEF, if it's a location dependent
-            // request why aren't we guaranteed a LocationRequest?!
-            // even GEF interal code protects casts by checking getType()
-            // rather than an instanceof!</gripe>
-            Assert.isTrue(request instanceof LocationRequest);
-            // don't show tooltip if drag is active
-            _showLabelFeedback = !((NodeEditPart)getHost()).isDragActive();
-			_hoverFeedbackFigure = showHoverFeedback((LocationRequest)request);
-		} else {
-			super.showTargetFeedback(request);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#eraseTargetFeedback(org.eclipse.gef.Request)
-	 */
-	public void eraseTargetFeedback(Request request) {
-		if (RequestConstants.REQ_SELECTION_HOVER.equals(request.getType())) {
-			if (_hoverFeedbackFigure != null) {
-				for (int i = 0; i < _hoverFeedbackFigure.length; i++) {
-					removeFeedback(_hoverFeedbackFigure[i]);
-				}
-				_hoverFeedbackFigure = null;
-                getNonVisualChildDecorator().updateState(MouseSelectableChildDecorator.EVENT_HOST_HOVER_LOST);
-			}
-		} else {
-			super.eraseTargetFeedback(request);
-		}
-	}
-
-	/**
-	 * @param request
-	 */
-	private IFigure[] showHoverFeedback(LocationRequest request) {
-		if (!shouldUseObjectMode(request) && !isStyleTags(getHost())) {
-			return null;
-		}
-
-        final IFigure figure = this.getHostFigure();
-		Rectangle[] rects;
-		if (figure instanceof CSSFigure) {
-			rects = ((CSSFigure) figure).getFragmentsBounds();
-		} else {
-			rects = new Rectangle[] { figure.getBounds() };
-		}
-        int figureSize = rects.length;
-        
-        if (_showLabelFeedback)
-        {
-            figureSize++;
-        }
-        
-		IFigure[] figures = new IFigure[figureSize];
-		for (int i = 0; i < rects.length; i++) {
-			RectangleFigure fig = new RectangleFigure();
-			fig.setFill(false);
-			fig.setOutline(true);
-			fig.setLineWidth(1);
-			fig.setForegroundColor(HOVER_FEEDBACK_COLOR);
-			addFeedback(fig);
-
-			Rectangle r = rects[i].getCopy();
-			figure.translateToAbsolute(r);
-			fig.translateToRelative(r);
-			fig.setBounds(r);
-
-			figures[i] = fig;
-		}
-       
-		if (_showLabelFeedback) 
-        {
-            getNonVisualChildDecorator().updateState(MouseSelectableChildDecorator.EVENT_HOST_HOVER_RECEIVED);
-            
-			BasicLabelToolTip label = new BasicLabelToolTip(getTooltipText());
-			addFeedback(label);
-
-            // use mouse cursor plus an offset so the tooltip doesn't
-            // appear z-ordered below the mouse cursor
-            AbsolutePointLocator locator = AbsolutePointLocator.getInstance();
-            locator.setReferencePoint(request.getLocation(), 0, TOOLTIP_VERTICAL_OFFSET);
-            //  to avoid enlargemeent of the feedback layer
-            locator.setIntersectFigure(getFeedbackLayer());
-            locator.relocate(label);
-			figures[rects.length] = label;
-		}
-		return figures;
-	}
-
-	private String getTooltipText() {
-		Element element = (Element) this.getHost().getModel();
-		StringBuffer text = new StringBuffer(element.getTagName());
-		return text.toString();
-	}
-
-	private boolean isStyleTags(EditPart part) {
-		if (part != null && part.getModel() instanceof Node) {
-			return EditModelQuery.HTML_STYLE_NODES.contains(((Node) part
-					.getModel()).getNodeName());
-		}
-        return false;
-	}
-    private MouseSelectableChildDecorator getNonVisualChildDecorator()
-    {
-        if  (_nonVisualChildDecorator == null)
-        {
-            _nonVisualChildDecorator = 
-                new MouseSelectableChildDecorator((GraphicalEditPart)getHost()
-                        , PositionConstants.NORTH_EAST
-                        , getLayer(LayerConstants.FEEDBACK_LAYER)
-                        , getLayer(LayerConstants.HANDLE_LAYER));
-        }
-        return _nonVisualChildDecorator;
-    }
-
-	/**
-	 * @param request
-	 * @return true if we should be using object mode for this request
-	 */
-	public boolean shouldUseObjectMode(Request request) {
-		ElementEditPart part = (ElementEditPart) this.getHost();
-		if (isStyleTags(part)) {
-			return false;
-		}
-		if (part.isWidget()
-				|| (!part.canHaveDirectTextChild() && !part
-						.haveNonWhitespaceTextChild())) {
-			return true;
-		}
-		if (request instanceof SelectionRequest
-				&& ((SelectionRequest) request).isControlKeyPressed()) {
-			return true;
-		}
-		if (request instanceof LocationModifierRequest
-				&& ((LocationModifierRequest) request).isControlKeyPressed()) {
-			return true;
-		}
-
-		// for other elements
-		if (request instanceof LocationRequest) {
-			Point location = ((LocationRequest) request).getLocation()
-					.getCopy();
-			part.getFigure().translateToRelative(location);
-			return shouldUseObjectMode(location);
-		}
-        return false; // should not happen
-	}
-
-	/**
-	 * @param location
-	 * @return
-	 */
-	private boolean shouldUseObjectMode(Point location) {
-		// when the location is close to the border/padding of the element, then
-		// we think it is default to
-		// object mode selection.
-		CSSFigure figure = (CSSFigure) this.getHostFigure();
-		if (figure.getFragmentsBounds().length != 1) {
-			return false;
-		}
-		Rectangle bounds = figure.getBounds().getCopy();
-		Insets insets = figure.getInsets();
-		bounds.crop(insets);
-		if (insets.top > THRESHHOLD && insets.left > THRESHHOLD
-				&& insets.right > THRESHHOLD && insets.bottom > THRESHHOLD) {
-			return !bounds.contains(location);
-		}
-
-		// since the figure insets could be 0, so we expand it a little, thus
-		// even the point is
-		// a little inside the content area, we still think it is selection the
-		// object.
-		if (bounds.height < 3 * THRESHHOLD || bounds.width < 3 * THRESHHOLD) {
-			bounds.crop(INSETS_1);
-		} else {
-			bounds.crop(INSETS_CONST);
-		}
-		return !bounds.contains(location);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.ResizableEditPolicy#createSelectionHandles()
-	 */
-	protected List createSelectionHandles() {
-		// we have three different kinds of handles.
-		// 1. Those element that is resizable.
-		// 2. Those element that is rectangle but not resizable.
-		// 3. Those element that is not rectangle (fragments)
-
-		IFigure figure = this.getHostFigure();
-		if (figure instanceof CSSFigure && getHost() instanceof ElementEditPart) {
-			CSSFigure cssfigure = (CSSFigure) figure;
-			List fragments = cssfigure.getFragmentsForRead();
-
-			// XXX: only one fragment and is blockbox, then we think it is
-			// resizable by figure
-			// should move this test to somewhere else.
-			if (fragments != null && fragments.size() == 1
-					&& fragments.get(0) instanceof BlockBox) {
-				if (((ElementEditPart) getHost()).isResizable()) {
-					// super is Resizable policy, will create a resize handles.
-					return super.createSelectionHandles();
-				}
-                return createNonResizeHandles();
-			}
-            return createFragmentsHandles();
-		}
-        // second case
-        return createNonResizeHandles();
-	}
-
-	/**
-	 * @return
-	 */
-	private List createFragmentsHandles() {
-		List list = new ArrayList();
-		list.add(new FragmentHandle((GraphicalEditPart) getHost()));
-		return list;
-	}
-
-	/**
-	 * @return
-	 */
-	private List createNonResizeHandles() {
-		// following code copied from NonResizableEditPolicy
-		List list = new ArrayList();
-		if (isDragAllowed()) {
-			NonResizableHandleKit.addHandles((GraphicalEditPart) getHost(),
-					list);
-		} else {
-			NonResizableHandleKit.addHandles((GraphicalEditPart) getHost(),
-					list, new SelectEditPartTracker(getHost()),
-					SharedCursors.ARROW);
-		}
-
-		return list;
-	}
-
-
-    protected void hideSelection() {
-        super.hideSelection();
-        // handle removing the menu bar handle separately because it will decide
-        // when to remove itself (not removeSelectionHandles)
-        getNonVisualChildDecorator().updateState(MouseSelectableChildDecorator.EVENT_HOST_SELECTION_LOST);
-
-    }
-
-    protected void showSelection() {
-        super.showSelection();
-        // handle adding the menu bar handle separately because it will decide
-        // when to remove itself (not removeSelectionHandles
-        getNonVisualChildDecorator().updateState(MouseSelectableChildDecorator.EVENT_HOST_SELECTION_RECEIVED);
-    }
-
-    /**
-	 * child class could override this method.
-	 * 
-     * @param element 
-	 * @param width
-	 * @param height
-	 * @return the resize command or null  if none
-	 */
-	protected Command getResizeCommand(IDOMElement element, int width,
-			int height) {
-		Map map = new HashMap();
-		if (width > 0) {
-			map.put("width", width + "px");
-		}
-		if (height > 0) {
-			map.put("height", height + "px");
-		}
-		if (!map.isEmpty()) {
-            return new ChangeStyleCommand(element, map);
-		}
-        return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.ResizableEditPolicy#getResizeCommand(org.eclipse.gef.requests.ChangeBoundsRequest)
-	 */
-	protected Command getResizeCommand(ChangeBoundsRequest request) {
-		ElementEditPart part = (ElementEditPart) this.getHost();
-
-		Rectangle rect = part.getFigure().getBounds();
-		rect = request.getTransformedRectangle(rect);
-		int width = rect.width;
-		int height = rect.height;
-
-		// since the user dragged rectangle included border/padding of the
-		// element. And if the element's
-		// width/height style setting don't include border padding, then we need
-		// to set the element's width/height
-		// style property a little smaller.
-		if (part.getFigure() instanceof CSSFigure) {
-			CSSFigure cssfigure = (CSSFigure) part.getFigure();
-			ICSSStyle style = cssfigure.getCSSStyle();
-			if (style != null && !style.isSizeIncludeBorderPadding()) {
-				width -= (style.getBorderInsets().getWidth() + style
-						.getPaddingInsets().getWidth());
-				height -= (style.getBorderInsets().getHeight() + style
-						.getPaddingInsets().getHeight());
-			}
-		}
-
-		//make sure to only change the dimensions for the direction of the resize request.
-		int resizeDirection = request.getResizeDirection();
-		switch (resizeDirection) {
-			case PositionConstants.EAST:
-			case PositionConstants.WEST:
-				//resizing, only the width, so set the height to -1;
-				height = -1;
-				break;
-			case PositionConstants.NORTH:
-			case PositionConstants.SOUTH:
-				//resizing only the height, so set the width to -1
-				width = -1;
-				break;
-			default:
-				//all others are changing both directions...
-		}
-		return getResizeCommand((IDOMElement) part.getIDOMNode(), width, height);
-	}
-
-	/**
-	 * Shows or updates feedback for a change bounds request.
-	 * 
-	 * @param request
-	 *            the request
-	 */
-	protected void showChangeBoundsFeedback(ChangeBoundsRequest request) {
-		IFigure feedback = getDragSourceFeedbackFigure();
-
-		PrecisionRectangle rect = new PrecisionRectangle(
-				getInitialFeedbackBounds().getCopy());
-		getHostFigure().translateToAbsolute(rect);
-		rect.translate(request.getMoveDelta());
-		rect.resize(request.getSizeDelta());
-
-		// to avoid enlarge feedback pane.
-		// when draging a editpart inside designer to move/copy it, we do not
-		// want to
-		// enlarge the canvas, since that may resulting in relayout.
-		rect = (PrecisionRectangle) rect.intersect(getFeedbackLayer()
-				.getBounds());
-
-		feedback.translateToRelative(rect);
-		feedback.setBounds(rect);
-	}
-
-    public Cursor getSelectionToolCursor(Point mouseLocation) {
-        // by default return null to indicate system default.  
-        // sub-classes should override to customize
-        return null;
-    }
-
-    /**
-     * by default, return null
-     * sub-classes should override to customize
-     * @param request
-     * @return the selectin tracker
-     */
-    protected DragTracker getSelectionTracker(LocationRequest request)
-    {
-        return null;
-    }
-    
-    public DragTracker getSelectionDragTracker(LocationRequest request) 
-    {
-        if (org.eclipse.jst.pagedesigner.requests.PageDesignerRequestConstants.REQ_SELECTION_TRACKER.equals(request.getType())){
-            return getSelectionTracker(request);
-        }
-        
-        // be default don't specify a selection drag tracker
-        // sub-classes should override to customize
-        if (shouldUseObjectMode(request)) {
-            return new ObjectModeDragTracker(getHost());
-        }
-        return new RangeDragTracker(getHost());
-
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/FragmentCornerHandle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/FragmentCornerHandle.java
deleted file mode 100644
index ad3bd87..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/FragmentCornerHandle.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.handles.SquareHandle;
-import org.eclipse.jst.pagedesigner.tableedit.EmptyLocator;
-
-/**
- * A Handle used to mark the fragment.
- */
-public class FragmentCornerHandle extends SquareHandle {
-	FragmentCornerHandle(GraphicalEditPart owner) {
-		super(owner, new EmptyLocator());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.handles.AbstractHandle#createDragTracker()
-	 */
-	protected DragTracker createDragTracker() {
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/FragmentHandle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/FragmentHandle.java
deleted file mode 100644
index 5efd984..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/FragmentHandle.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import java.util.List;
-
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.LineBorder;
-import org.eclipse.draw2d.Locator;
-import org.eclipse.draw2d.PositionConstants;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.PrecisionRectangle;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Handle;
-import org.eclipse.gef.handles.AbstractHandle;
-import org.eclipse.gef.tools.DragEditPartsTracker;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.FlowBox;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class FragmentHandle extends AbstractHandle implements Handle {
-	/**
-	 * @param owner
-	 */
-	public FragmentHandle(GraphicalEditPart owner) {
-		super(owner, new FragmentLocator());
-		this.setOpaque(false);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.IFigure#paint(org.eclipse.draw2d.Graphics)
-	 */
-	public void paint(Graphics graphics) {
-		graphics.setClip(this.getBounds().getCopy().expand(7, 7));
-		super.paint(graphics);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.handles.AbstractHandle#createDragTracker()
-	 */
-	protected DragTracker createDragTracker() {
-		DragEditPartsTracker tracker = new DragEditPartsTracker(getOwner());
-		tracker.setDefaultCursor(getCursor());
-		return tracker;
-	}
-
-	private void refresh() {
-
-		// set the bounds of this figure, so it could cover all children.
-		bounds = getOwnerFigure().getBounds();
-		bounds = new PrecisionRectangle(bounds.getResized(-1, -1));
-		getOwnerFigure().translateToAbsolute(bounds);
-		this.translateToRelative(bounds);
-		this.setBounds(bounds);
-
-		this.removeAll();
-		// ok, recreate all children.
-		CSSFigure cssfigure = (CSSFigure) getOwner().getFigure();
-		List fragments = cssfigure.getFragmentsForRead();
-		for (int i = 0, size = fragments.size(); i < size; i++) {
-			// the rectangle.
-			Figure childFigure = new BorderFigure();
-			childFigure.setBorder(new LineBorder(1));
-			this.add(childFigure);
-
-			FlowBox box = (FlowBox) fragments.get(i);
-			Rectangle rect = new Rectangle(box.getX(), box.getY(), box.getWidth(), box
-					.getHeight());
-			cssfigure.translateToAbsolute(rect);
-
-			childFigure.translateToRelative(rect);
-			childFigure.setBounds(rect);
-
-			createCornerHandles(cssfigure, box);
-		}
-	}
-
-	/**
-	 * 
-	 */
-	private void createCornerHandles(CSSFigure reference, FlowBox referencebox) {
-		createHandle(reference, referencebox, PositionConstants.SOUTH_EAST);
-		createHandle(reference, referencebox, PositionConstants.SOUTH_WEST);
-		createHandle(reference, referencebox, PositionConstants.NORTH_WEST);
-		createHandle(reference, referencebox, PositionConstants.NORTH_EAST);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.IFigure#containsPoint(int, int)
-	 */
-	public boolean containsPoint(int x, int y) {
-		List children = this.getChildren();
-		for (int i = 0, n = children.size(); i < n; i++) {
-			if (((IFigure) children.get(i)).containsPoint(x, y)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @param north_east
-	 */
-	private void createHandle(CSSFigure reference, FlowBox referencebox,
-			int location) {
-		double relativeX, relativeY;
-		switch (location & PositionConstants.NORTH_SOUTH) {
-		case PositionConstants.NORTH:
-			relativeY = 0;
-			break;
-		case PositionConstants.SOUTH:
-			relativeY = 1.0;
-			break;
-		default:
-			relativeY = 0.5;
-		}
-
-		switch (location & PositionConstants.EAST_WEST) {
-		case PositionConstants.WEST:
-			relativeX = 0;
-			break;
-		case PositionConstants.EAST:
-			relativeX = 1.0;
-			break;
-		default:
-			relativeX = 0.5;
-		}
-
-		FragmentCornerHandle target = new FragmentCornerHandle(getOwner());
-		this.add(target);
-
-		// for corner small box.
-		Rectangle targetBounds = new Rectangle(referencebox.getX(),
-				referencebox.getY(), referencebox.getWidth(), referencebox
-						.getHeight());
-		targetBounds = new PrecisionRectangle(targetBounds);
-		reference.translateToAbsolute(targetBounds);
-		target.translateToRelative(targetBounds);
-		// targetBounds.resize(1, 1);
-
-		Dimension targetSize = target.getPreferredSize();
-
-		targetBounds.x += (int) (targetBounds.width * relativeX - ((targetSize.width + 1) / 2));
-		targetBounds.y += (int) (targetBounds.height * relativeY - ((targetSize.height + 1) / 2));
-		targetBounds.setSize(targetSize);
-		target.setBounds(targetBounds);
-	}
-
-	static class FragmentLocator implements Locator {
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.draw2d.Locator#relocate(org.eclipse.draw2d.IFigure)
-		 */
-		public void relocate(IFigure target) {
-			((FragmentHandle) target).refresh();
-		}
-	}
-
-	static class BorderFigure extends Figure {
-		/**
-		 * the bounds padding
-		 */
-		public static final int INNER_PAD = 2;
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.draw2d.IFigure#containsPoint(int, int)
-		 */
-		public boolean containsPoint(int x, int y) {
-			if (!super.containsPoint(x, y))
-				return false;
-			return !Rectangle.SINGLETON.setBounds(getBounds()).shrink(
-					INNER_PAD, INNER_PAD).contains(x, y);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/IEnhancedSelectionEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/IEnhancedSelectionEditPolicy.java
deleted file mode 100644
index 779762b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/IEnhancedSelectionEditPolicy.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.requests.LocationRequest;
-import org.eclipse.swt.graphics.Cursor;
-
-/**
- * Allows a selection edit policy to specify extra capabilities
- * 
- * @author cbateman
- */
-public interface IEnhancedSelectionEditPolicy 
-{
-    /**
-     * @param mouseLocation 
-     * @return the cursor that should be displayed when a selection tool
-     * enters the hit box (mouses over) of an edit part but no selection
-     * or drag operations have occurred yet.  Null indicates the caller should
-     * use whatever default it deems appropriate.
-     */
-    Cursor getSelectionToolCursor(Point mouseLocation);
-    
-    /**
-     * @param request 
-     * @param mouseLocator
-     * @return a drag tracker to be used when the mouse moves over a certain
-     * location and mouse state is in initial state or null if the policy
-     * doesn't wish to customize this. This allows an edit part
-     * to customize what drag tracker is used depending on where the mouse is positioned
-     * on its figure.
-     */
-    DragTracker getSelectionDragTracker(LocationRequest request);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ITableEditAdapter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ITableEditAdapter.java
deleted file mode 100644
index 0795c8a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/ITableEditAdapter.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public interface ITableEditAdapter {
-	/**
-	 * @return the column count
-	 */
-	public int getColumnCount();
-
-	/**
-	 * @return the row count
-	 */
-	public int getRowCount();
-
-	/**
-	 * @param atPosition
-	 */
-	public void insertColumn(int atPosition);
-
-	/**
-	 * @param rowPosition
-	 */
-	public void insertRow(int rowPosition);
-
-	/**
-	 * @param columnIndex
-	 * @return the starting point for resize
-	 */
-	public int getColumnResizeStart(int columnIndex);
-
-	/**
-	 * @return the resize width
-	 */
-	public int getColumnResizeWidth();
-
-	/**
-	 * @param columnIndex
-	 * @return column start
-	 */
-	public int getColumnStart(int columnIndex);
-
-	/**
-	 * @param columnIndex
-	 * @return the column width
-	 */
-	public int getColumnWidth(int columnIndex);
-
-	/**
-	 * @param rowIndex
-	 * @return the row start
-	 */
-	public int getRowStart(int rowIndex);
-
-	/**
-	 * @param rowIndex
-	 * @return the row height
-	 */
-	public int getRowHeight(int rowIndex);
-
-	/**
-	 * @param rowIndex
-	 * @return starting point of the row resize
-	 */
-	public int getRowResizeStart(int rowIndex);
-
-	/**
-	 * @return the row resize width
-	 */
-	public int getRowResizeWidth();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/JSFDropEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/JSFDropEditPolicy.java
deleted file mode 100644
index 0b36919..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/JSFDropEditPolicy.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.GraphicalEditPolicy;
-import org.eclipse.jst.pagedesigner.commands.PDDropRequest;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class JSFDropEditPolicy extends GraphicalEditPolicy {
-	String _attrName;
-
-	/**
-	 * @param attrname
-	 */
-	public JSFDropEditPolicy(String attrname) {
-		_attrName = attrname;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#getTargetEditPart(org.eclipse.gef.Request)
-	 */
-	public EditPart getTargetEditPart(Request request) {
-		if (request instanceof PDDropRequest) {
-			return getHost();
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#getCommand(org.eclipse.gef.Request)
-	 */
-	public Command getCommand(Request request) {
-		if (request instanceof PDDropRequest) {
-			PDDropRequest r = (PDDropRequest) request;
-			final String s = (String) r.getCurrentEvent().data;
-			return new Command() {
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.gef.commands.Command#execute()
-				 */
-				public void execute() {
-					// XXX: should check whether alreayd set the attribute,
-					// maybe
-					// should also popup dialog etc.
-					((Element) getHost().getModel()).setAttribute(_attrName, s);
-				}
-			};
-		}
-
-		return super.getCommand(request);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#eraseTargetFeedback(org.eclipse.gef.Request)
-	 */
-	public void eraseTargetFeedback(Request request) {
-		// 
-		super.eraseTargetFeedback(request);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#showTargetFeedback(org.eclipse.gef.Request)
-	 */
-	public void showTargetFeedback(Request request) {
-		super.showTargetFeedback(request);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/LinkEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/LinkEditPolicy.java
deleted file mode 100644
index ad222be..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/LinkEditPolicy.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.editpolicies.GraphicalEditPolicy;
-import org.eclipse.jst.pagedesigner.actions.link.LinkRequest;
-import org.eclipse.jst.pagedesigner.actions.link.MakeLinkCommand;
-import org.eclipse.jst.pagedesigner.parts.TextEditPart;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class LinkEditPolicy extends GraphicalEditPolicy {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.EditPolicy#getCommand(org.eclipse.gef.Request)
-	 */
-	public Command getCommand(Request request) {
-		EditPart part = this.getHost();
-		IHTMLGraphicalViewer viewer = null;
-		if (part instanceof TextEditPart) {
-			//TODO: ?? part = (TextEditPart) part;
-			viewer = (IHTMLGraphicalViewer) part.getViewer();
-		}
-		if (request instanceof LinkRequest) {
-			LinkRequest req = (LinkRequest) request;
-			String identifier = req.getIdentifier();
-			DesignRange range = req.getDesignRange();
-            // TODO: when part !instancof TextEditPart, viewer == null
-			Command command = new MakeLinkCommand(identifier, viewer, part,
-					range);
-			return command;
-		}
-		return super.getCommand(request);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/LocationHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/LocationHelper.java
deleted file mode 100644
index b6e09fe..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/LocationHelper.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.jst.pagedesigner.css2.layout.FlowBox;
-import org.eclipse.jst.pagedesigner.css2.layout.ICSSFigure;
-import org.eclipse.jst.pagedesigner.parts.DocumentEditPart;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
-import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public final class LocationHelper {
-	/**
-	 * @param host 
-	 * @param p
-	 * @param result
-	 * @param tagName
-	 * @param skip
-	 * @return  true if insertion point is found
-	 */
-	public static boolean findInsertLocation(GraphicalEditPart host, Point p,
-			GraphicalEditPart[] result, String tagName, Node skip) {
-		if (isHostInsideSkip(host, skip))
-			return false;
-
-		while (isValidHost(host) && !canHostContainTag(host, tagName)) {
-			if (host.getParent() instanceof GraphicalEditPart)
-				host = (GraphicalEditPart) host.getParent();
-			else
-				host = null;
-		}
-		if (!isValidHost(host))
-			return false;
-
-		// ok, next we try to find a insertion point inside host
-		result[0] = host;
-		List children = host.getChildren();
-		if (children.isEmpty()) {
-			result[1] = null;
-			return true;
-		}
-		// TODO: never read GraphicalEditPart ref = null;
-		for (int i = 0, size = children.size(); i < size; i++) {
-			GraphicalEditPart child = (GraphicalEditPart) children.get(i);
-			Rectangle rect = getAbsoluteBounds(child);
-
-			if (rect.contains(p)) {
-				IFigure figure = child.getFigure();
-				if (figure instanceof ICSSFigure) {
-					List frags = ((ICSSFigure) figure).getFragmentsForRead();
-					if (frags.size() > 1) // more than one frags, so is a zig
-					// zag.
-					{
-						// check whether is before the first box.
-						FlowBox box = (FlowBox) frags.get(0);
-						Rectangle rect1 = getAbsoluteBounds(figure, box);
-						if (rect1.x > p.x && rect1.y + rect1.height > p.y) {
-							// p is at left/above the first box. so we think p
-							// is before this child
-							result[1] = child;
-							return true;
-						}
-						// check whether is after the last box
-						box = (FlowBox) frags.get(frags.size() - 1);
-						rect1 = getAbsoluteBounds(figure, box);
-						if (rect1.x < p.x && rect1.y < p.y) {
-							continue;
-						}
-					}
-				}
-				// ok, treat as the point in a rect figure, see which side is
-				// closer.
-				if (p.x > rect.x + rect.width / 2) {
-					continue;
-				}
-                result[1] = child;
-                return true;
-			} else if (rect.x + rect.width < p.x || rect.y + rect.height < p.y) {
-				// p is at right or below rect. so the point is "after" the
-				// rect.
-				continue;
-			} else {
-				// ok, p is "before" rect.
-				result[1] = child;
-				return true;
-			}
-		}
-		// we search through all.
-		result[1] = null;
-		return true;
-	}
-
-	/**
-	 * @param figure
-	 * @param box
-	 * @return the bounding rectangle
-	 */
-	public static Rectangle getAbsoluteBounds(IFigure figure, FlowBox box) {
-		Rectangle r = new Rectangle(box.getX(), box.getY(), box.getWidth(), box
-				.getHeight());
-		figure.translateToAbsolute(r);
-		return r;
-	}
-
-	/**
-	 * @param child
-	 * @return the bounding rectangle
-	 */
-	public static Rectangle getAbsoluteBounds(GraphicalEditPart child) {
-		Rectangle bounds = child.getFigure().getBounds().getCopy();
-		child.getFigure().translateToAbsolute(bounds);
-		return bounds;
-	}
-
-	/**
-	 * @param host
-	 * @param tagName
-	 * @return
-	 */
-	private static boolean canHostContainTag(GraphicalEditPart host,
-			String tagName) {
-		if (host == null)
-			return false;
-		Node node = (Node) host.getModel();
-		if (node.getNodeType() == Node.ELEMENT_NODE) {
-			ModelQuery modelQuery = getModelQuery(node);
-			if (modelQuery != null) {
-				CMElementDeclaration elementDecl = modelQuery
-						.getCMElementDeclaration((Element) node);
-				if (elementDecl == null) {
-					return true;
-				}
-				if (elementDecl.getContentType() == CMElementDeclaration.EMPTY)
-					return false;
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * @param host
-	 * @return
-	 */
-	private static boolean isValidHost(GraphicalEditPart host) {
-		return host != null
-				&& (host instanceof ElementEditPart || host instanceof DocumentEditPart);
-	}
-
-	/**
-	 * @param host
-	 * @param skip
-	 * @return
-	 */
-	private static boolean isHostInsideSkip(GraphicalEditPart host, Node skip) {
-		if (skip == null)
-			return false;
-
-		// XXX: not done.
-		return false;
-	}
-
-	private static ModelQuery getModelQuery(Node node) {
-        Document doc = node.getOwnerDocument();
-        
-		if (node.getNodeType() == Node.DOCUMENT_NODE) {
-            doc = (Document) node;
-		}
-        return ModelQueryUtil.getModelQuery(doc);
-	}
-
-	private LocationHelper()
-	{
-	    // util class, no external instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/MouseSelectableChildDecorator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/MouseSelectableChildDecorator.java
deleted file mode 100644
index 0da7f9b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/MouseSelectableChildDecorator.java
+++ /dev/null
@@ -1,627 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-/**
- * 
- */
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Locator;
-import org.eclipse.draw2d.MouseEvent;
-import org.eclipse.draw2d.MouseListener;
-import org.eclipse.draw2d.MouseMotionListener;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.PrecisionRectangle;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * A child decorator that supports mouse selection
- * 
- * @author cbateman
- *
- */
-class MouseSelectableChildDecorator extends NonVisualChildDecorator
-{
-    // no visual or affordance showing
-    private static final int           STATE_START = 0;
-    
-    // the host is showing hover feedback, but is not selected
-    private static final int           STATE_HOST_HOVER = 1;
-    
-    // the host has primary selection
-    private static final int           STATE_HOST_SELECTED = 2;
-    
-    // the selection handle for the decorator has mouse hover
-    private static final int           STATE_HANDLE_HOVER = 3;
-    
-    // the selection handle has been selected (is showing)
-    private static final int           STATE_HANDLE_MENU_BAR_SHOWING = 4;
-    
-    // the menu bar has hover
-    private static final int           STATE_HANDLE_MENU_BAR_HOVER = 5;
-    
-    // the menu bar has primary selection
-    private static final int           STATE_HANDLE_MENU_BAR_SELECTED = 6;
-    
-    /**
-     * An event indicating the host received hover
-     */
-    public static final int           EVENT_HOST_HOVER_RECEIVED = 31;
-    /**
-     * An event indicating the host lost hover
-     */
-    public static final int           EVENT_HOST_HOVER_LOST = 32;
-    /**
-     * An event indicating the host received selection
-     */
-    public static final int           EVENT_HOST_SELECTION_RECEIVED = 33;
-    /**
-     * An event indicating the host lost selection
-     */
-    public static final int           EVENT_HOST_SELECTION_LOST = 34;
-    private static final int          EVENT_HANDLE_HOVER_RECEIVED = 35;
-    private static final int          EVENT_HANDLE_HOVER_LOST = 36;
-    private static final int          EVENT_HANDLE_SELECTED = 37;
-    private static final int          EVENT_ALL_SELECTION_LOST = 38;
-    private static final int          EVENT_MENU_BAR_SELECTION_RECEIVED = 39;
-    
-    private MouseMotionListener      _motionListener;
-    private MouseListener            _mouseListener;
-    private boolean                  _isMouseOver = false;
-    private ElementMenuBar           _elementMenuBar;
-
-    private DisplayStateMachine      _stateMachine;
-    private VerticalMenuLocator      _menuLocator;
-    private AnimatedHideLocator      _hideLocator;
-    private IFigure                  _hoverParent;
-    private IFigure                  _selectionParent;
-
-    private ISelectionChangedListener _menuSelectionListener;
-    
-    MouseSelectableChildDecorator(final GraphicalEditPart hostPart, int location, 
-            IFigure hoverParent, IFigure selectionParent) {
-        super(hostPart, location);
-        _menuLocator = new VerticalMenuLocator(hostPart, this);
-        _hideLocator = new AnimatedHideLocator();
-        _elementMenuBar = ((ElementEditPart)hostPart).getElementMenuBar();
-        _stateMachine = new DisplayStateMachine();
-        _hoverParent = hoverParent;
-        _selectionParent = selectionParent;
-        
-        _motionListener = new MouseMotionListener.Stub()
-        {
-            public void mouseEntered(MouseEvent me) {
-                _isMouseOver = true;
-                updateState(EVENT_HANDLE_HOVER_RECEIVED);
-            }
-    
-            public void mouseExited(MouseEvent me) {
-                _isMouseOver = false;
-                updateState(EVENT_HANDLE_HOVER_LOST);
-            }
-        };
-        addMouseMotionListener(_motionListener);
-            
-        _mouseListener = new MouseListener.Stub()
-        {
-            public void mousePressed(MouseEvent me) {
-                updateState(EVENT_HANDLE_SELECTED);
-            }
-        };
-        addMouseListener(_mouseListener);
-        
-        _menuSelectionListener = new ISelectionChangedListener()
-        {
-            public void selectionChanged(SelectionChangedEvent event) {
-                IStructuredSelection selection = (IStructuredSelection) event.getSelection();
-                if (selection.size() == 0)
-                {
-                    // if the host part has been given back selection, then
-                    // we have a host selection event
-                    if (getOwner().getSelected() == EditPart.SELECTED_PRIMARY)
-                    {
-                        updateState(EVENT_HOST_SELECTION_RECEIVED);
-                    }
-                    // otherwise, both the host and the non-visual children are lost,
-                    // so fire all selection lost
-                    else
-                    {
-                        updateState(EVENT_ALL_SELECTION_LOST);
-                    }
-                }
-                // otherwise, one or more non-visual children have selection
-                else
-                {
-                    updateState(EVENT_MENU_BAR_SELECTION_RECEIVED);
-                }
-            }
-        };
-        _elementMenuBar.addSelectionChangedListener(_menuSelectionListener);
-    }
-    
-    public void paintFigure(Graphics g) {
-        // TODO: could we use an image label toggle button here instead?    
-        Image  arrowImage = null;
-        
-        if (_stateMachine.isMenuShowing())
-        {
-            arrowImage = PDPlugin.getDefault().getImage("pin_down.gif");
-        }
-        else
-        {
-            arrowImage = PDPlugin.getDefault().getImage("pin_up.gif");
-        }
-        
-        Rectangle r = getBounds();
-        g.setAlpha(75);
-        g.setBackgroundColor(getFillColor());
-        g.fillRectangle(r.x, r.y, r.width, r.height);
-        g.setAlpha(getAlpha());
-        g.drawImage(arrowImage, r.x+1, r.y+1);
-        g.setForegroundColor(getBorderColor()); 
-        g.drawRectangle(r.x, r.y, r.width-1, r.height-1);
-    }
-
-    /**
-     * @param event
-     */
-    public void updateState(int event)
-    {
-        int oldState = _stateMachine.doTransition(event);
-        updateVisual(oldState);
-    }
-    
-    /**
-     * @param oldState
-     */
-    protected void updateVisual(int oldState)
-    {
-        // overriding all other considerations is whether the menu bar even has
-        // any items to show.  If not don't show anything
-        if (!_elementMenuBar.hasChildParts())
-        {
-            if (getParent() != null)
-            {
-                getParent().remove(this);
-            }
-            
-            return;
-        }
-        
-        switch (_stateMachine._curState)
-        {
-            case STATE_START:
-                hide(_elementMenuBar, false);
-                IFigure parent = getParent();
-                if (parent != null)
-                {
-                    parent.remove(this);
-                }
-            break;
-            
-            case STATE_HOST_HOVER:
-                if (_hoverParent != null)
-                {
-                    _hoverParent.add(this);
-                    validate();
-                }
-                show(_elementMenuBar, false);
-                setVisible(false);
-            break;
-            
-            case STATE_HOST_SELECTED:
-                if (_selectionParent != null)
-                {
-                    _selectionParent.add(this);
-                    validate();
-                }
-
-                setVisible(true);
-
-                if (oldState != STATE_HOST_SELECTED
-                        && oldState != STATE_HANDLE_HOVER)
-                {
-                    show(_elementMenuBar, true);
-                    hide(_elementMenuBar, true);
-                }
-                else
-                {
-                    if (!_hideLocator._isAnimating)
-                    {
-                        hide(_elementMenuBar, false);
-                    }
-                }
-                repaint();
-            break;
-            
-            case STATE_HANDLE_HOVER:
-                if (_stateMachine.isMenuShowing(oldState))
-                {
-                    hide(_elementMenuBar, false);
-                }
-                else
-                {
-                    show(_elementMenuBar, false);
-                }
-                repaint();
-            break;
-            
-            case STATE_HANDLE_MENU_BAR_SHOWING:
-                show(_elementMenuBar, true);
-                repaint();
-            break;
-            
-            case STATE_HANDLE_MENU_BAR_HOVER:
-            case STATE_HANDLE_MENU_BAR_SELECTED:
-                //revalidate();
-            break;
-            
-            
-            default:
-                
-        }
-    }
-
-    protected void init() {
-        setPreferredSize(new Dimension(12, 12));
-    }
-    
-    /**
-     * 
-     */
-    public void dispose()
-    {
-        hide(_elementMenuBar, false);
-        
-        if (_motionListener != null)
-        {
-            removeMouseMotionListener(_motionListener);
-            _motionListener = null;
-        }
-        
-        if (_mouseListener != null)
-        {
-            removeMouseListener(_mouseListener);
-            _mouseListener = null;
-        }
-        
-        if (_menuSelectionListener != null)
-        {
-            _elementMenuBar.removeSelectionChangedListener(_menuSelectionListener);
-            _menuSelectionListener = null;
-        }
-    }
-    
-    private void hide(ElementMenuBar menuBar, boolean animate)
-    {
-        if (animate)
-        {
-            final Point endPoint = this.getLocation().getCopy();
-            //TODO: don't understand when translation is necessary...
-            //this.translateToAbsolute(endPoint);
-            
-            endPoint.x += this.getBounds().width / 2;
-            endPoint.y += this.getBounds().height / 2;
-            _hideLocator.setHideEndPoint(endPoint);
-            _hideLocator.relocate(menuBar);
-        }
-        else 
-        {
-            if (menuBar.getParent() != null)
-            {
-                getParent().remove(menuBar);
-            }
-        }
-    }
-    
-    private void show(ElementMenuBar menuBar, boolean enabled)
-    {
-        menuBar.setEnabled(enabled);
-        getParent().add(menuBar);
-        _menuLocator.relocate(menuBar);
-    }
-    
-    protected int getAlpha() 
-    {
-        return (_isMouseOver || _stateMachine.isMenuShowing()) ? 255 : 75;
-    }
-    
-    private class DisplayStateMachine
-    {
-        private int _curState = STATE_START;
-        
-        /**
-         * @param event
-         * @return execute a state machine transition on event
-         */
-        public int doTransition(int event)
-        {
-            final int     oldState = _curState;
-            
-            switch(_curState)
-            {
-                case STATE_START:
-                    // can only transition from start state
-                    // on a host event
-                    if (event == EVENT_HOST_HOVER_RECEIVED)
-                    {
-                        _curState = STATE_HOST_HOVER;
-                    }
-                    else if (event == EVENT_HOST_SELECTION_RECEIVED)
-                    {
-                        _curState = STATE_HOST_SELECTED;
-                    }
-                break;
-                
-                case STATE_HOST_HOVER:
-                    if (event == EVENT_HOST_SELECTION_RECEIVED)
-                    {
-                        _curState = STATE_HOST_SELECTED;
-                    }
-                    else if (event == EVENT_HOST_SELECTION_LOST
-                            || event == EVENT_HOST_HOVER_LOST)
-                    {
-                        _curState = STATE_START;
-                    }
-                    else if (event == EVENT_HOST_HOVER_RECEIVED)
-                    {
-                        // preserve state in this case
-                    }
-                break;
-
-                case STATE_HOST_SELECTED:
-                    // once the host is selected,the only host event that
-                    // that can change state is selection lost
-                    if (event == EVENT_HOST_SELECTION_LOST)
-                    {
-                        _curState = STATE_START;
-                    }
-                    else if (event == EVENT_HANDLE_HOVER_RECEIVED)
-                    {
-                        _curState = STATE_HANDLE_HOVER;
-                    }
-                    else if (event == EVENT_HANDLE_SELECTED)
-                    {
-                        _curState = STATE_HANDLE_MENU_BAR_SHOWING;
-                    }
-                    else if (event == EVENT_ALL_SELECTION_LOST)
-                    {
-                        _curState = STATE_START;
-                    }
-                break;
-                    
-                case STATE_HANDLE_HOVER:
-                    if (event == EVENT_HANDLE_HOVER_LOST)
-                    {
-                        _curState = STATE_HOST_SELECTED;
-                    }
-                    else if (event == EVENT_HANDLE_SELECTED)
-                    {
-                        _curState = STATE_HANDLE_MENU_BAR_SHOWING;
-                    }
-                    else if (event == EVENT_HOST_SELECTION_LOST)
-                    {
-                        _curState = STATE_START;
-                    }
-                break;
-                case STATE_HANDLE_MENU_BAR_SHOWING:
-                    if (event == EVENT_HANDLE_SELECTED)
-                    {
-                        _curState = STATE_HANDLE_HOVER;
-                    }
-                    else if (event == EVENT_MENU_BAR_SELECTION_RECEIVED)
-                    {
-                        _curState = STATE_HANDLE_MENU_BAR_SELECTED;
-                    }
-                    else if (event == EVENT_ALL_SELECTION_LOST)
-                    {
-                        _curState = STATE_START;
-                    }
-                break;
-
-                case STATE_HANDLE_MENU_BAR_HOVER:
-                break;                    
-
-                case STATE_HANDLE_MENU_BAR_SELECTED:
-                    if (event == EVENT_ALL_SELECTION_LOST)
-                    {
-                        _curState = STATE_START;
-                    }
-                    else if (event == EVENT_HANDLE_SELECTED)
-                    {
-                        _curState = STATE_HANDLE_HOVER;
-                    }
-                break;
-                
-            }
-            
-            
-            return oldState;
-        }
-
-        /**
-         * @return true if the  menu should be showing in the  current state
-         */
-        public boolean isMenuShowing()
-        {
-            return isMenuShowing(_curState);
-        }
-
-        /**
-         * @param state
-         * @return true if state is one in which the menu should be showing
-         */ 
-        public boolean isMenuShowing(int state)
-        {
-            return _curState == STATE_HANDLE_MENU_BAR_SHOWING 
-                    || _curState == STATE_HANDLE_MENU_BAR_HOVER
-                    || _curState == STATE_HANDLE_MENU_BAR_SELECTED;
-        }
-    }
-    
-    private static class VerticalMenuLocator implements Locator
-    {
-        private IFigure  _referenceFigure;
-        
-        VerticalMenuLocator(GraphicalEditPart owner, IFigure reference)
-        {
-            _referenceFigure = reference;
-        }
-        
-        public void relocate(IFigure target) 
-        {
-            final Rectangle finalBounds = getFinalMenuBounds(target);
-            target.setBounds(finalBounds);
-        }
-        
-        
-        private Rectangle getInitialMenuBounds(final IFigure target)
-        {
-            Rectangle targetBounds = 
-                new PrecisionRectangle(_referenceFigure.getBounds().getResized(-1, -1));
-            _referenceFigure.translateToAbsolute(targetBounds);
-            target.translateToRelative(targetBounds);
-            return targetBounds;
-        }
-
-        private Rectangle getFinalMenuBounds(final IFigure target)
-        {
-            final IFigure referenceFigure =  _referenceFigure;
-            
-            Rectangle targetBounds = getInitialMenuBounds(target);
-            Dimension targetSize = target.getPreferredSize();
-
-            // copied from super.relocate because relativeX/Y are private in super
-            // changed from super to remove div by 2 that centers target; we want
-            // it to be corner-to-corner
-            targetBounds.x
-                += targetBounds.width+4;
-            targetBounds.y
-                  -= (targetSize.height / 2) - referenceFigure.getBounds().height/2;
-            targetBounds.setSize(targetSize);
-            //target.setBounds(targetBounds);
-
-//            final Rectangle viewPortRect = 
-//                ((IHTMLGraphicalViewer)_owner.getViewer()).getViewport().getBounds();
-//            final Rectangle targetRect = targetBounds.getCopy();
-//            
-//            targetRect.intersect(viewPortRect);
-
-//            int width = targetBounds.width - targetRect.width;
-//            int height = targetBounds.height - targetRect.height;
-            
-//            if (width != 0)
-//            {
-//                targetBounds.x -= width;
-//            }
-//            
-//            if (height != 0)
-//            {
-//                targetBounds.y += height;
-//            }
-            
-            return targetBounds;
-        }
-    }
-    
-    private static class AnimatedHideLocator implements Locator
-    {
-        private Point _endPoint;
-        private boolean _isAnimating;
-        
-        /**
-         * @param endPoint -- must be absolute coordinate
-         */
-        public void setHideEndPoint(Point endPoint)
-        {
-            _endPoint = endPoint;
-        }
-        
-        public void relocate(IFigure target) 
-        {
-            final Point newEndPoint = _endPoint.getCopy();
-            target.translateToRelative(_endPoint);
-            Rectangle startBounds = target.getBounds().getCopy();
-            animateBoundsChange(target, startBounds, newEndPoint);
-        }
-
-        private void animateBoundsChange(final IFigure target, 
-                final Rectangle startBounds, 
-                final Point endPoint)
-        {
-            final int numSteps = 5;
-            final int numMs = 500;
-            final int timeSteps = numMs/numSteps;
-            
-            int xDelta = endPoint.x - startBounds.x;
-            int yDelta = endPoint.y - startBounds.y;
-            
-            final int widthIncrement = -1 * startBounds.width / numSteps;
-            final int heightIncrement = -1 * startBounds.height / numSteps;
-            int xIncrement = xDelta / numSteps;
-            int yIncrement = yDelta  / numSteps;
-            
-            target.setBounds(startBounds);
-            if (widthIncrement != 0 || heightIncrement != 0)
-            {
-                _isAnimating = true;
-                doAnimation(numMs, timeSteps, widthIncrement, heightIncrement, xIncrement, yIncrement, endPoint, target);
-            }
-        }
-        
-        private void doAnimation(final int remainingTime, 
-                final int timeIncrement, 
-                final int widthIncrement, final int heightIncrement
-                , final int xIncrement, final int yIncrement
-                , final Point endPoint
-                , final IFigure target)
-        {
-            Display.getCurrent().timerExec(timeIncrement, 
-            new Runnable()
-            {
-            public void run() 
-            {
-               if (remainingTime <= 0)
-               {
-                   if (target.getParent() != null)
-                   {
-                       target.getParent().remove(target);
-                   }
-                   _isAnimating = false;
-               }
-               else
-               {
-                   final Rectangle curBounds = target.getBounds().getCopy();
-                   curBounds.width += widthIncrement;
-                   curBounds.height += heightIncrement;
-                   curBounds.x += xIncrement;
-                   curBounds.y += yIncrement;
-                   target.setBounds(curBounds);
-                   target.revalidate();
-                   doAnimation(remainingTime-timeIncrement, timeIncrement, widthIncrement, heightIncrement, xIncrement, yIncrement, endPoint, target);
-               }
-            }
-            });
-         }
-    }
-}
-
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/MoveSupport.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/MoveSupport.java
deleted file mode 100644
index dc420cf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/MoveSupport.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import java.util.List;
-
-import org.eclipse.gef.requests.ChangeBoundsRequest;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class MoveSupport {
-	/**
-	 * Check whether the move operation only drags a single node.
-	 * 
-	 * @param request
-	 * @return true if the request affects a single node
-	 */
-	public static boolean isSingleNode(ChangeBoundsRequest request) {
-		List parts = request.getEditParts();
-		if (parts == null || parts.size() != 1
-				|| !(parts.get(0) instanceof NodeEditPart)) {
-			return false;
-		}
-        return true;
-	}
-
-	/**
-	 * this method must be called after isSingleNode
-	 * 
-	 * @param request
-	 * @return the dragged part
-	 */
-	public static NodeEditPart getDraggedPart(ChangeBoundsRequest request) {
-		List parts = request.getEditParts();
-		NodeEditPart part = (NodeEditPart) parts.get(0);
-		return part;
-	}
-
-	/**
-	 * this method must be called after isSingleNode
-	 * 
-	 * @param request
-	 * @return the dragged node
-	 */
-	public static Node getDraggedNode(ChangeBoundsRequest request) {
-		return getDraggedPart(request).getIDOMNode();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/NonVisualChildDecorator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/NonVisualChildDecorator.java
deleted file mode 100644
index 2f9c1e6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/NonVisualChildDecorator.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-/**
- * 
- */
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.GraphicalEditPart;
-
-class NonVisualChildDecorator extends ElementDecoratorSquareHandle
-{
-   
-    NonVisualChildDecorator(final GraphicalEditPart hostPart, int location)
-    {
-        super(hostPart, new CornerRelativeHandleLocator(hostPart.getFigure(), location));
-    }
-
-    protected void init() {
-        setPreferredSize(new Dimension(8, 8));
-    }
-    
-    public void ancestorMoved(IFigure ancestor) {
-        // TODO: for some reason this causes an infinite loop
-        // when in the feedback layer...
-        //super.ancestorMoved(ancestor);
-    }
-
-    protected DragTracker createDragTracker() {
-        return null;
-    }
-    
-    protected int getAlpha()
-    {
-        return 255;
-    }
-
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/NonVisualChildGraphicalEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/NonVisualChildGraphicalEditPolicy.java
deleted file mode 100644
index 59678d2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/NonVisualChildGraphicalEditPolicy.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.RectangleFigure;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.RequestConstants;
-import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
-import org.eclipse.gef.requests.LocationRequest;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.parts.NonVisualComponentEditPart;
-import org.eclipse.swt.graphics.Color;
-import org.w3c.dom.Element;
-
-/**
- * An edit policy for non visual child edit parts
- * @author cbateman
- *
- */
-public class NonVisualChildGraphicalEditPolicy extends NonResizableEditPolicy 
-{
-    // the number of pixels to offset the top left of tooltop feedback
-    // below the current mouse cursor location
-    private static final int TOOLTIP_VERTICAL_OFFSET = 25;
-    private final static Color HOVER_FEEDBACK_COLOR = ColorConstants.blue;
-    
-    
-    private BasicLabelToolTip   _toolTip;
-    private boolean             _showLabelFeedback;
-    private RectangleFigure _mouseOverBorder;
-
-    public void showTargetFeedback(Request request) {
-        if (RequestConstants.REQ_SELECTION_HOVER.equals(request.getType())) {
-            removeToolTipLabel();
-            removeMouseOverBorder();
-            Assert.isTrue(request instanceof LocationRequest);
-            // don't show tooltip if drag is active
-            _showLabelFeedback = !((NodeEditPart)getHost()).isDragActive();
-            showHoverFeedback((LocationRequest)request);
-        } else {
-            super.showTargetFeedback(request);
-        }
-
-    }
-
-    public void eraseTargetFeedback(Request request) {
-        removeToolTipLabel();
-        removeMouseOverBorder();
-    }
-
-    /**
-     * @param request
-     */
-    private void showHoverFeedback(LocationRequest request)
-    {
-        if (_showLabelFeedback)
-        {
-            addMouseOverBorder();
-            _toolTip = new BasicLabelToolTip(getTooltipText());
-            addFeedback(_toolTip);
-
-            // use mouse cursor plus an offset so the tooltip doesn't
-            // appear z-ordered below the mouse cursor
-            AbsolutePointLocator locator = AbsolutePointLocator.getInstance();
-            locator.setReferencePoint(request.getLocation(), 0, TOOLTIP_VERTICAL_OFFSET);
-            //  to avoid enlargemeent of the feedback layer
-            locator.setIntersectFigure(getFeedbackLayer());
-            locator.relocate(_toolTip);
-        }
-    }
-    
-    private String getTooltipText() {
-        Element element = (Element) ((NonVisualComponentEditPart)getHost()).getDOMNode();
-        StringBuffer text = new StringBuffer(element.getTagName());
-        return text.toString();
-    }
-    
-    private void addMouseOverBorder()
-    {
-        if (_mouseOverBorder == null)
-        {
-            _mouseOverBorder = new RectangleFigure();
-            _mouseOverBorder.setFill(false);
-            _mouseOverBorder.setOutline(true);
-            _mouseOverBorder.setLineWidth(1);
-            _mouseOverBorder.setForegroundColor(HOVER_FEEDBACK_COLOR);
-        }
-        
-        addFeedback(_mouseOverBorder);
-        
-        IFigure hostFigure = getHostFigure();
-        Rectangle r = hostFigure.getBounds().getCopy().expand(1, 1);
-        hostFigure.translateToAbsolute(r);
-        _mouseOverBorder.translateToRelative(r);
-
-        _mouseOverBorder.setBounds(r);
-    }
-    
-    /**
-     * 
-     */
-    private void removeMouseOverBorder()
-    {
-        if (_mouseOverBorder != null) {
-            removeFeedback(_mouseOverBorder);
-            _mouseOverBorder = null;
-        }
-    }
-    
-    protected List createSelectionHandles() {
-//        return super.createSelectionHandles();
-        return Collections.EMPTY_LIST;  
-    }
-
-    /**
-     * 
-     */
-    private void removeToolTipLabel()
-    {
-        if (_toolTip != null) {
-            removeFeedback(_toolTip);
-            _toolTip = null;
-        }
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/PDEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/PDEditPolicy.java
deleted file mode 100644
index 72e76d6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/PDEditPolicy.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-/**
- * @author mengbo
- */
-public interface PDEditPolicy {
-	/**
-	 * the edit policy for PD Drop
-	 */
-	String PDDROP_ROLE = "PDDropEditPolicy"; //$NON-NLS-1$
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/PolicyHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/PolicyHelper.java
deleted file mode 100644
index 79b8f7f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/PolicyHelper.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.editpolicies;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- */
-public class PolicyHelper {
-	private static Logger _log = PDPlugin.getLogger(PolicyHelper.class);
-
-	/**
-	 * @param part
-	 * @return the current viewer's status line manager or null
-	 */
-	public static IStatusLineManager getStatusLineManager(EditPart part) {
-		EditPartViewer v = part.getViewer();
-		if (v instanceof IHTMLGraphicalViewer) {
-			IHTMLGraphicalViewer htmlviewer = (IHTMLGraphicalViewer) v;
-			IStatusLineManager m = htmlviewer.getStatusLineManager();
-			if (m == null) {
-				_log.info("Warn.PolicyHelper.0", (String) null); //$NON-NLS-1$
-			}
-			return m;
-		}
-		_log.info("Warn.PolicyHelper.1", (String)null); //$NON-NLS-1$
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/AbstractElementEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/AbstractElementEdit.java
deleted file mode 100644
index ac2c123..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/AbstractElementEdit.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit;
-
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.pagedesigner.itemcreation.ITagCreator;
-import org.eclipse.jst.pagedesigner.itemcreation.customizer.AbstractDropCustomizer;
-import org.eclipse.jst.pagedesigner.itemcreation.customizer.IDropCustomizer;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.viewer.IDropLocationStrategy;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.w3c.dom.Element;
-
-/**
- * <p><b>Provisional API - subject to change</b></p>
- * @author mengbo
- * @version 1.5
- */
-// TODO: should this be abstract?
-public class AbstractElementEdit implements IElementEdit {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#createEditPolicies(org.eclipse.jst.pagedesigner.parts.ElementEditPart)
-	 */
-	public void createEditPolicies(ElementEditPart part) {
-        // do nothing; sub-classes should override to add edit policies a part
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#handleModelChange(org.w3c.dom.Element,
-	 *      org.eclipse.jst.pagedesigner.parts.ElementEditPart)
-	 */
-	public boolean handleModelChange(Element ele, ElementEditPart part,
-			boolean recursive) {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#fillContextMenu(org.eclipse.jface.action.IMenuManager,
-	 *      org.w3c.dom.Element)
-	 */
-	public void fillContextMenu(IMenuManager contextMenu, Element ele) {
-		// default do nothing, child class could override.
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#fillContainerContextMenu(org.eclipse.jface.action.IMenuManager,
-	 *      org.eclipse.jst.pagedesigner.parts.ElementEditPart,
-	 *      org.eclipse.jst.pagedesigner.parts.NodeEditPart,
-	 *      org.eclipse.jface.viewers.ISelection)
-	 */
-	public boolean fillContainerContextMenu(IMenuManager contextMenu,
-			ElementEditPart elePart, NodeEditPart nodePart,
-			ISelection innerSelection) {
-		return false;
-	}
-
-	/**
-	 * Child class should override this method if they have different way for
-	 * resizing. e.g. DataWindow use "width/height" attribute, not "style".
-	 * Also, the default ResizeCommand will adjust "style", so if child class
-	 * override this method, they should also use different command.
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editpolicies.ElementResizableEditPolicy#getResizeCommand(org.eclipse.gef.requests.ChangeBoundsRequest)
-	 */
-	public boolean isResizable(Element ele) {
-		CMElementDeclaration decl = CMUtil.getElementDeclaration(ele);
-		if (decl != null) {
-			// XXX: default implementation, if this element support "style"
-			// attribute,
-			// then we think it support resize.
-			return decl.getAttributes().getNamedItem("style") != null;
-		}
-		return true;
-	}
-
-    /** 
-     * By default, return null to signal caller should use its default strategy
-     */
-    public IDropLocationStrategy getDropRequestorLocationStrategy(TagIdentifier tag, EditPartViewer viewer) {
-        return null;
-    }
-
-    private final static IDropCustomizer   DEFAULT_DROP_CUSTOMIZER = 
-        new AbstractDropCustomizer(){/* do nothing; use defaults */};
-    
-    public IDropCustomizer getDropCustomizer(TagIdentifier tagId) 
-    {
-        return DEFAULT_DROP_CUSTOMIZER;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#getTagCreator(org.eclipse.jst.jsf.common.dom.TagIdentifier)
-     */
-    public ITagCreator getTagCreator(TagIdentifier tagId) 
-    {
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/AbstractElementEditFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/AbstractElementEditFactory.java
deleted file mode 100644
index b7e42a5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/AbstractElementEditFactory.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-
-/**
- * @author cbateman
- *
- */
-public abstract class AbstractElementEditFactory implements IElementEditFactory 
-{
-    private String _supportedUri;
-    
-    /**
-     * @param uri
-     */
-    protected AbstractElementEditFactory(final String uri)
-    {
-        _supportedUri = uri;
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory#createElementEdit(org.eclipse.jst.jsf.common.dom.TagIdentifier)
-     */
-    public abstract IElementEdit createElementEdit(TagIdentifier tag); 
-
-    public String getSupportedURI() 
-    {
-        return _supportedUri;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/ElementEditFacRegistryReader.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/ElementEditFacRegistryReader.java
deleted file mode 100644
index e0e1b7b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/ElementEditFacRegistryReader.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.pagedesigner.IJMTConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ElementEditFacRegistryReader {
-	private static List<IElementEditFactory> _handlers = null;
-
-	/**
-	 * @return all available handers for the ext-pt.  List is not
-	 * modifiable
-	 */
-	public static synchronized List<IElementEditFactory> getAllHandlers() {
-		if (_handlers == null) {
-			_handlers = readAllHandlers();
-		}
-		return Collections.unmodifiableList(_handlers);
-	}
-
-	private static List<IElementEditFactory> readAllHandlers() {
-		List result = new ArrayList();
-		IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
-				.getExtensionPoint(PDPlugin.getPluginId(),
-						IJMTConstants.EXTENSION_POINT_PAGEDESIGNER);
-		IExtension[] extensions = extensionPoint.getExtensions();
-
-		for (int i = 0; i < extensions.length; i++) {
-			IExtension ext = extensions[i];
-			IConfigurationElement[] dropHandlers = ext
-					.getConfigurationElements();
-
-			for (int j = 0; j < dropHandlers.length; j++) {
-				if (dropHandlers[j].getName().equals(
-						IJMTConstants.ELEMENT_EDIT_FACTORY)) {
-					dropHandlers[j].getAttribute("class");
-					Object obj;
-					try {
-						obj = dropHandlers[j]
-								.createExecutableExtension("class");
-
-						if (obj instanceof IElementEditFactory) {
-							result.add(obj);
-						}
-					} catch (CoreException e) {
-						// ignore the exception
-						e.printStackTrace();
-					}
-				}
-			}
-		}
-		return result;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/ElementEditFactoryRegistry.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/ElementEditFactoryRegistry.java
deleted file mode 100644
index 7ca7daf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/ElementEditFactoryRegistry.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.elementedit;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.pagedesigner.elementedit.html.HTMLElementEditFactory;
-import org.eclipse.jst.pagedesigner.elementedit.jsp.JSPElementEditFactory;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ElementEditFactoryRegistry {
-	List _factories = new ArrayList();
-
-	private static ElementEditFactoryRegistry _instance;
-
-	/**
-	 * 
-	 */
-	private ElementEditFactoryRegistry() {
-		addFactory(new HTMLElementEditFactory());
-        addFactory(new JSPElementEditFactory());
-
-		List<IElementEditFactory> facs = 
-		    ElementEditFacRegistryReader.getAllHandlers();
-
-		if (facs != null) 
-		{
-			for (IElementEditFactory fac : facs) 
-			{
-				addFactory(fac);
-			}
-		}
-	}
-
-	/**
-	 * Add a factory to list available.
-	 * 
-	 * @param fac
-	 */
-	public void addFactory(IElementEditFactory fac) {
-		_factories.add(fac);
-	}
-
-    /**
-     * @param tagIdentifier 
-     * @return an IElementEdit constructed for the tag uniquely identified
-     * by the ns uri (tag uri for JSP tags) and tagName (element name) or null
-     * if the system can't create one.
-     */
-    public IElementEdit createElementEdit(final TagIdentifier tagIdentifier)
-    {
-        final String uri = tagIdentifier.getUri();
-        
-        // first round, match uri
-        for (int i = 0, size = _factories.size(); i < size; i++) {
-            IElementEditFactory fac = (IElementEditFactory) _factories.get(i);
-            String facuri = fac.getSupportedURI();
-            if (facuri != null && facuri.equals(uri)) {
-                IElementEdit elementEdit = fac.createElementEdit(tagIdentifier);
-                if (elementEdit != null) {
-                    return elementEdit;
-                }
-            }
-        }
-        // second round
-        for (int i = 0, size = _factories.size(); i < size; i++) {
-            IElementEditFactory fac = (IElementEditFactory) _factories.get(i);
-            String facuri = fac.getSupportedURI();
-            if (facuri == null) {
-                IElementEdit elementEdit = fac.createElementEdit(tagIdentifier);
-                if (elementEdit != null) {
-                    return elementEdit;
-                }
-            }
-        }
-        return null;
-    }
-    
-	/**
-     * Convenience method for createElementEdit(uri, tagName) that takes
-     * a tag element.
-     * 
-	 * @param ele
-	 * @return an element edit
-	 */
-	public IElementEdit createElementEdit(Element ele) {
-		final TagIdentifier tagIdentifier = TagIdentifierFactory.createDocumentTagWrapper(ele);
-        return createElementEdit(tagIdentifier);
-	}
-
-	/**
-	 * @return the single instance of the factory registry
-	 */
-	public static ElementEditFactoryRegistry getInstance() {
-		if (_instance == null) {
-			_instance = new ElementEditFactoryRegistry();
-		}
-		return _instance;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/IElementEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/IElementEdit.java
deleted file mode 100644
index bdd91a3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/IElementEdit.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit;
-
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.pagedesigner.itemcreation.ITagCreator;
-import org.eclipse.jst.pagedesigner.itemcreation.customizer.IDropCustomizer;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.viewer.IDropLocationStrategy;
-import org.w3c.dom.Element;
-
-/**
- * IElementEdit support additional edit support to an element.
- * 
- * This interface should not be extended by clients.  Extend AbstractElementEdit
- * instead.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author mengbo
- * @version 1.5
- */
-public interface IElementEdit 
-{
-	/**
-	 * override default edit policies on part
-	 * @param part
-	 */
-	public void createEditPolicies(ElementEditPart part);
-
-	/**
-	 * The element (or its decendent) changed.
-	 * 
-	 * @param ele
-	 * @param part
-	 * @param recursive 
-	 * @return handle model changes on part.
-	 */
-	public boolean handleModelChange(Element ele, ElementEditPart part,
-			boolean recursive);
-
-	/**
-	 * Add special menu items for the particular element to the context menu.
-	 * 
-	 * @param contextMenu
-	 * @param ele 
-	 */
-	public void fillContextMenu(IMenuManager contextMenu, Element ele);
-
-	/**
-	 * This method is called when current selection is inside "ele". And this
-	 * method should fill in menu items relating to the "ele" context and the
-	 * current "innerSelection". For example, this "ele" could be a table,
-	 * "innerSelection" could be something inside a cell. Then could fill in
-	 * actions relating to the table and the cell, such as "add row before",
-	 * "delete current column", etc.
-	 * 
-	 * @param contextMenu
-	 * @param elePart
-	 *            the elementeditpart corresponding to this ElementEdit
-	 * @param nodePart
-	 *            the smallest part covers the current selection. nodePart will
-	 *            always be a decedent of the elePart.
-	 * @param innerSelection
-	 *            the selection
-	 * @return true if added actions.
-	 */
-	public boolean fillContainerContextMenu(IMenuManager contextMenu,
-			ElementEditPart elePart, NodeEditPart nodePart,
-			ISelection innerSelection);
-
-	/**
-	 * whether the corresponding element support resize. If it does, then the
-	 * corresponding policy installed through <code>createEditPolicies</code>
-	 * should handle resize.
-	 * @param ele 
-	 * 
-	 * @return true if ele has resize support
-	 */
-	public boolean isResizable(Element ele);
-    
-    /**
-     * @param tag the element to return a drop location strategy for.
-     * This is the requesting element (being dropped), not the drop target
-     * 
-     * @param viewer is the viewer where the new strategy will optionally
-     * add feedback
-     * 
-     * @return the strategy to be used to use to find a drop location when
-     * the corresponding element is being dropped (the source part).  May
-     * be null signalling that the caller should use its default strategy.
-     * 
-     */
-     public IDropLocationStrategy getDropRequestorLocationStrategy(TagIdentifier tag, EditPartViewer viewer);
-
-    /**
-     * @param tagId 
-     * @return the drop customizer for this edit's element.  May return null.
-     * Returning null and returning a IDropCustomizer whose runCustomizer always returns
-     * OK and getDropCustomizationData always returns null will be considered 
-     * equivalent by the framework.
-     */
-    public IDropCustomizer getDropCustomizer(TagIdentifier tagId);
-    
-    /**
-     * @param tagId
-     * @return a tag creator for the indicated tag or null to indicate that the
-     * system should use it's default tag creator
-     */
-    public ITagCreator getTagCreator(TagIdentifier tagId);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/IElementEditFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/IElementEditFactory.java
deleted file mode 100644
index 052275a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/IElementEditFactory.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-
-
-/**
- * @author mengbo
- * @version 1.5
- * 
- * Clients should not implement this interface.  Extend AbstractElementEditFactory instead.
- */
-public interface IElementEditFactory {
-	/**
-	 * 
-	 * @param tag
-	 * @return null if this factory don't support this element
-	 */
-	public IElementEdit createElementEdit(TagIdentifier tag);
-
-	/**
-	 * get the URI namespace that this factory support. "null" means this
-	 * factory can be used as default factory.
-	 * 
-	 * @return null if this factory don't have a specific URI to support.
-	 */
-	public String getSupportedURI();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/HTMLElementEditFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/HTMLElementEditFactory.java
deleted file mode 100644
index f4804c1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/HTMLElementEditFactory.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit.html;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEdit;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class HTMLElementEditFactory implements IElementEditFactory 
-{
-    final static TagIdentifier HTMLTABLE_TAG_IDENTIFIER =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_HTML, IHTMLConstants.TAG_TABLE);
-    
-    /*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory#createElementEdit(org.w3c.dom.Element)
-	 */
-	public IElementEdit createElementEdit(TagIdentifier tagIdentifier) {
-		if (HTMLTABLE_TAG_IDENTIFIER.isSameTagType(tagIdentifier)) {
-			return new TableElementEdit();
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory#getSupportedURI()
-	 */
-	public String getSupportedURI() {
-		return ITLDConstants.URI_HTML;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/TableElementEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/TableElementEdit.java
deleted file mode 100644
index 31b9127..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/html/TableElementEdit.java
+++ /dev/null
@@ -1,274 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit.html;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.actions.single.SelectEditPartAction;
-import org.eclipse.jst.pagedesigner.commands.html.TableDeleteColumnCommand;
-import org.eclipse.jst.pagedesigner.commands.html.TableDeleteHeaderFooterCommand;
-import org.eclipse.jst.pagedesigner.commands.html.TableDeleteRowCommand;
-import org.eclipse.jst.pagedesigner.commands.html.TableInsertColumnCommand;
-import org.eclipse.jst.pagedesigner.commands.html.TableInsertHeaderFooterCommand;
-import org.eclipse.jst.pagedesigner.commands.html.TableInsertRowCommand;
-import org.eclipse.jst.pagedesigner.commands.html.TableResizeColumnCommand;
-import org.eclipse.jst.pagedesigner.commands.html.TableResizeRowCommand;
-import org.eclipse.jst.pagedesigner.dom.html.TableChildElementPosition;
-import org.eclipse.jst.pagedesigner.dom.html.TableUtil;
-import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants;
-import org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.tableedit.DeleteHeaderFooterAction;
-import org.eclipse.jst.pagedesigner.tableedit.DeleteHeaderFooterRequest;
-import org.eclipse.jst.pagedesigner.tableedit.DeleteRowColumnAction;
-import org.eclipse.jst.pagedesigner.tableedit.InsertHeaderFooterAction;
-import org.eclipse.jst.pagedesigner.tableedit.InsertHeaderFooterRequest;
-import org.eclipse.jst.pagedesigner.tableedit.InsertRowColumnAction;
-import org.eclipse.jst.pagedesigner.tableedit.TableInsertRequest;
-import org.eclipse.jst.pagedesigner.tableedit.TableResizableEditPolicy;
-import org.eclipse.jst.pagedesigner.tableedit.TableResizeRequest;
-import org.eclipse.jst.pagedesigner.tableedit.TableRowColumnDeleteRequest;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableElementEdit extends AbstractElementEdit {
-	private final static Action action = new Action() {
-        // TODO: what's this for?
-	};
-
-	private 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) {
-		final IMenuManager tableMenu = new MenuManager(PDPlugin
-				.getResourceString("ElementEdit.Submenu.Table"));//$NON-NLS-1$
-		tableMenu.add(action);
-		final ElementEditPart tablePart = (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();
-				fillTableMenu(tablePart, FAKE_INDEX, FAKE_INDEX, tableMenu);
-			}
-		});
-
-		contextMenu.appendToGroup(PageDesignerActionConstants.GROUP_CONTAINER,
-				tableMenu);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit#fillContainerContextMenu(org.eclipse.jface.action.IMenuManager,
-	 *      org.eclipse.jst.pagedesigner.parts.ElementEditPart,
-	 *      org.eclipse.jst.pagedesigner.parts.NodeEditPart,
-	 *      org.eclipse.jface.viewers.ISelection)
-	 */
-	public boolean fillContainerContextMenu(IMenuManager contextMenu,
-			final ElementEditPart tablePart, NodeEditPart nodePart,
-			ISelection innerSelection) {
-		super.fillContainerContextMenu(contextMenu,
-				tablePart, nodePart, innerSelection);
-
-		Element table = (Element) tablePart.getModel();
-		Node node = (Node) nodePart.getModel();
-
-		TableChildElementPosition position = new TableUtil(table)
-				.getPosition(node);
-		final int cellRow = position.getRowIndex();
-		final int cellColumn = position.getColumnIndex();
-
-		final IMenuManager tableMenu = new MenuManager(PDPlugin
-				.getResourceString("ElementEdit.Submenu.Table"));//$NON-NLS-1$
-		tableMenu.add(action);
-		// ok, we passed the checking, now let's create the actions.
-		tableMenu.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager manager) {
-				tableMenu.removeAll();
-				fillTableMenu(tablePart, cellRow, cellColumn, tableMenu);
-			}
-		});
-
-		contextMenu.appendToGroup(PageDesignerActionConstants.GROUP_CONTAINER,
-				tableMenu);
-		return true;
-	}
-
-	/**
-	 * @param tablePart
-	 * @param cellRow
-	 * @param cellColumn
-	 * @param tableMenu
-	 */
-	private void fillTableMenu(ElementEditPart tablePart, int cellRow,
-			int cellColumn, IMenuManager tableMenu) {
-		SelectEditPartAction action1 = SelectEditPartAction.create(
-				PDPlugin.getResourceString("ElementEdit.Submenu.SelectTable"), tablePart);//$NON-NLS-1$
-		tableMenu.add(action1);
-
-		tableMenu.add(new Separator());
-
-		{
-			InsertRowColumnAction insertRowBeforeAction = new InsertRowColumnAction(
-					PDPlugin
-							.getResourceString("ElementEdit.Submenu.InsertRowBefore"),//$NON-NLS-1$
-					tablePart, cellRow, true, true);
-			tableMenu.add(insertRowBeforeAction);
-
-			InsertRowColumnAction insertRowAfterAction = new InsertRowColumnAction(
-					PDPlugin
-							.getResourceString("ElementEdit.Submenu.InsertRowAfter"),//$NON-NLS-1$
-					tablePart, cellRow, true, false);
-			tableMenu.add(insertRowAfterAction);
-
-			tableMenu.add(new Separator());
-		}
-
-		{
-			InsertRowColumnAction insertColumnBeforeAction = new InsertRowColumnAction(
-					PDPlugin
-							.getResourceString("ElementEdit.Submenu.InsertColumnBefore"),//$NON-NLS-1$
-					tablePart, cellColumn, false, true);
-			tableMenu.add(insertColumnBeforeAction);
-
-			InsertRowColumnAction insertColumnAfterAction = new InsertRowColumnAction(
-					PDPlugin
-							.getResourceString("ElementEdit.Submenu.InsertColumnAfter"),//$NON-NLS-1$
-					tablePart, cellColumn, false, false);
-			tableMenu.add(insertColumnAfterAction);
-
-			tableMenu.add(new Separator());
-		}
-
-		{
-			DeleteRowColumnAction deleteRowAction = new DeleteRowColumnAction(
-					PDPlugin.getResourceString("ElementEdit.Submenu.DeleteRow"),//$NON-NLS-1$
-					tablePart, cellRow, true);
-			tableMenu.add(deleteRowAction);
-
-			DeleteRowColumnAction deleteColumnAction = new DeleteRowColumnAction(
-					PDPlugin
-							.getResourceString("ElementEdit.Submenu.DeleteColumn"),//$NON-NLS-1$
-					tablePart, cellColumn, false);
-			tableMenu.add(deleteColumnAction);
-			tableMenu.add(new Separator());
-		}
-
-		{
-			InsertHeaderFooterAction headerAction = new InsertHeaderFooterAction(
-					PDPlugin
-							.getResourceString("ElementEdit.Submenu.InsertHeader"), tablePart, true);//$NON-NLS-1$
-			tableMenu.add(headerAction);
-			InsertHeaderFooterAction footerAction = new InsertHeaderFooterAction(
-					PDPlugin
-							.getResourceString("ElementEdit.Submenu.InsertFooter"), tablePart, false);//$NON-NLS-1$
-			tableMenu.add(footerAction);
-			DeleteHeaderFooterAction delHeaderAction = new DeleteHeaderFooterAction(
-					PDPlugin
-							.getResourceString("ElementEdit.Submenu.DeleteHeader"), tablePart, true);//$NON-NLS-1$
-			tableMenu.add(delHeaderAction);
-			DeleteHeaderFooterAction delFooterAction = new DeleteHeaderFooterAction(
-					PDPlugin
-							.getResourceString("ElementEdit.Submenu.DeleteFooter"), tablePart, false);//$NON-NLS-1$
-			tableMenu.add(delFooterAction);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#createEditPolicies(org.eclipse.jst.pagedesigner.parts.ElementEditPart)
-	 */
-	public void createEditPolicies(ElementEditPart part) {
-		part.installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE,
-				new TableResizePolicy(part));
-	}
-
-	static class TableResizePolicy extends TableResizableEditPolicy {
-		ElementEditPart _part;
-
-		/**
-		 * @param part
-		 */
-		public TableResizePolicy(ElementEditPart part) {
-			_part = part;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.gef.editpolicies.ResizableEditPolicy#getCommand(org.eclipse.gef.Request)
-		 */
-		public Command getCommand(Request request) {
-			IHTMLGraphicalViewer viewer = (IHTMLGraphicalViewer) _part
-					.getViewer();
-			Element table = (Element) _part.getIDOMNode();
-			if (request instanceof TableResizeRequest) {
-				TableResizeRequest trq = (TableResizeRequest) request;
-				if (trq.isRow()) {
-					return new TableResizeRowCommand(viewer, table, trq
-							.getIndex(), trq.getDelta());
-				}
-                return new TableResizeColumnCommand(viewer, table, trq
-                		.getIndex(), trq.getDelta());
-			} else if (request instanceof TableInsertRequest) {
-				TableInsertRequest tableInsertRequest = (TableInsertRequest) request;
-				int index = tableInsertRequest.getIndex()
-						+ (tableInsertRequest.isBefore() ? 0 : 1);
-				if (tableInsertRequest.isRow()) {
-					return new TableInsertRowCommand(viewer, table, index,
-							tableInsertRequest.isBefore());
-				}
-                return new TableInsertColumnCommand(viewer, table, index);
-			} else if (request instanceof TableRowColumnDeleteRequest) {
-				TableRowColumnDeleteRequest deleteReq = (TableRowColumnDeleteRequest) request;
-				if (deleteReq.isRow()) {
-					return new TableDeleteRowCommand(viewer, table, deleteReq
-							.getIndex());
-				}
-                return new TableDeleteColumnCommand(viewer, table,
-                		deleteReq.getIndex());
-			} else if (request instanceof InsertHeaderFooterRequest) {
-				InsertHeaderFooterRequest hfRequest = (InsertHeaderFooterRequest) request;
-				return new TableInsertHeaderFooterCommand(viewer, table,
-						hfRequest.isHeader());
-			} else if (request instanceof DeleteHeaderFooterRequest) {
-				DeleteHeaderFooterRequest hfRequest = (DeleteHeaderFooterRequest) request;
-				return new TableDeleteHeaderFooterCommand(viewer, table,
-						hfRequest.isHeader());
-			}
-			return super.getCommand(request);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/jsp/JSPElementEditFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/jsp/JSPElementEditFactory.java
deleted file mode 100644
index 9dc4f9e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/jsp/JSPElementEditFactory.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit.jsp;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEdit;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory;
-import org.eclipse.jst.pagedesigner.jsp.core.IJSPCoreConstants;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class JSPElementEditFactory implements IElementEditFactory 
-{
-    final static TagIdentifier TAG_DIRECTIVE_TAGLIB_TAG_IDENTIFIER =
-        TagIdentifierFactory.createJSPTagWrapper(ITLDConstants.URI_JSP, IJSPCoreConstants.TAG_DIRECTIVE_TAGLIB);
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory#createElementEdit(org.w3c.dom.Element)
-	 */
-	public IElementEdit createElementEdit(TagIdentifier tagIdentifier) {
-		if (TAG_DIRECTIVE_TAGLIB_TAG_IDENTIFIER.isSameTagType(tagIdentifier)) {
-			return new TaglibElementEdit();
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEditFactory#getSupportedURI()
-	 */
-	public String getSupportedURI() {
-		return ITLDConstants.URI_JSP;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/jsp/TaglibElementEdit.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/jsp/TaglibElementEdit.java
deleted file mode 100644
index 9c82880..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/jsp/TaglibElementEdit.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit.jsp;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.editors.PageDesignerActionConstants;
-import org.eclipse.jst.pagedesigner.elementedit.AbstractElementEdit;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TaglibElementEdit extends AbstractElementEdit {
-	private TaglibURIAction action;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.elementedit.IElementEdit#fillContextMenu(org.eclipse.jface.action.IMenuManager,
-	 *      org.w3c.dom.Element)
-	 */
-	public void fillContextMenu(IMenuManager contextMenu, Element ele) {
-		super.fillContextMenu(contextMenu, ele);
-
-		TaglibURIAction action1 = getAction();
-
-		action1.setURI(ele.getAttribute(ICSSPropertyID.ATTR_URI));
-
-		action1.setElement(ele);
-
-        contextMenu.appendToGroup(PageDesignerActionConstants.GROUP_SPECIAL,
-				action1);
-	}
-
-	private TaglibURIAction getAction() {
-		if (action == null) {
-			action = new TaglibURIAction();
-		}
-		return action;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/jsp/TaglibURIAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/jsp/TaglibURIAction.java
deleted file mode 100644
index eefc1b3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/jsp/TaglibURIAction.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.elementedit.jsp;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.wst.sse.core.internal.util.URIResolver;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TaglibURIAction extends Action {
-	private String URI;
-
-	private Element element;
-
-	/**
-	 * Default constructor
-	 */
-	public TaglibURIAction() {
-		setText(PDPlugin.getResourceString("ElementEdit.Submenu.Taglib"));//$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#isEnabled()
-	 */
-	public boolean isEnabled() {
-		if (element == null || URI == null || "".equals(URI))//$NON-NLS-1$
-		{
-			return false;
-		}
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.IAction#run()
-	 */
-	public void run() {
-		String fileName = getResolvedURL(getElement(), URI);
-
-		if (fileName != null && fileName.length() > 0) {
-			IPath includedPath = new Path(fileName);
-			includedPath.makeAbsolute();
-
-			IFile file = getFile(includedPath);
-			if (file != null && file.exists()) {
-				try {
-					IDE.openEditor(getPage(), file);
-					return;
-				} catch (PartInitException e) {
-					PDPlugin.getAlerts().warning(
-							"Message.Warning.Title", e.getLocalizedMessage());//$NON-NLS-1$
-				}
-			}
-		}
-		PDPlugin.getAlerts().warning(
-				"Message.Warning.Title", "Taglib.OpenFile.ERROR");//$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	private IWorkbenchPage getPage() {
-		IWorkbench workbench = PlatformUI.getWorkbench();
-		IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
-		return window.getActivePage();
-	}
-
-	/**
-	 * @param uri
-	 */
-	public void setURI(String uri) {
-		this.URI = uri;
-	}
-
-	private IFile getFile(IPath includedPath) {
-		IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
-		IProject[] projects = workspaceRoot.getProjects();
-
-		for (int i = 0, length = projects.length; i < length; i++) {
-			IPath path = projects[i].getLocation();
-			path = path.makeAbsolute();
-			if (path != null && path.isPrefixOf(includedPath)) {
-				// -1 so we still have the project path
-				includedPath = includedPath.removeFirstSegments(path
-						.segmentCount() - 1);
-				return ResourcesPlugin.getWorkspace().getRoot().getFile(
-						includedPath);
-			}
-		}
-		return null;
-	}
-
-	private String getResolvedURL(Element element_, String attrName) {
-		URIResolver resolver = null;
-		if (element_ instanceof IDOMNode) {
-			resolver = ((IDOMNode) element_).getModel().getResolver();
-		}
-		if (null == resolver) {
-			return null;
-		}
-		String src = URI;
-		if (src != null && src.length() > 0) {
-			return resolver.getLocationByURI(src);
-		}
-		return null;
-	}
-
-	/**
-	 * @return Returns the element.
-	 */
-	public Element getElement() {
-		return element;
-	}
-
-	/**
-	 * @param element
-	 *            The element to set.
-	 */
-	public void setElement(Element element) {
-		this.element = element;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/extensionpoint/IContextMenuItemContributor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/extensionpoint/IContextMenuItemContributor.java
deleted file mode 100644
index 83bd334..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/extensionpoint/IContextMenuItemContributor.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.extensionpoint;
-
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-
-/**
- * @author mengbo
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-
-public interface IContextMenuItemContributor {
-	/**
-	 * @param uri
-	 */
-	void setURI(String uri);
-
-	/**
-	 * @return the uri
-	 */
-	String getURI();
-
-	/**
-	 * @param manager
-	 * @param selection
-	 * @param model
-	 * @param parentUI
-	 */
-	void fillContextMenu(IMenuManager manager, ISelection selection,
-			IStructuredModel model, Control parentUI);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/extensionpoint/package-info.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/extensionpoint/package-info.java
deleted file mode 100644
index 547f3b3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/extensionpoint/package-info.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-/**
- * Web Page Editor Extension Point Interfaces. 
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-package org.eclipse.jst.pagedesigner.extensionpoint;
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/AbstractFigureHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/AbstractFigureHandler.java
deleted file mode 100644
index 06090c3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/AbstractFigureHandler.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.figurehandler;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.style.DefaultStyle;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public abstract class AbstractFigureHandler implements IFigureHandler {
-	private CSSFigure _figure;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#isAdapterForType(java.lang.Object)
-	 */
-	public boolean isAdapterForType(Object type) {
-		return (type == IFigureHandler.class);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#notifyChanged(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier,
-	 *      int, java.lang.Object, java.lang.Object, java.lang.Object, int)
-	 */
-	public void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-        // TODO: anything?
-	}
-
-	/**
-	 * @param node
-	 * @return the css style on the node
-	 */
-	protected ICSSStyle getCSSStyle(Element node) {
-		ICSSStyle style = null;
-		if (node instanceof IDOMElement) {
-			style = (ICSSStyle) ((IDOMElement) node)
-					.getAdapterFor(ICSSStyle.class);
-		}
-		if (style == null) {
-			style = DefaultStyle.getInstance();
-		} 
-        
-        return style;
-	}
-
-	/**
-	 * @param oldFigure
-	 */
-	protected void setCurrentFigure(CSSFigure oldFigure) {
-		this._figure = oldFigure;
-	}
-
-	public CSSFigure getFigure() {
-		return this._figure;
-	}
-
-	/**
-	 * child class could override this method
-	 */
-	public void dispose() {
-        // TODO: anything to dispose?
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/BRFigureHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/BRFigureHandler.java
deleted file mode 100644
index ff32c72..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/BRFigureHandler.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.figurehandler;
-
-import org.eclipse.jst.pagedesigner.css2.layout.CSSBrFlowLayout;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSLayout;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class BRFigureHandler extends AbstractFigureHandler {
-	/**
-	 * @param figure
-	 * @return the CSS layout for fixed layout
-	 */
-	protected CSSLayout getFixedCSSLayout(CSSFigure figure) {
-		return new CSSBrFlowLayout(figure);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.figurehandler.IFigureHandler#isWidget()
-	 */
-	public boolean isWidget() {
-		return false;
-	}
-
-	public void updateFigure(Element node, CSSFigure oldFigure) {
-		oldFigure.setCSSStyle(getCSSStyle(node));
-		oldFigure.setFixedLayoutManager(getFixedCSSLayout(oldFigure));
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/DefaultFigureHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/DefaultFigureHandler.java
deleted file mode 100644
index 82cc075..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/DefaultFigureHandler.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.figurehandler;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DefaultFigureHandler extends AbstractFigureHandler {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.figurehandler.IFigureHandler#updateFigure(org.w3c.dom.Element,
-	 *      org.eclipse.jst.pagedesigner.css2.layout.CSSFigure)
-	 */
-	public void updateFigure(Element node, CSSFigure oldFigure) {
-		setCurrentFigure(oldFigure);
-		ICSSStyle style = getCSSStyle(node);
-		oldFigure.setCSSStyle(style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.figurehandler.IFigureHandler#isWidget()
-	 */
-	public boolean isWidget() {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/FigureFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/FigureFactory.java
deleted file mode 100644
index c0070ef..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/FigureFactory.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.figurehandler;
-
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.utils.JSFSharedImages;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory2;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSTextFigure;
-import org.eclipse.jst.pagedesigner.css2.provider.ICSSTextProvider;
-import org.eclipse.jst.pagedesigner.editors.palette.TagImageManager;
-import org.eclipse.jst.pagedesigner.utils.HTMLUtil;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public final class FigureFactory 
-{
-	/**
-	 * @param figure
-	 * @param node
-	 */
-	private static void createFigureDeep(IFigure parentFigure, final Node node) {
-		if (node instanceof Element) {
-			IFigureHandler handler = createAndAdapt((Element) node);
-			if (handler instanceof HiddenFigureHandler) {
-				// for deep hidden element, we don't create figure for them.
-				// this will remove the small <> icon for data window.
-				return;
-			}
-			CSSFigure figure = new CSSFigure();
-			handler.updateFigure((Element) node, figure);
-			// IFigure figure = handler.createFigure((Element) node);
-			parentFigure.add(figure);
-			if (!handler.isWidget()) {
-				NodeList children = node.getChildNodes();
-
-				for (int i = 0, size = children.getLength(); i < size; i++) {
-					createFigureDeep(figure, children.item(i));
-				}
-			}
-		} else if (node instanceof Text) {
-			final String data = HTMLUtil.compactWhitespaces((Text) node, node
-					.getNodeValue());
-			// XXX: seemed there is some bug in handling whitespace (unnecessary
-			// take additional space)
-			// so skip it here.
-			if (data.trim().length() == 0) {
-				return;
-			}
-			// XXX: currently creating of CSSTextFigure is distributed both here
-			// and TextEditPart. We may want to unify them later.
-			CSSTextFigure figure = new CSSTextFigure(new ICSSTextProvider() {
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSTextProvider#getCSSStyle()
-				 */
-                //  TODO: dead?
-//				public ICSSStyle getCSSStyle() {
-//					INodeNotifier notifier = (INodeNotifier) node
-//							.getParentNode();
-//					return (ICSSStyle) notifier.getAdapterFor(ICSSStyle.class);
-//				}
-
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSTextProvider#getTextData()
-				 */
-				public String getTextData() {
-					return data;
-				}
-
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSTextProvider#getSelectedRange()
-				 */
-				public int[] getSelectedRange() {
-					// text figure created here will not be real text in
-					// original doc.
-					// so don't support their selection.
-					return null;
-				}
-			});
-			parentFigure.add(figure);
-		}
-	}
-
-	/**
-	 * @param ele
-	 * @param old
-	 * @param figure
-	 * @return the figure
-	 */
-	public static IFigure updateDeepFigure(Element ele, Element old,
-			CSSFigure figure) {
-		recursiveDisposeAndUnadapt(old);
-		List figureChildren = figure.getChildren();
-		for (int i = figureChildren.size() - 1; i >= 0; i--) {
-			figure.remove((IFigure) figureChildren.get(i));
-		}
-
-		IFigureHandler handler = createAndAdapt(ele);
-		handler.updateFigure(ele, figure);
-		if (!handler.isWidget()) {
-			NodeList children = ele.getChildNodes();
-			for (int i = 0, size = children.getLength(); i < size; i++) {
-				createFigureDeep(figure, children.item(i));
-			}
-		}
-		return figure;
-	}
-
-
-	private static void recursiveDisposeAndUnadapt(Element ele) {
-		disposeAndUnadapt(ele);
-		NodeList nl = ele.getChildNodes();
-		for (int i = 0, size = nl.getLength(); i < size; i++) {
-			Node n = nl.item(i);
-			if (n instanceof Element) {
-				recursiveDisposeAndUnadapt((Element) n);
-			}
-		}
-	}
-
-	private static void disposeAndUnadapt(Element ele) {
-		IFigureHandler handler = getHandler(ele);
-		if (handler != null) {
-			handler.dispose();
-			((IDOMElement) ele).removeAdapter(handler);
-		}
-	}
-
-	private static IFigureHandler getHandler(Element ele) {
-		if (ele instanceof IDOMElement) {
-			IDOMElement xmlele = (IDOMElement) ele;
-			return (IFigureHandler) xmlele.getAdapterFor(IFigureHandler.class);
-		}
-		return null;
-	}
-
-	private static IFigureHandler createAndAdapt(Element ele) {
-		IFigureHandler handler = createFigureHandler(ele);
-		if (ele instanceof IDOMElement) {
-			((IDOMElement) ele).addAdapter(handler);
-		}
-		return handler;
-	}
-
-	private static IFigureHandler createFigureHandler(Element ele) {
-		String tag = ele.getTagName();
-		if ("input".equalsIgnoreCase(tag)) {
-			return new InputFigureHandler();
-		} else if ("select".equalsIgnoreCase(tag)) {
-			return new SelectFigureHandler();
-		} else if ("img".equalsIgnoreCase(tag)) {
-			return new ImgFigureHandler();
-		} else if ("object".equalsIgnoreCase(tag)) {
-			return new ObjectFigureHandler();
-		} else if ("textarea".equalsIgnoreCase(tag)) {
-			return new TextareaFigureHandler();
-		} else if ("br".equalsIgnoreCase(tag)) {
-			return new BRFigureHandler();
-		} else if (!HTMLUtil.isVisualHtmlElement(tag)) {
-			return new HiddenFigureHandler(getSharedHTMLImage(ele));
-		} else {
-			return new DefaultFigureHandler();
-		}
-	}
-
-	/**
-	 * @param tag
-	 * @return
-	 */
-	private static Image getSharedHTMLImage(Element element) {
-		Image image = null;
-		
-        IStructuredDocumentContext context = IStructuredDocumentContextFactory2.INSTANCE.getContext(element);
-        if (context != null){   
-        	IWorkspaceContextResolver wsResolver  = IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(context);
-        	if (wsResolver != null){
-        		image = TagImageManager.getInstance().getSmallIconImage(wsResolver.getProject(),"HTML", element.getLocalName());
-        	}
-        }
-		return image != null ? image : JSFUICommonPlugin.getDefault().getImage(
-			JSFSharedImages.DEFAULT_PALETTE_TAG_IMG);	
-	}
-	
-	private FigureFactory()
-	{
-	    // no external instantiation
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/HiddenFigureHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/HiddenFigureHandler.java
deleted file mode 100644
index 4a253cd..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/HiddenFigureHandler.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.figurehandler;
-
-import org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider;
-import org.eclipse.jst.pagedesigner.css2.style.DefaultStyle;
-import org.eclipse.jst.pagedesigner.css2.widget.ImageWidgetProvider;
-import org.eclipse.swt.graphics.Image;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class HiddenFigureHandler extends WidgetFigureHandler {
-	private Image _image;
-
-	/**
-	 * @param image
-	 */
-	public HiddenFigureHandler(Image image) {
-		_image = image;
-	}
-
-	protected ICSSWidgetProvider initializeWidgetProvider(Element ele) {
-		return new ImageWidgetProvider(getImage(), DefaultStyle.getInstance());
-	}
-
-	/**
-	 * @return
-	 */
-	private Image getImage() {
-		return _image;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/IFigureHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/IFigureHandler.java
deleted file mode 100644
index 99cfe3a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/IFigureHandler.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.figurehandler;
-
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.w3c.dom.Element;
-
-/**
- * IFigureHandler is similiar to EditPart in some sence. Each IFigureHandler is
- * adapted to an HTML element node, and provide a figure for it.
- * 
- * @author mengbo
- * @version 1.5
- */
-public interface IFigureHandler extends INodeAdapter {
-	/**
-	 * @param node
-	 * @param oldFigure
-	 */
-	public void updateFigure(Element node, CSSFigure oldFigure);
-
-	/**
-	 * 
-	 */
-	public void dispose();
-
-	/**
-	 * @return true if the node is deemed a widget
-	 */
-	public boolean isWidget();
-
-	/**
-	 * @return the figure
-	 */
-	public CSSFigure getFigure();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/ImgFigureHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/ImgFigureHandler.java
deleted file mode 100644
index b47e945..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/ImgFigureHandler.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.figurehandler;
-
-import org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider;
-import org.eclipse.jst.pagedesigner.css2.widget.ImageWidgetProvider;
-import org.eclipse.jst.pagedesigner.utils.ImageResolver;
-import org.eclipse.swt.graphics.Image;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-/*package*/ class ImgFigureHandler extends WidgetFigureHandler {
-	/**
-	 * the image provided for a widget
-	 */
-	protected Image _image;
-
-	/**
-	 * child class can override this method.
-	 * 
-	 * @param node
-	 */
-	protected void initializeImage(Element node) {
-		if (_image != null) {
-			_image.dispose();
-		}
-		_image = ImageResolver.initializeImage(node, "src");
-	}
-
-	public void dispose() {
-		if (_image != null) {
-			_image.dispose();
-			_image = null;
-		}
-	}
-
-	protected ICSSWidgetProvider initializeWidgetProvider(Element ele) {
-		initializeImage(ele);
-		ImageWidgetProvider provider = new ImageWidgetProvider(_image,
-				getCSSStyle(ele));
-		return provider;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/InputFigureHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/InputFigureHandler.java
deleted file mode 100644
index bc767b7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/InputFigureHandler.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.figurehandler;
-
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.utils.JSFSharedImages;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider;
-import org.eclipse.jst.pagedesigner.css2.widget.ButtonWidgetProvider;
-import org.eclipse.jst.pagedesigner.css2.widget.CheckboxWidgetProvider;
-import org.eclipse.jst.pagedesigner.css2.widget.HiddenProvider;
-import org.eclipse.jst.pagedesigner.css2.widget.ImageWidgetProvider;
-import org.eclipse.jst.pagedesigner.css2.widget.InputFileWidgetProvider;
-import org.eclipse.jst.pagedesigner.css2.widget.RadioWidgetProvider;
-import org.eclipse.jst.pagedesigner.css2.widget.TextInputWidgetProvider;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.eclipse.jst.pagedesigner.utils.ImageResolver;
-import org.eclipse.swt.graphics.Image;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-/*package*/ class InputFigureHandler extends WidgetFigureHandler {
-	private Image _image;
-
-	void initializeImage(Element node) {
-		if (_image != null) {
-			_image.dispose();
-		}
-		_image = ImageResolver.initializeImage(node, "src");
-	}
-
-	ImageWidgetProvider getImageProvider(Element node) {
-		initializeImage(node);
-		ImageWidgetProvider provider = new ImageWidgetProvider(_image,
-				getCSSStyle(node));
-		return provider;
-	}
-
-	ICSSWidgetProvider getButtonProvider(Element node) {
-		ButtonWidgetProvider provider = new ButtonWidgetProvider(
-				getCSSStyle(node));
-		provider.setValue(getButtonValue(node));
-		return provider;
-	}
-
-	ICSSWidgetProvider getFileProvider(Element node) {
-		// ICSSWidgetProvider textprovider = getTextInputProvider();
-		// // XXX: should we use the defaultstyle for the button?
-		// ButtonWidgetProvider browsebutton = new
-		// ButtonWidgetProvider(getCSSStyle());
-		// browsebutton.setValue("Browse...");
-		// CompositeWidgetProvider provider = new
-		// CompositeWidgetProvider(getCSSStyle(), textprovider, browsebutton,
-		// false);
-		// return provider;
-		ICSSWidgetProvider textprovider = getTextInputProvider(node);
-		// XXX: should we use the defaultstyle for the button?
-		ButtonWidgetProvider browsebutton = new ButtonWidgetProvider(
-				getCSSStyle(node));
-		browsebutton.setValue("Browse...");
-		InputFileWidgetProvider provider = new InputFileWidgetProvider(
-				getCSSStyle(node), textprovider, browsebutton);
-		return provider;
-	}
-
-	/**
-	 * should not return null
-	 * 
-	 * @return the image
-	 */
-	protected Image getHiddenImage() {
-		return JSFUICommonPlugin.getDefault().getImage(
-				JSFSharedImages.DEFAULT_PALETTE_TAG_IMG);
-	}
-
-	ICSSWidgetProvider getHiddenProvider(Element node) {
-		return new HiddenProvider(getHiddenImage(), node);
-	}
-
-	ICSSWidgetProvider getPasswordProvider(Element node) {
-		TextInputWidgetProvider provider = new TextInputWidgetProvider(
-				getCSSStyle(node), TextInputWidgetProvider.PWD_SIZE);
-		provider.setSize(getSize(node));
-		provider.setValue("********");
-		return provider;
-	}
-
-	ICSSWidgetProvider getTextInputProvider(Element node) {
-		TextInputWidgetProvider provider = new TextInputWidgetProvider(
-				getCSSStyle(node));
-		provider.setSize(getSize(node));
-		provider.setValue(getValue(node));
-		return provider;
-	}
-
-	private int getSize(Element node) {
-		String s = DOMUtil.getAttributeIgnoreCase(node, "size");
-		try {
-			if (s != null) {
-				return Integer.parseInt(s);
-			}
-		} catch (NumberFormatException  ex) {
-            // suppress and fall-through; return 0
-		}
-        return 0;
-	}
-
-	/**
-	 * @return
-	 */
-	private String getValue(Element node) {
-		return DOMUtil.getAttributeIgnoreCase(node, "value");
-	}
-
-	private String getButtonValue(Element node) {
-		String value = getValue(node);
-		if (value == null) {
-			String type = DOMUtil.getAttributeIgnoreCase(node,
-					ICSSPropertyID.ATTR_TYPE);
-			if (type.equalsIgnoreCase(ICSSPropertyID.VAL_SUBMIT)) {
-				return "Submit Query";
-			} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_RESET)) {
-				return "Reset";
-			}
-		}
-		return value;
-	}
-
-	/**
-	 * @return the widget provider
-	 */
-	protected ICSSWidgetProvider initializeWidgetProvider(Element node) {
-		reset();
-
-		String type = DOMUtil.getAttributeIgnoreCase(node,
-				ICSSPropertyID.ATTR_TYPE);
-
-		if (type == null) {
-			return getTextInputProvider(node);
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_SUBMIT)
-				|| type.equalsIgnoreCase(ICSSPropertyID.VAL_RESET)
-				|| type.equalsIgnoreCase(ICSSPropertyID.VAL_BUTTON)) {
-			return getButtonProvider(node);
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_IMAGE)) {
-			return getImageProvider(node);
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_FILE)) {
-			return getFileProvider(node);
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_RADIO)) {
-			RadioWidgetProvider provider = new RadioWidgetProvider(
-					getCSSStyle(node));
-			provider.setChecked(node.hasAttribute("checked"));
-			return provider;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_CHECKBOX)) {
-			CheckboxWidgetProvider provider = new CheckboxWidgetProvider(
-					getCSSStyle(node));
-			provider.setChecked(node.hasAttribute("checked"));
-			return provider;
-		} else if (type.equalsIgnoreCase(ICSSPropertyID.VAL_HIDDEN)) {
-			return getHiddenProvider(node);
-		}
-		if (type.equalsIgnoreCase(ICSSPropertyID.VAL_PASSWORD)) {
-			return getPasswordProvider(node);
-		}
-        return getTextInputProvider(node);
-	}
-
-	/**
-	 * 
-	 */
-	private void reset() {
-		if (_image != null) {
-			_image.dispose();
-			_image = null;
-		}
-	}
-
-	public void dispose() {
-		reset();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/ObjectFigureHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/ObjectFigureHandler.java
deleted file mode 100644
index 0b136d5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/ObjectFigureHandler.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.figurehandler;
-
-import org.eclipse.jst.pagedesigner.editors.palette.TagImageManager;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class ObjectFigureHandler extends ImgFigureHandler {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.figurehandler.ImgFigureHandler#initializeImage()
-	 */
-	protected void initializeImage(Element node) {
-		if (_image == null) {
-			_image = TagImageManager.getInstance().getSmallIconImage(null, "HTML", node.getTagName());
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/SelectFigureHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/SelectFigureHandler.java
deleted file mode 100644
index 6876b54..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/SelectFigureHandler.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.figurehandler;
-
-import java.util.List;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider;
-import org.eclipse.jst.pagedesigner.css2.widget.ComboWidgetProvider;
-import org.eclipse.jst.pagedesigner.css2.widget.ListWidgetProvider;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-/*package*/ class SelectFigureHandler extends WidgetFigureHandler {
-
-	/**
-	 * @param node
-	 * @return the labels
-	 */
-	public String[] getOptionLabels(Element node) {
-		List options = DOMUtil.getChildElementsByTagIgnoreCase(node,
-				IHTMLConstants.TAG_OPTION);
-		String[] ret = new String[options.size()];
-		for (int i = 0; i < ret.length; i++) {
-			Element option = (Element) options.get(i);
-			ret[i] = DOMUtil.getTextElementValue(option);
-		}
-		return ret;
-	}
-
-	/**
-	 * @param node
-	 * @return the label
-	 */
-	public String getSelectedLabels(Element node) {
-		List options = DOMUtil.getChildElementsByTagIgnoreCase(node,
-				IHTMLConstants.TAG_OPTION);
-		String result = null;
-		for (int i = 0, n = options.size(); i < n; i++) {
-			Element option = (Element) options.get(i);
-			if (option.hasAttribute(IHTMLConstants.ATTR_SELECTED)) {
-				result = DOMUtil.getTextElementValue(option);
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @param node
-	 * @return true if is multiple
-	 */
-	private boolean isMultiple(Element node) {
-		return DOMUtil
-				.getAttributeIgnoreCase(node, ICSSPropertyID.VAL_MULTIPLE) != null;
-	}
-
-	/**
-	 * @return the provider
-	 */
-	protected final ICSSWidgetProvider initializeWidgetProvider(Element node) {
-		String[] labels = getOptionLabels(node);
-		String rows = DOMUtil.getAttributeIgnoreCase(node,
-				IHTMLConstants.ATTR_SIZE);
-		int rowsInt = 0;
-		try {
-			if (rows != null) {
-				rowsInt = Integer.parseInt(rows);
-			}
-		} catch (Exception ex) {
-			// ignore
-		}
-		if (isMultiple(node) || rowsInt > 1) {
-			ListWidgetProvider provider = new ListWidgetProvider(
-					getCSSStyle(node));
-			provider.setOptions(labels);
-			provider.setRows(rowsInt);
-			return provider;
-		}
-        ComboWidgetProvider provider = new ComboWidgetProvider(
-        		getCSSStyle(node));
-        provider.setOptions(labels);
-        provider.setSelectedLabel(getSelectedLabels(node));
-        return provider;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/TextareaFigureHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/TextareaFigureHandler.java
deleted file mode 100644
index 2b42a4f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/TextareaFigureHandler.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.figurehandler;
-
-import org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider;
-import org.eclipse.jst.pagedesigner.css2.widget.TextAreaWidgetProvider;
-import org.eclipse.jst.pagedesigner.utils.DOMUtil;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-/*package*/ class TextareaFigureHandler extends WidgetFigureHandler {
-	protected ICSSWidgetProvider initializeWidgetProvider(Element node) {
-		TextAreaWidgetProvider provider = new TextAreaWidgetProvider(
-				getCSSStyle(node));
-		String s = DOMUtil.getAttributeIgnoreCase(node, "cols");
-		if (s != null) {
-			try {
-				provider.setColumns(Integer.parseInt(s));
-			} catch (Exception ex) {
-				// ignore
-			}
-		}
-		s = DOMUtil.getAttributeIgnoreCase(node, "rows");
-		if (s != null) {
-			try {
-				provider.setRows(Integer.parseInt(s));
-			} catch (Exception ex) {
-				// ignore
-			}
-		}
-		s = DOMUtil.getTextElementValue(node);
-		if (s != null) {
-			provider.setValue(s);
-		}
-		return provider;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/WidgetFigureHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/WidgetFigureHandler.java
deleted file mode 100644
index d2a3421..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/figurehandler/WidgetFigureHandler.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.figurehandler;
-
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSWidgetLayout;
-import org.eclipse.jst.pagedesigner.css2.provider.ICSSWidgetProvider;
-import org.w3c.dom.Element;
-
-/**
- * A widget figure handler
- *
- */
-abstract class WidgetFigureHandler extends AbstractFigureHandler {
-
-	/**
-	 * default constructor
-	 */
-	public WidgetFigureHandler() {
-		super();
-	}
-
-	public void updateFigure(Element node, CSSFigure oldFigure) {
-		setCurrentFigure(oldFigure);
-		ICSSWidgetProvider provider = initializeWidgetProvider(node);
-		oldFigure.setCSSStyle(provider.getCSSStyle());
-		oldFigure
-				.setFixedLayoutManager(new CSSWidgetLayout(oldFigure, provider));
-	}
-
-	/**
-	 * @param ele
-	 * @return the widget provider
-	 */
-	protected abstract ICSSWidgetProvider initializeWidgetProvider(Element ele);
-
-	public boolean isWidget() {
-		return true;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/AbstractTagCreationAdvisor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/AbstractTagCreationAdvisor.java
deleted file mode 100644
index 1ccd833..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/AbstractTagCreationAdvisor.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation;
-
-import java.util.Collection;
-
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.itemcreation.command.ContainerCreationCommand;
-import org.eclipse.jst.pagedesigner.itemcreation.command.ElementCustomizationCommand;
-import org.eclipse.jst.pagedesigner.utils.BodyHelper;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Element;
-
-/**
- * Clients should sub-class in order to create a new ITagCreationAdvisor type,
- * however, it is preferable to extend DefaultTagCreationAdvisor where possible.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractTagCreationAdvisor implements ITagCreationAdvisor 
-{
-    /**
-     * Information passed by the framework about the tag to be created
-     * {@link CreationData}
-     */
-    protected final CreationData  _creationData;
-
-    /**
-     * @param creationData
-     */
-    public AbstractTagCreationAdvisor(CreationData  creationData)
-    {
-        this._creationData = creationData;
-    }
-
-    /**
-     * @param model
-     * @param tagElement
-     */
-    public final void applyCustomization(IDOMModel model, Element tagElement)
-    {
-        ElementCustomizationCommand command = 
-            getElementCustomizationCommand(model, tagElement);
-        
-        if (command != null && command.canExecute())
-        {
-            command.execute();
-        }
-    }
-
-    /**
-     * @param model
-     * @param tagElement
-     * @return the customization command
-     */
-    protected abstract ElementCustomizationCommand getElementCustomizationCommand(IDOMModel model, Element tagElement);
-
-    /**
-     * Return position for tag after all necessary containers are created.  
-     * If necessary containers cannot be created and do not exist for any reason,
-     * implementer should return null
-     * to signal that the tag creation should not occur.
-     * 
-     * Clients may override this method to provide custom container positioning
-     * 
-     * @param model
-     * @param domPosition
-     * @return position after necessary containers are created
-     */
-    public final IDOMPosition checkAndApplyNecessaryContainers(
-            IDOMModel model, IDOMPosition domPosition) 
-    {
-        IDOMPosition position = DOMPositionHelper.splitText(domPosition);
-
-        position = BodyHelper.adjustInsertPosition
-            (_creationData.getUri(), _creationData.getTagName(), position);
-        
-        //position = getContainerCreationCommands(position);
-        ContainerCreationCommand command = getContainerCreationCommand(position);
-        
-        if (command != null)
-        {
-            command.execute();
-            Collection<IDOMPosition>  collection = command.getResult();
-            
-            if (collection.size()==1)
-            {
-                position = collection.iterator().next(); 
-            }
-            else
-            {
-                position = null;
-            }
-        }
-
-        if (position == null) {
-            // user cancelled
-            return null;
-        }
-
-        // because the next call of getPrefix() may insert new taglib node
-        // into the document, if we use the normal
-        // DOMPositin which use index, maybe it will be invalidated by the
-        // new taglib node. So use RefPosition here.
-        return DOMPositionHelper.toDOMRefPosition(position);
-    }
-
-    /**
-     * @param position
-     * @return a command (could be CompoundCommand or chained command) that when executed
-     * will add any necessary containers.
-     */
-    protected abstract ContainerCreationCommand getContainerCreationCommand(IDOMPosition position);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/AbstractTagCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/AbstractTagCreator.java
deleted file mode 100644
index afc5b69..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/AbstractTagCreator.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation;
-
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-
-/**
- * The abstract class from which all client ITagCreator instances
- * should be derived.
- * 
- * The createTag method enforces a set of steps required by the framework
- * to create a new tag.  However, it allows you to configure some of the steps
- * by providing an ITagCreationAdvisor through the doSelectCreationAdvisor.
- *
- * <p><b>Provisional API - subject to change</b></p>
- *
- * @author cbateman
- *
- */
-public abstract class AbstractTagCreator implements ITagCreator 
-{
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.ITagCreator#createTag(org.eclipse.jst.pagedesigner.editors.palette.TagToolPaletteEntry, org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel, org.eclipse.jst.pagedesigner.dom.IDOMPosition)
-     */
-    public final Element createTag(final CreationData creationData) 
-    {
-        final ITagCreationAdvisor  advisor = selectCreationAdvisor(creationData);
-        
-        // adjust the creation position to accommodate required containers
-        final IDOMPosition position = 
-            advisor.checkAndApplyNecessaryContainers(creationData.getModel(), creationData.getDomPosition());
-        
-        if (position == null) return null;//throw exception?
-
-        creationData.setAdjustedPosition(position);
-        
-        // create the element
-        final Element ele =  createElement(creationData);
-        if (ele == null) return null;//throw exception?
-
-        // apply tag customization
-        advisor.applyCustomization(creationData.getModel(), ele);
-
-        // ensure that any attributes required by the tag's definition
-        // is initialized.
-        // TODO: a drawback of this approach is that it leaves the tag in
-        // a state where there are no error flags to tell the user something is
-        // missing, but may initialize the tag with an (empty) invalid value
-        //ensureRequiredAttrs(ele, creationData);
-
-        addTagToContainer(position, ele);
-
-        return ele;
-    }
-
-    private ITagCreationAdvisor selectCreationAdvisor(CreationData creationData)
-    {
-        ITagCreationAdvisor advisor  = doSelectCreationAdvisor(creationData);
-
-        // enforce that the advisor must be an AbstractTagCreationAdvisor to 
-        // avoid using the default (not this case also covers advisor == null)
-        if (! (advisor instanceof AbstractTagCreationAdvisor))
-        {
-            advisor = new DefaultTagCreationAdvisor(creationData);
-        }
-
-        return advisor;
-    }
-    
-    /**
-     * @param creationData
-     * @return a tag creation advisor or null to indicate the use of the system default
-     */
-    protected abstract ITagCreationAdvisor doSelectCreationAdvisor(CreationData creationData);
-
-    /**
-     * @param creationData 
-     * @return {@link Element}
-     */
-    protected final Element createElement(final CreationData creationData)
-    {
-        Element ele =  creationData.getModel().getDocument().createElement(creationData.getTagName());
-        if (ele == null) return null;
-
-        //ugly... fix me
-        
-        // TODO: move this into an ensure method?
-        // XXX: we are using "startsWith("directive.")" to test whether
-        // should setJSPTag, this
-        // maybe is not the best way. Need check whether SSE have special
-        // API for it.
-        if (ITLDConstants.URI_JSP.equals(creationData.getUri())
-                && (ele.getLocalName().startsWith("directive.")
-                        || "declaration".equals(ele.getLocalName())
-                        || "expression".equals(ele.getLocalName()) || "scriptlet"
-                        .equals(ele.getLocalName()))) {
-            // it is a jsp tag
-            ((IDOMElement) ele).setJSPTag(true);
-        }
-
-        if (creationData.getPrefix() != null)
-        {
-            ele.setPrefix(creationData.getPrefix());
-        }
-
-        return ele;
-    }
-
-    /**
-     * @param position
-     * @param tagElement
-     */
-    private void addTagToContainer(final IDOMPosition position, final Element tagElement) {
-        if (position == null || position.getContainerNode() == null) {
-            return;
-        }
-
-        if (position.getNextSiblingNode() == null) {
-            position.getContainerNode().appendChild(tagElement);
-        } else {
-            position.getContainerNode().insertBefore(tagElement,
-                    position.getNextSiblingNode());
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/CreationData.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/CreationData.java
deleted file mode 100644
index e4d908c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/CreationData.java
+++ /dev/null
@@ -1,261 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.Model;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.internal.TraitValueHelper;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfo;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.PaletteInfos;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationInfo;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.editors.palette.TagToolPaletteEntry;
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-import org.eclipse.wst.xml.core.internal.provisional.contentmodel.CMDocType;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-
-/**
- * Value object that wraps creation data
- *  
- * <p><b>Provisional API - subject to change</b></p>
- *  
- * @author cbateman
- *
- */
-public final class CreationData
-{
-    private final TagToolPaletteEntry   _tagEntry;
-    private final String                _prefix; 
-    private final IDOMPosition          _domPosition;
-    private final IDOMModel             _model;
-    private final IAdaptable            _customizationData;
-    
-    private TagIdentifier               _tagId; // = null; lazy init on creation 
-    
-    /**
-     * The tag {@link Entity} being created
-     */
-    private Entity _tagEntity; // = null; lazy load because derived from
-                               // potentially expensive meta-data search
-    
-    /**
-     * The {@link ITaglibDomainMetaDataModelContext} for the tag creation
-     */
-    private final ITaglibDomainMetaDataModelContext _taglibMetaDataContext;
-
-    // mutable because it may be changed from the original _domPosition
-    private IDOMPosition _adjustedPosition;
-
-    
-    /**
-     * @param tagEntry  TODO: remove this direct dependence on the palette
-     * @param model 
-     * @param domPosition 
-     * @param taglibMetaDataContext 
-     * @param customizationData 
-     */
-    public CreationData(final TagToolPaletteEntry tagEntry, final IDOMModel model, final IDOMPosition domPosition, final ITaglibDomainMetaDataModelContext taglibMetaDataContext, final IAdaptable customizationData) 
-    {
-        super();
-        this._tagEntry = tagEntry;
-        this._prefix = getPrefix(getUri(), model, getDefaultPrefix());
-        this._taglibMetaDataContext = taglibMetaDataContext;
-        this._domPosition = domPosition;
-        this._adjustedPosition = _domPosition;
-        this._model = model;
-        this._customizationData = customizationData; 
-    }
-
-    /**
-     * Returns the ns prefix for the tag and also creates taglib reference if necessary
-     * @param uri
-     * @param model
-     * @param suggested
-     * @return prefix to use
-     */
-    protected static String getPrefix(String uri, IDOMModel model,
-            String suggested) {
-        // TODO: this shouldn't really add to the document
-        if (ITLDConstants.URI_HTML.equalsIgnoreCase(uri)
-                || ITLDConstants.URI_JSP.equalsIgnoreCase(uri)
-                || CMDocType.JSP11_DOC_TYPE.equalsIgnoreCase(uri)) {
-            return null;
-        }
-
-        // now handles custom tag lib
-        return JSPUtil.getOrCreatePrefix(model, uri, suggested);
-    }
-    
-    /**
-     * @return the tag identifier uri
-     */
-    public String getUri() {
-        return _tagEntry.getURI();
-    }
-
-    /**
-     * @return the default prefix
-     */
-    public String getDefaultPrefix() {
-        return _tagEntry.getDefaultPrefix();
-    }
-
-    /**
-     * @return the local prefix for the  tag
-     */
-    public String getPrefix() {
-        return _prefix;
-    }
-
-    /**
-     * @return the tag name
-     */
-    public String getTagName() {
-        return _tagEntry.getTagName();
-    }
-
-    /**
-     * @return the id
-     */
-    private String getItemId() {
-        return _tagEntry.getId();
-    }
-
-    /**
-     * @return the palette entry that this creation info is based on
-     */
-    public TagToolPaletteEntry getTagEntry() {
-        return _tagEntry;
-    }
-    
-    /**
-     * @return {@link TagCreationInfo} for the tag entity
-     */
-    public TagCreationInfo getTagCreationInfo(){
-        Model model = TaglibDomainMetaDataQueryHelper.getModel(_taglibMetaDataContext);
-        if (model != null){
-            Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(model, PaletteInfos.TRAIT_ID);
-            if (trait != null){
-                PaletteInfos pis = (PaletteInfos)trait.getValue();
-                PaletteInfo pi = pis.findPaletteInfoById(getItemId());
-                if (pi != null){
-                    return pi.getTagCreation();                 
-                }
-            }
-            //tag-creation trait on entity directly?
-            Entity tag = getTagEntity();
-            if (tag != null){//metadata exists
-                trait = TaglibDomainMetaDataQueryHelper.getTrait(tag, "tag-create");
-                if (trait != null && trait.getValue() != null){
-                    return (TagCreationInfo)trait.getValue();                   
-                }
-            }
-        }
-        return null;
-    }
-
-    
-    /**
-     * @return the {@link Entity} for this tag element being created
-     */
-    public Entity getTagEntity() {
-        if (_tagEntity == null){
-            _tagEntity = TaglibDomainMetaDataQueryHelper.getEntity(_taglibMetaDataContext, getTagName());
-            
-        }
-        return _tagEntity;
-    }
-    
-    /**
-     * @return flag indicating that html form container ancestor is required
-     */
-    public boolean isHTMLFormRequired() {
-        Trait t = TaglibDomainMetaDataQueryHelper.getTrait(getTagEntity(), "requires-html-form");
-        if (t != null)
-            return TraitValueHelper.getValueAsBoolean(t);
-        
-        return false;
-    }
-    
-    /**
-     * @return flag indicating that jsf component
-     */
-    public boolean isJSFComponent() {      
-        Model model = TaglibDomainMetaDataQueryHelper.getModel(_taglibMetaDataContext);
-        Trait t = TaglibDomainMetaDataQueryHelper.getTrait(model, "is-jsf-component-library");
-        if (t != null)
-            return TraitValueHelper.getValueAsBoolean(t);
-        
-        return false;
-    }
-
-    /**
-     * @return the metadata context for the tag
-     */
-    public ITaglibDomainMetaDataModelContext getTaglibMetaDataContext() {
-        return _taglibMetaDataContext;
-    }
-
-    /**
-     * @return the original dom position of the tag creation
-     */
-    public IDOMPosition getDomPosition() {
-        return _domPosition;
-    }
-
-    /**
-     * @return the dom model
-     */
-    public IDOMModel getModel() 
-    {
-        return _model;
-    }
-
-    /**
-     * @return the adjusted position (calculated to account for containers etc.)
-     */
-    public IDOMPosition getAdjustedPosition() {
-        return _adjustedPosition;
-    }
-
-    /**
-     * @param adjustedPosition
-     */
-    /*package*/ void setAdjustedPosition(IDOMPosition adjustedPosition) {
-        _adjustedPosition = adjustedPosition;
-    }
-
-    /**
-     * @return the TagIdentifer for the tag to be created
-     */
-    public TagIdentifier getTagId() 
-    {
-        if (_tagId == null)
-        {
-            _tagId = TagIdentifierFactory.createJSPTagWrapper(getUri(), getTagName());
-        }
-        return _tagId;
-    }
-
-    /**
-     * @return the customization data passed in from the tool.  May be null.
-     */
-    public IAdaptable getDropCustomizationData() {
-        return _customizationData;
-    }
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/DefaultTagCreationAdvisor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/DefaultTagCreationAdvisor.java
deleted file mode 100644
index a6dfca0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/DefaultTagCreationAdvisor.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.pagedesigner.itemcreation;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.itemcreation.command.ContainerCreationCommand;
-import org.eclipse.jst.pagedesigner.itemcreation.command.ElementCustomizationCommand;
-import org.eclipse.jst.pagedesigner.itemcreation.command.SingletonContainerCreationCommand;
-import org.eclipse.jst.pagedesigner.itemcreation.command.TagContainerCreationCommand;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Element;
-
-/**
- * The default advisor.
- * 
- * Clients may extend this class.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public class DefaultTagCreationAdvisor extends AbstractTagCreationAdvisor 
-{
-    /**
-     * @param creationData
-     */
-    public DefaultTagCreationAdvisor(CreationData creationData) 
-    {
-        super(creationData);
-    }
-
-    
-    @Override
-    protected ElementCustomizationCommand getElementCustomizationCommand(
-            IDOMModel model, Element tagElement) {
-        return new ElementCustomizationCommand(model, tagElement, _creationData);
-    }
-
-    /**
-     * @param position the initial drop position
-     * @return position after creating required containers
-     */
-    protected ContainerCreationCommand getContainerCreationCommand(final IDOMPosition position) {
-        if (_creationData.isJSFComponent()) {
-            return getJSFContainerCommand(position);
-        }
-        else if (_creationData.isHTMLFormRequired()){
-            return getHtmlFormCommand(position);
-        }
-        return null;
-    }
-    
-    /**
-     * @param position
-     * @return the default container creation command for a JSF tag
-     */
-    protected ContainerCreationCommand getJSFContainerCommand(final IDOMPosition position)
-    {
-        ContainerCreationCommand command = 
-            new SingletonContainerCreationCommand(position, IJSFConstants.TAG_IDENTIFIER_VIEW, _creationData.getTagId());
-        
-        if (_creationData.isHTMLFormRequired())
-        {
-            command.chain(new TagContainerCreationCommand(position, IJSFConstants.TAG_IDENTIFIER_FORM, _creationData.getTagId()));
-        }
-        
-        return command;
-    }
-    
-    /**
-     * @param position
-     * @return the default container creation command for an HTML form tag
-     */
-    protected ContainerCreationCommand getHtmlFormCommand(final IDOMPosition position)
-    {
-        return new TagContainerCreationCommand(position, IHTMLConstants.TAG_IDENTIFIER_HTML_FORM, _creationData.getTagId());
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ITagCreationAdvisor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ITagCreationAdvisor.java
deleted file mode 100644
index 97e19c4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ITagCreationAdvisor.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation;
-
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Element;
-
-/**
- * An advisor object that allows customization of tag creation in an ITagCreator
- * 
- * Clients should *not* implement this interface.  Extend AbstractTagCreationAdvisor
- * or DefaultTagCreationAdvisor instead.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public interface ITagCreationAdvisor
-{
-    /**
-     * @param model
-     * @param domPosition
-     * @return a new IDOMPosition adjust for required containers or domPosition
-     * if no adjust is required.  ???May return null???
-     */
-    IDOMPosition checkAndApplyNecessaryContainers(IDOMModel model,
-            IDOMPosition domPosition);
-
-    /**
-     * Apply customization to tagElement.  May use to modify
-     * attributes and child elements of the tag.
-     * 
-     * @param model
-     * @param tagElement
-     * @param tagToolItem
-     */
-    void applyCustomization(IDOMModel model, Element tagElement);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ITagCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ITagCreator.java
deleted file mode 100644
index c8d56e0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ITagCreator.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation;
-
-import org.w3c.dom.Element;
-
-/**
- * The interface type of all tag creators.
- * 
- * Clients should *not* implement this interface.  Extend AbstractTagCreator instead.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- */
-public interface ITagCreator {
-	/**
-	 * @param creationData 
-	 * @return W3C Element for the  tag at the correct position in the DOM.   May be null if creation cannot occur.
-	 */
-	public Element createTag(final CreationData creationData);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ItemCreationEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ItemCreationEditPolicy.java
deleted file mode 100644
index 96929a0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ItemCreationEditPolicy.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.itemcreation;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.requests.DropRequest;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.commands.CreateItemCommand;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.editpolicies.DropEditPolicy;
-import org.eclipse.jst.pagedesigner.tools.ExposeHelper;
-import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.DnDPositionValidator;
-import org.eclipse.jst.pagedesigner.validation.caret.DropActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.DropActionData.DropData;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.IDropLocationStrategy;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * @author mengbo
- */
-public class ItemCreationEditPolicy extends DropEditPolicy 
-{
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#getCommand(org.eclipse.gef.Request)
-	 */
-	public Command getCommand(Request request) {
-		if (request instanceof ItemCreationRequest) {
-			ItemCreationRequest r = (ItemCreationRequest) request;
-			DesignPosition position = findPosition((ItemCreationRequest)request);
-            
-			if (position == null) {
-				return null;
-			}
-            IDOMPosition domposition = DOMPositionHelper.toDOMPosition(position);
-			if (domposition == null) {
-				return null;
-			}
-			return new CreateItemCommand(
-					PDPlugin
-							.getResourceString("ItemCreationEditPolicy.CommandLabel.CreateItem"),//$NON-NLS-1$
-					getViewer(getHost()).getModel(), domposition, r.getTagToolPaletteEntry());
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#getTargetEditPart(org.eclipse.gef.Request)
-	 */
-	public EditPart getTargetEditPart(Request request) {
-		if (request instanceof ItemCreationRequest) {
-			DesignPosition position = findPosition((ItemCreationRequest)request);
-
-			if (position == null) {
-				return null;
-			}
-
-			EditPart container = position.getContainerPart();
-			return container;
-		}
-		return null;
-	}
-
-	/**
-	 * @param host
-	 * @return
-	 */
-	private IHTMLGraphicalViewer getViewer(EditPart host) {
-		return (IHTMLGraphicalViewer) ((GraphicalEditPart) host).getViewer();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#showTargetFeedback(org.eclipse.gef.Request)
-	 */
-	public void showTargetFeedback(Request request) 
-    {
-        if (request instanceof DropRequest 
-                && request.getType() == ItemCreationRequest.REQ_ITEM_CREATION)
-        {
-            super.showTargetFeedback(request);
-            if (getHost() instanceof GraphicalEditPart) {
-                ExposeHelper exposeHelper = new ExposeHelper(
-                        getViewer(getHost()));
-                exposeHelper.adjustVertical(((DropRequest)request).getLocation());
-            }
-        }
-	}
-
-	protected DesignPosition findPosition(DropRequest request) {
-        final IPositionMediator mediator = getDropChildValidator(request);
-        if (mediator == null)
-        {
-            return null;
-        }
-        
-        final IDropLocationStrategy dropStrategy = createDropLocationStrategy(request);
-        final DesignPosition position = 
-            dropStrategy.calculateDesignPosition(getHost(), request.getLocation(), mediator);
-        
-        // verify that the drop strategy has honoured it's contract that our
-        // mediator be respected
-        if (position != null)
-        {
-            if (!mediator.isValidPosition(position))
-            {
-                // if our mediator says no go, then veto the requestor
-                // there is no drop location
-                return null;
-            }
-        }
-        return position;
-    }
-
-    protected final IPositionMediator createDefaultDropChildValidator(DropData data) {
-        return new DnDPositionValidator(new DropActionData(
-                ActionData.PALETTE_DND, data));    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ItemCreationRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ItemCreationRequest.java
deleted file mode 100644
index 27715c6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ItemCreationRequest.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.itemcreation;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.requests.DropRequest;
-import org.eclipse.jst.pagedesigner.editors.palette.TagToolPaletteEntry;
-
-/**
- * Tag tool item creation request class
- * 
- * @author mengbo
- */
-public class ItemCreationRequest extends Request implements DropRequest {
-	/**
-	 * Constant used for item creation request
-	 */
-	public static final String REQ_ITEM_CREATION = "Item Creation";
-	/**
-	 * Constant used for tag tool item
-	 */
-	public static final String TAG_TOOL_PALETTE_ENTRY = "TagToolPaletteEntry";
-	/**
-	 * Constant used for location during creation request
-	 */
-	public static final String LOCATION = "location";
-	
-
-	/**
-	 * Constructor
-	 */
-	public ItemCreationRequest() {
-		super(REQ_ITEM_CREATION);
-	}
-
-	/**
-	 * Constructor
-	 * @param type
-	 */
-	public ItemCreationRequest(Object type) {
-		super(type);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.requests.DropRequest#getLocation()
-	 */
-	public Point getLocation() {
-		return (Point)getExtendedData().get(LOCATION);
-	}
-
-	/**
-	 * Sets the location where the new object will be placed.
-	 * 
-	 * @param location
-	 *            the location
-	 */
-	public void setLocation(Point location) {
-		getExtendedData().remove(LOCATION);
-		getExtendedData().put(LOCATION, location);
-	}
-
-	/**
-	 * Set the tag tool item for creation request
-	 * @param tagToolPaletteEntryItem
-	 */
-	public void setTagToolPaletteEntry(TagToolPaletteEntry tagToolPaletteEntryItem) {
-		getExtendedData().remove(TAG_TOOL_PALETTE_ENTRY);
-		getExtendedData().put(TAG_TOOL_PALETTE_ENTRY, tagToolPaletteEntryItem);
-	}
-
-	/**
-	 * @return {@link TagToolPaletteEntry} requesting creation
-	 */
-	public TagToolPaletteEntry getTagToolPaletteEntry() {
-		return (TagToolPaletteEntry)getExtendedData().get(TAG_TOOL_PALETTE_ENTRY);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ItemCreationTool.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ItemCreationTool.java
deleted file mode 100644
index 4e3c9c1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/ItemCreationTool.java
+++ /dev/null
@@ -1,324 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.SharedCursors;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.tools.TargetingTool;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.pagedesigner.commands.CreateItemCommand;
-import org.eclipse.jst.pagedesigner.editors.palette.TagToolPaletteEntry;
-import org.eclipse.jst.pagedesigner.elementedit.ElementEditFactoryRegistry;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEdit;
-import org.eclipse.jst.pagedesigner.itemcreation.customizer.IDropCustomizer;
-import org.eclipse.swt.graphics.Cursor;
-
-/**
- * This Tool is used to create items. It is to replace the default CreationTool
- * of GEF. We are not using CreationToolEntry for creating item, since the
- * default GEF implementation require creating of the object before drop into
- * the view. We do not want to create the XML element (and possibly its taglib
- * declaration) before the drop is really performed.)
- * 
- * @author mengbo
- */
-public class ItemCreationTool extends TargetingTool {
-	TagToolPaletteEntry _tagPaletteItem; //can we get rid of this?
-
-	/**
-	 * Default constructor. Sets the default and disabled cursors.
-	 * @param tagToolPaletteEntryItem 
-	 */
-	public ItemCreationTool(TagToolPaletteEntry tagToolPaletteEntryItem) {
-		setDefaultCursor(SharedCursors.CURSOR_TREE_ADD);
-		setDisabledCursor(SharedCursors.NO);
-
-		this._tagPaletteItem = tagToolPaletteEntryItem;  
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.AbstractTool#calculateCursor()
-	 */
-	protected Cursor calculateCursor() {
-		/*
-		 * Fix for Bug# 66010 The following two lines of code were added for the
-		 * case where a tool is activated via the keyboard (that code hasn't
-		 * been released yet). However, they were causing a problem as described
-		 * in 66010. Since the keyboard activation code is not being released
-		 * for 3.0, the following lines are being commented out.
-		 */
-		// if (isInState(STATE_INITIAL))
-		// return getDefaultCursor();
-		return super.calculateCursor();
-	}
-
-	/**
-	 * Creates a {@link ItemCreationRequest}and sets this tool's factory on the
-	 * request.
-	 * 
-	 * @see org.eclipse.gef.tools.TargetingTool#createTargetRequest()
-	 */
-	protected Request createTargetRequest() {
-		ItemCreationRequest request = new ItemCreationRequest();
-		request.setTagToolPaletteEntry(_tagPaletteItem);
-		return request;
-	}
-
-	/**
-	 * @see org.eclipse.gef.Tool#deactivate()
-	 */
-	public void deactivate() {
-		super.deactivate();
-		// TODO: never read helper = null;
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.AbstractTool#getCommandName()
-	 */
-	protected String getCommandName() {
-		return ItemCreationRequest.REQ_ITEM_CREATION;
-	}
-
-	/**
-	 * Cast the target request to a CreateRequest and returns it.
-	 * 
-	 * @return the target request as a CreateRequest
-	 * @see TargetingTool#getTargetRequest()
-	 */
-	protected ItemCreationRequest getCreateRequest() {
-		return (ItemCreationRequest) getTargetRequest();
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.AbstractTool#getDebugName()
-	 */
-	protected String getDebugName() {
-		return "Item Creation Tool";//$NON-NLS-1$
-	}
-
-	/**
-	 * The creation tool only works by clicking mouse button 1 (the left mouse
-	 * button in a right-handed world). If any other button is pressed, the tool
-	 * goes into an invalid state. Otherwise, it goes into the drag state,
-	 * updates the request's location and calls
-	 * {@link TargetingTool#lockTargetEditPart(org.eclipse.gef.EditPart)}with the edit part
-	 * that was just clicked on.
-	 * 
-	 * @see org.eclipse.gef.tools.AbstractTool#handleButtonDown(int)
-	 */
-	protected boolean handleButtonDown(int button) {
-		if (button != 1) {
-			setState(STATE_INVALID);
-			handleInvalidInput();
-			return true;
-		}
-		if (stateTransition(STATE_INITIAL, STATE_DRAG)) {
-			if (getTargetEditPart() != null) {
-				getCreateRequest().setLocation(getLocation());
-				lockTargetEditPart(getTargetEditPart());
-				// Snap only when size on drop is employed
-				// TODO: never read helper = (SnapToHelper) getTargetEditPart().getAdapter(
-				//SnapToHelper.class);
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * If the tool is currently in a drag or drag-in-progress state, it goes
-	 * into the terminal state, performs some cleanup (erasing feedback,
-	 * unlocking target edit part), and then calls {@link #performCreation(int)}.
-	 * 
-	 * @see org.eclipse.gef.tools.AbstractTool#handleButtonUp(int)
-	 */
-	protected boolean handleButtonUp(int button) 
-	{
-		if (stateTransition(STATE_DRAG | STATE_DRAG_IN_PROGRESS, STATE_TERMINAL)) 
-		{
-			eraseTargetFeedback();
-			unlockTargetEditPart();
-			
-			// customizer may cancel the drop
-			customizeDropAndMaybeExecute(button);
-		}
-		
-		setState(STATE_TERMINAL);
-		handleFinished();
-
-		return true;
-	}
-
-	/**
-	 * @param button
-	 */
-	protected void customizeDropAndMaybeExecute(final int button)
-	{
-        Command command = getCurrentCommand();
-        
-        int status = IStatus.OK;
-        if (command instanceof CreateItemCommand)
-        {
-            status = performCustomization((CreateItemCommand)command);
-        }
-        
-        if (status == IStatus.OK)
-        {
-            performCreation(button);
-        }
-	}
-
-	private int performCustomization(CreateItemCommand command)
-	{
-	    IStatus status = Status.OK_STATUS;
-	    TagIdentifier tagId = 
-	        TagIdentifierFactory.createJSPTagWrapper
-	            (_tagPaletteItem.getURI(), _tagPaletteItem.getTagName());
-	    
-	    IElementEdit elementEdit = ElementEditFactoryRegistry.getInstance().createElementEdit(tagId);
-
-	    if (elementEdit != null)
-	    {
-	        IDropCustomizer customizer = elementEdit.getDropCustomizer(tagId);
-    	    
-    	    if (customizer != null)
-    	    {
-        	    status = customizer.runCustomizer();
-        	    
-        	    if (status.getSeverity() == IStatus.OK)
-        	    {
-        	        command.setCustomizationData(customizer.getDropCustomizationData());
-        	    }
-    	    }
-	    }
-	    return status.getSeverity();
-	}
-
-	/**
-	 * Updates the request, sets the current command, and asks to show feedback.
-	 * 
-	 * @see org.eclipse.gef.tools.AbstractTool#handleDragInProgress()
-	 */
-	protected boolean handleDragInProgress() {
-		if (isInState(STATE_DRAG_IN_PROGRESS)) {
-			updateTargetRequest();
-			setCurrentCommand(getCommand());
-			showTargetFeedback();
-		}
-		return true;
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.AbstractTool#handleDragStarted()
-	 */
-	protected boolean handleDragStarted() {
-		return stateTransition(STATE_DRAG, STATE_DRAG_IN_PROGRESS);
-	}
-
-	/**
-	 * If the user is in the middle of creating a new edit part, the tool erases
-	 * feedback and goes into the invalid state when focus is lost.
-	 * 
-	 * @see org.eclipse.gef.tools.AbstractTool#handleFocusLost()
-	 */
-	protected boolean handleFocusLost() {
-		if (isInState(STATE_DRAG | STATE_DRAG_IN_PROGRESS)) {
-			eraseTargetFeedback();
-			setState(STATE_INVALID);
-			handleFinished();
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.TargetingTool#handleHover()
-	 */
-	protected boolean handleHover() {
-		if (isInState(STATE_INITIAL))
-			updateAutoexposeHelper();
-		return true;
-	}
-
-	/**
-	 * Updates the request and mouse target, gets the current command and asks
-	 * to show feedback.
-	 * 
-	 * @see org.eclipse.gef.tools.AbstractTool#handleMove()
-	 */
-	protected boolean handleMove() {
-		updateTargetRequest();
-		updateTargetUnderMouse();
-		setCurrentCommand(getCommand());
-		showTargetFeedback();
-		return true;
-	}
-
-	/**
-	 * Executes the current command and selects the newly created object. The
-	 * button that was released to cause this creation is passed in, but since
-	 * {@link #handleButtonDown(int)}goes into the invalid state if the button
-	 * pressed is not button 1, this will always be button 1.
-	 * 
-	 * @param button
-	 *            the button that was pressed
-	 */
-	protected void performCreation(int button) {
-		executeCurrentCommand();
-		// selectAddedObject();
-	}
-
-	// /*
-	// * Add the newly created object to the viewer's selected objects.
-	// */
-	// private void selectAddedObject() {
-	// final Object model = getCreateRequest().getNewObject();
-	// if (model == null)
-	// return;
-	// EditPartViewer viewer = getCurrentViewer();
-	// Object editpart = viewer.getEditPartRegistry().get(model);
-	// if (editpart instanceof EditPart) {
-	// viewer.flush();
-	// viewer.select((EditPart)editpart);
-	// }
-	// }
-
-	/**
-	 * Sets the location (and size if the user is performing size-on-drop) of
-	 * the request.
-	 * 
-	 * @see org.eclipse.gef.tools.TargetingTool#updateTargetRequest()
-	 */
-	protected void updateTargetRequest() {
-		ItemCreationRequest req = getCreateRequest();
-		req.setLocation(getLocation());
-		// if (isInState(STATE_DRAG_IN_PROGRESS)) {
-		// Point loq = getStartLocation();
-		// req.setLocation(bounds.getLocation());
-		// req.getExtendedData().clear();
-		// if (!getCurrentInput().isAltKeyDown() && helper != null) {
-		// PrecisionRectangle baseRect = new PrecisionRectangle(bounds);
-		// PrecisionRectangle result = baseRect.getPreciseCopy();
-		// helper.snapRectangle(req, PositionConstants.NSEW,
-		// baseRect, result);
-		// req.setLocation(result.getLocation());
-		// req.setSize(result.getSize());
-		// }
-		// } else {
-		// req.setLocation(getLocation());
-		// }
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/ContainerCreationCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/ContainerCreationCommand.java
deleted file mode 100644
index 23f429f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/ContainerCreationCommand.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation.command;
-
-import java.util.Collection;
-import java.util.Collections;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.itemcreation.internal.AbstractCreationCommand;
-
-/**
- * Command for creating containers.
- * 
- *  * <p><b>Provisional API - subject to change</b></p>
- *  
- *  Clients may sub-class, but is preferable to use {@link SingletonContainerCreationCommand}
- *  or {@link TagContainerCreationCommand} instead.
- *  
- * @author cbateman
- *
- */
-public abstract class ContainerCreationCommand extends AbstractCreationCommand 
-{
-    private final IDOMPosition          _originalDomPosition;
-    private final TagIdentifier         _containerTag;
-    private final TagIdentifier         _tagBeingCreated;
-    private IDOMPosition                _domPosition;
-    private ContainerCreationCommand    _nextCommand = null;
-    
-    /**
-     * @param domPosition
-     * @param containerTag
-     */
-    /*package*/ ContainerCreationCommand(IDOMPosition domPosition, TagIdentifier containerTag, TagIdentifier tagBeingCreated)
-    {
-        _domPosition = domPosition;
-        _originalDomPosition = domPosition;
-        _containerTag = containerTag;
-        _tagBeingCreated = tagBeingCreated;
-    }
-    
-    @Override
-    public final void execute() 
-    {
-        _domPosition = doExecute();
-        
-        if (_nextCommand != null)
-        {
-            _nextCommand.setDomPosition(_domPosition);
-            _nextCommand.execute();
-            // update the dom position
-            _domPosition = _nextCommand.getDomPosition();
-        }
-    }
-
-    @Override
-    public final Collection<IDOMPosition> getResult() 
-    {
-        return Collections.singletonList(_domPosition);
-    }
-
-    /**
-     * @return the new dom position after the container insert
-     */
-    protected abstract IDOMPosition doExecute();
-
-    @Override
-    public final ContainerCreationCommand chain(Command command) 
-    {
-        if (!(command instanceof ContainerCreationCommand))
-        {
-            throw new IllegalArgumentException("Can only chain ContainerCreationCommand's");
-        }
-        
-        if (_nextCommand == null)
-        {
-            _nextCommand = (ContainerCreationCommand) command;
-        }
-        else
-        {
-            _nextCommand.chain(command);
-        }
-        
-        return this;
-    }
-
-    /**
-     * Update the domPosition
-     * 
-     * @param domPosition
-     */
-    public final void setDomPosition(final IDOMPosition domPosition)
-    {
-        if (_domPosition.getContainerNode().getOwnerDocument() == 
-                domPosition.getContainerNode().getOwnerDocument())
-        {
-            _domPosition = domPosition;
-        }
-        else
-        {
-            // if not in same document, then error
-            throw new IllegalArgumentException("New domPosition must be in same document as old domPosition");
-        }
-    }
-
-    /**
-     * @return the dom position
-     */
-    protected final IDOMPosition getDomPosition() {
-        return _domPosition;
-    }
-
-    /**
-     * @return the original dom position that this container creation command
-     * was created with.
-     */
-    protected final IDOMPosition getOriginalDomPosition() {
-        return _originalDomPosition;
-    }
-
-    /**
-     * @return the container tag to be created
-     */
-    protected final TagIdentifier getContainerTag() {
-        return _containerTag;
-    }
-
-    /**
-     * @return the tag that is being created for which we are adding the container
-     */
-    protected final TagIdentifier getTagBeingCreated() {
-        return _tagBeingCreated;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/ElementCustomizationCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/ElementCustomizationCommand.java
deleted file mode 100644
index e1a56ba..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/ElementCustomizationCommand.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation.command;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationAttribute;
-import org.eclipse.jst.jsf.tagdisplay.internal.paletteinfos.TagCreationInfo;
-import org.eclipse.jst.pagedesigner.editors.palette.impl.PaletteElementTemplateHelper;
-import org.eclipse.jst.pagedesigner.itemcreation.CreationData;
-import org.eclipse.jst.pagedesigner.itemcreation.internal.AbstractCreationCommand;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Element;
-
-/**
- * A command to customize a new tag element
- * <p>
- * <b>Provisional API - subject to change</b>
- * </p>
- * 
- * Clients may sub-class.
- * 
- * @author cbateman
- * 
- */
-public class ElementCustomizationCommand extends AbstractCreationCommand
-{
-    /**
-     * the dom model where the element will be added
-     */
-    protected final IDOMModel _model;
-    /**
-     * the element to be customized
-     */
-    protected final Element _element;
-    /**
-     * the creation data for the new tag
-     */
-    protected final CreationData _creationData;
-
-    /**
-     * @param model
-     * @param element
-     * @param creationData
-     */
-    public ElementCustomizationCommand(final IDOMModel model,
-            final Element element, final CreationData creationData)
-    {
-        _model = model;
-        _element = element;
-        _creationData = creationData;
-    }
-
-    @Override
-    public void execute()
-    {
-        applyChildElementCustomization();
-        applyAttributeCustomization();
-    }
-
-    @Override
-    protected boolean prepare()
-    {
-        // do nothing by default; return true to indicate can execute
-        return true;
-    }
-
-    /**
-     * Override to customize the children of the tag being created
-     * 
-     * Default implementation uses meta-data to load a template. This is the
-     * prefered method for static child values (i.e. those that are not
-     * calculated dynamically at runtime).
-     */
-    protected void applyChildElementCustomization()
-    {
-        final TagCreationInfo tagCreationInfo = _creationData.getTagCreationInfo();
-        if (tagCreationInfo != null)
-        {
-            PaletteElementTemplateHelper.applyTemplate(_model, _element,
-                    _creationData.getTagEntry(), tagCreationInfo);
-        }
-    }
-
-    /**
-     * Add required attributes and default values, if set, to the created tag
-     * element
-     * 
-     * To customize the attributes that get added, use TagCreationInfo metadata
-     * 
-     * This method is provided as a utility for clients. It is not used by
-     * default
-     * 
-     * @param element
-     * @param creationData
-     */
-    protected final void ensureRequiredAttrs(final Element element,
-            final CreationData creationData)
-    {
-        final CMElementDeclaration ed = CMUtil.getTLDElementDeclaration(creationData
-                .getUri(), creationData.getTagName(), creationData.getModel()
-                .getDocument().getStructuredDocument());
-
-        if (ed != null)
-        {
-            for (final Iterator it = ed.getAttributes().iterator(); it.hasNext();)
-            {
-                final CMAttributeDeclaration attr = (CMAttributeDeclaration) it
-                        .next();
-                if (attr.getUsage() == CMAttributeDeclaration.REQUIRED
-                        && element.getAttribute(attr.getAttrName()) == null)
-                {
-                    element.setAttribute(attr.getAttrName(), attr
-                            .getDefaultValue());
-                }
-            }
-        }
-    }
-
-    /**
-     * Override to customize the attributes of the tag being created
-     * 
-     * Default implementation uses meta-data to set the attribut values. This is
-     * the prefered method for static attribute values (i.e. those that are not
-     * calculated dynamically at runtime).
-     * 
-     */
-    protected void applyAttributeCustomization()
-    {
-        final TagCreationInfo info = _creationData.getTagCreationInfo();
-        if (info != null)
-        {
-            final EList list = info.getAttributes();
-            if (list != null)
-            {
-                for (final Iterator it = list.iterator(); it.hasNext();)
-                {
-                    final TagCreationAttribute attr = (TagCreationAttribute) it
-                            .next();
-                    _element.setAttribute(attr.getId(),
-                            (attr.getValue() == null ? "" : attr.getValue()));
-                }
-            }
-        }
-    }
-
-    @Override
-    public final Command chain(final Command command)
-    {
-        return super.chain(command);
-    }
-
-    @Override
-    public final Collection<Element> getResult()
-    {
-        return Collections.singletonList(_element);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/SingletonContainerCreationCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/SingletonContainerCreationCommand.java
deleted file mode 100644
index 841aad9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/SingletonContainerCreationCommand.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation.command;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.utils.BodyHelper;
-import org.eclipse.jst.pagedesigner.validation.caret.JSFRootContainerPositionRule;
-import org.w3c.dom.Document;
-
-/**
- * Used to create a container that should only occur once per document. Typically
- * used for HTML body and JSF f:view tags.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * Clients may reference but not sub-class.
- * @author cbateman
- *
- */
-public final class SingletonContainerCreationCommand extends ContainerCreationCommand 
-{
-    private static final int  MAX_DEPTH_TO_SEARCH_FOR_CONTAINER = 10;
-
-    /**
-     * @param domPosition
-     * @param containerTag
-     * @param tagBeingCreated 
-     */
-    public SingletonContainerCreationCommand(IDOMPosition domPosition,
-            TagIdentifier containerTag, TagIdentifier tagBeingCreated) 
-    {
-        super(domPosition, containerTag, tagBeingCreated);
-    }
-
-    @Override
-    protected IDOMPosition doExecute() 
-    {
-       return insertSingletonIfNotPresent();
-    }
-    
-    private IDOMPosition insertSingletonIfNotPresent()
-    {
-        IDOMPosition domPosition = getDomPosition();
-        final TagIdentifier containerTag = getContainerTag();
-        final TagIdentifier tagBeingCreated = getTagBeingCreated();
-        
-        final Document document = EditModelQuery.getDocumentNode(domPosition
-                .getContainerNode());
-        
-        final boolean isContainerAlreadyPresent =
-            JSFRootContainerPositionRule.hasBasicContainers
-                (document, MAX_DEPTH_TO_SEARCH_FOR_CONTAINER);
-
-        if (isContainerAlreadyPresent) 
-        {
-            // if the container and element to be created are the same,
-            // then return null indicating to abort
-            if (containerTag.equals(tagBeingCreated))
-            {
-                domPosition =  null;
-            }
-            // otherwise, simply fall through keeping domPosition unchanged
-        }
-        // if the container isn't already present
-        else
-        {
-            
-            if (!containerTag.equals(tagBeingCreated)) 
-            {
-            // if the container is different and doesn't exist, then add it.
-                domPosition = BodyHelper.insertBody(domPosition, containerTag.asQName(), "f");
-            }
-            // otherwise, fall through leaving domPosition unchanged
-        }
-
-        return domPosition;
-    }
-
-    @Override
-    protected boolean prepare()
-    {
-        throw new UnsupportedOperationException("don't use");
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/TagContainerCreationCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/TagContainerCreationCommand.java
deleted file mode 100644
index 12f030a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/command/TagContainerCreationCommand.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation.command;
-
-import javax.xml.namespace.QName;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.dom.ValidatorSupport;
-
-/**
- * @author cbateman
- * 
- *  * <p><b>Provisional API - subject to change</b></p>
- *  
- *  Clients may sub-class
- *
- */
-public class TagContainerCreationCommand extends ContainerCreationCommand {
-
-    /**
-     * @param domPosition
-     * @param containerTag
-     * @param tagBeingCreated
-     */
-    public TagContainerCreationCommand(IDOMPosition domPosition,
-            TagIdentifier containerTag, TagIdentifier tagBeingCreated) 
-    {
-        super(domPosition, containerTag, tagBeingCreated);
-    }
-
-    @Override
-    protected IDOMPosition doExecute() 
-    {
-        final IDOMPosition domPosition = getDomPosition();
-        final QName  containerQName = getContainerTag().asQName();
-        boolean hasform = ValidatorSupport.checkContainer(domPosition, containerQName);
-        IDOMPosition newPosition = domPosition;
-        if (!hasform) {
-            newPosition = ValidatorSupport
-                    .insertContainer(domPosition, containerQName, getContainerCustomizationData());
-            if (newPosition == null) {
-                newPosition = domPosition;
-            }
-        }
-        return newPosition;
-    }
-
-    /**
-     * Override to inject customization data into the tag creation
-     * @return a customization data for the container.
-     */
-    protected IAdaptable getContainerCustomizationData()
-    {
-        return null;
-    }
-    
-    @Override
-    protected final boolean prepare()
-    {
-        throw new UnsupportedOperationException("don't use");
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/AbstractDropCustomizer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/AbstractDropCustomizer.java
deleted file mode 100644
index 043d2aa..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/AbstractDropCustomizer.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation.customizer;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-
-/**
- * Clients should extend to implement their own IDropCustomizer.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractDropCustomizer implements IDropCustomizer 
-{
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.customizer.IDropCustomizer#getDropCustomizationData()
-     */
-    public IAdaptable getDropCustomizationData() 
-    {
-        return null;
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.itemcreation.customizer.IDropCustomizer#runCustomizer()
-     */
-    public IStatus runCustomizer() 
-    {
-        return Status.OK_STATUS;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/IDropCustomizer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/IDropCustomizer.java
deleted file mode 100644
index 6b4cb2b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/customizer/IDropCustomizer.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Oracle Corporation
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation.customizer;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * Interface used to declare an object that customizes tag creation data prior
- * to a drop.  The drop customizer should be used to illicit data on per-drop basis.
- * 
- * Clients should not implement this interface.  Extend AbstractDropCustomizer instead.
- * 
- * <p><b>Provisional API - subject to change</b></p>
- * @author cbateman
- *
- */
-public interface IDropCustomizer 
-{
-    /**
-     * Executed when the user performs a drop gesture for a tag, but before the
-     * command is dispatched to create the tag in the target document.  Implementers
-     * may do calculations or raise customization UI.  There return value is used
-     * to decide whether to continue.  Values other than OK and CANCEL are currently
-     * ignored.  If the return value has a severity of CANCEL, then the drop will
-     * be aborted.  If the return severity is OK, then getDropCustomizationData will
-     * be called and it's value will be passed to the ITagCreator framework through
-     * the CreationData object.
-     * 
-     * NOTE: This method may be called on the UI thread, although this is not guaranteed.
-     * Implementer should ensure that anything that is long-running (such as a dialog)
-     * is user-cancellable and that any UI code is run on the display thread.
-     * 
-     * @return the status condition of the customizer
-     */
-    public IStatus runCustomizer();
-
-    /**
-     * @return the customization data.  This method will only be called after runCustomizer
-     * and only if runCustomizer returns IStatus.OK in its severity.  The adaptable will
-     * be passed to the ITagCreator framework through the CreationData value object.  You
-     * may return null even if runCustomizer() returns OK.
-     */
-    public IAdaptable getDropCustomizationData();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/AbstractCreationCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/AbstractCreationCommand.java
deleted file mode 100644
index 9a17e1f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/AbstractCreationCommand.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation.internal;
-
-import java.util.Collection;
-import java.util.Collections;
-
-import org.eclipse.emf.common.command.AbstractCommand;
-import org.eclipse.emf.common.command.Command;
-
-/**
- * Internal super-class of all tag creation commands.
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractCreationCommand extends AbstractCommand implements
-        ICreationCommand 
-{
-    public abstract void execute(); 
-
-    public final void redo() 
-    {
-        throw new UnsupportedOperationException("don't use");
-    }
-
-    @Override
-    public final boolean canExecute() 
-    {
-        return super.canExecute();
-    }
-
-    @Override
-    public final boolean canUndo() {
-        return super.canUndo();
-    }
-
-    @Override
-    public Command chain(Command command) {
-        if (command instanceof ICreationCommand)
-        {
-            return super.chain(command);
-        }
-        throw new IllegalArgumentException("command must an ICreationCommand");
-    }
-
-    @Override
-    public final void dispose() 
-    {
-        throw new UnsupportedOperationException("don't use");
-    }
-
-    @Override
-    public final Collection<?> getAffectedObjects() {
-        return super.getAffectedObjects();
-    }
-
-    @Override
-    public final String getDescription() 
-    {
-        return super.getDescription();
-    }
-
-    @Override
-    public final String getLabel() 
-    {
-        return super.getLabel();
-    }
-
-    @Override
-    public Collection<?> getResult() 
-    {
-        return Collections.EMPTY_LIST;
-    }
-
-    @Override
-    protected abstract boolean prepare(); 
-
-    @Override
-    public final void setDescription(String description) 
-    {
-        super.setDescription(description);
-    }
-
-    @Override
-    public final void setLabel(String label) 
-    {
-        super.setLabel(label);
-    }
-
-    @Override
-    public final void undo() 
-    {
-        // for now, there is no undo
-        super.undo();
-    }
-
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/DefaultTagCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/DefaultTagCreator.java
deleted file mode 100644
index bcb087c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/DefaultTagCreator.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation.internal;
-
-import org.eclipse.jst.pagedesigner.itemcreation.AbstractTagCreator;
-import org.eclipse.jst.pagedesigner.itemcreation.CreationData;
-import org.eclipse.jst.pagedesigner.itemcreation.ITagCreationAdvisor;
-
-/**
- * {@link org.eclipse.jst.pagedesigner.itemcreation.ITagCreator} used by the Web Page Editor palette. 
- * 
- * Uses org.eclipse.jst.jsf.common.metadata 
- */
-public class DefaultTagCreator extends AbstractTagCreator 
-{
-
-    @Override
-    protected ITagCreationAdvisor doSelectCreationAdvisor(
-            CreationData creationData) {
-        // return null by default. This causes the default advisor to be used.
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/ICreationCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/ICreationCommand.java
deleted file mode 100644
index bc2f25d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/ICreationCommand.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation.internal;
-
-
-/**
- * Implemented by commands that do tag model creation.  NOTE: this interface is highly provisional
- * and mainly exists to provide a facade to the future use of an existing Command infrastructure:
- * probably the EMF commands.  We haven't decided yet so it is important that:
- * 
- * This interface should NOT be implemented by clients
- * 
- * @author cbateman
- *
- */
-public interface ICreationCommand 
-{
-    // tagging interface only
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/TagCreationFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/TagCreationFactory.java
deleted file mode 100644
index 38ab707..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/TagCreationFactory.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.pagedesigner.itemcreation.internal;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.elementedit.ElementEditFactoryRegistry;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEdit;
-import org.eclipse.jst.pagedesigner.itemcreation.AbstractTagCreator;
-import org.eclipse.jst.pagedesigner.itemcreation.ITagCreator;
-
-/**
- * Creates instances of
- * {@link org.eclipse.jst.pagedesigner.itemcreation.ITagCreator}s for a the
- * given
- * {@link org.eclipse.jst.pagedesigner.editors.palette.TagToolPaletteEntry}
- * (Eventually) Will use TagCreavtorFactories registered using
- * org.eclipse.jst.jsf.pagedesigner.tagcreationfactories ext-pt. Currently only
- * using DefaultTagCreator.
- */
-public class TagCreationFactory
-{
-    private static TagCreationFactory INSTANCE = null;
-
-    /**
-     * @return singleton instance
-     */
-    public synchronized static TagCreationFactory getInstance()
-    {
-        if (INSTANCE == null)
-        {
-            INSTANCE = new TagCreationFactory();
-        }
-        return INSTANCE;
-    }
-
-    /**
-     * Using the TagToolPaletteEntry, locate the factory to use for tag creation
-     * 
-     * @param tagId
-     * 
-     * @return ITagCreator
-     */
-    public ITagCreator createTagCreator(final TagIdentifier tagId)
-    {
-
-        IElementEdit elementEdit = ElementEditFactoryRegistry.getInstance()
-                .createElementEdit(tagId);
-
-        if (elementEdit != null)
-        {
-            // for (ITagCreatorFactory factory : factories)
-            // {
-            ITagCreator tagCreator = null;
-            try
-            {
-                tagCreator = elementEdit.getTagCreator(tagId);
-            }
-            catch (Exception e)
-            {
-                PDPlugin.getLogger(getClass()).error(
-                        "Error.ProblemLoadingTagCreatorFactory",
-                        elementEdit.getClass().toString(), e);
-            }
-
-            if (tagCreator != null)
-            {
-                if (tagCreator instanceof AbstractTagCreator)
-                {
-                    return tagCreator;
-                }
-                // if non-null, skipped, log the issue
-                PDPlugin.getLogger(getClass()).error(
-                        "Error.ProblemLoadingTagCreatorFactory",
-                        "Tag creator must extend AbstractTagCreator",
-                        new Throwable());
-            }
-        }
-
-        // all else fails, use the internal default
-        return new DefaultTagCreator();
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/TagCreatorFactoryRegistryReader.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/TagCreatorFactoryRegistryReader.java
deleted file mode 100644
index ea06009..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/itemcreation/internal/TagCreatorFactoryRegistryReader.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.itemcreation.internal;
-
-
-/**
- * A registry reader that lazy initializes a list of uri-sensitive
- * extensions
- * 
- * @author cbateman
- *
- */
-public final class TagCreatorFactoryRegistryReader 
-{
-    // TODO: move this logic into the ElementEditFacRegistryReader
-//    private static Map<String, List<ITagCreatorFactory>> _handlers = null;
-//
-//    /**
-//     * @param uri the uri to get a list of factories for
-//     * @return all available handers for the ext-pt
-//     */
-//    public static synchronized List<ITagCreatorFactory> getAllHandlers(final String uri) 
-//    {
-//        if (_handlers == null) {
-//            _handlers = readAllHandlers();
-//        }
-//        return _handlers.get(uri);
-//    }
-//
-//    private static Map<String, List<ITagCreatorFactory>> readAllHandlers() 
-//    {
-//        final Map<String, List<ExtElement>>  map = 
-//            new HashMap<String, List<ExtElement>>();
-//
-//        IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
-//                .getExtensionPoint(PDPlugin.getPluginId(),
-//                        IJMTConstants.TAG_CREATOR_FACTORY_EXT_NAME);
-//        IExtension[] extensions = extensionPoint.getExtensions();
-//
-//        for (int i = 0; i < extensions.length; i++) 
-//        {
-//            IExtension ext = extensions[i];
-//            IConfigurationElement[] tagCreationHandlers = ext
-//                    .getConfigurationElements();
-//
-//            for (int j = 0; j < tagCreationHandlers.length; j++) {
-//                if (tagCreationHandlers[j].getName().equals(
-//                        IJMTConstants.TAG_CREATOR_FACTORY_ELEMENT_NAME)) 
-//                {
-//                    try
-//                    {
-//                        final ExtElement extElement = 
-//                            new ExtElement(tagCreationHandlers[j]);
-//                        List<ExtElement> elements = 
-//                            map.get(extElement.getUri());
-//                        
-//                        if (elements == null)
-//                        {
-//                            elements = new ArrayList<ExtElement>();
-//                            map.put(extElement.getUri(), elements);
-//                        }
-//                        
-//                        elements.add(extElement);
-//                    }
-//                    catch (CoreException ce)
-//                    {
-//                        PDPlugin.getLogger(ExtElement.class)
-//                            .error("Error.ProblemLoadingExtensionPoint", ce);
-//                    }
-//                }
-//            }
-//        }
-//        
-//        final Map<String, List<ITagCreatorFactory>> handlers = 
-//            new HashMap<String, List<ITagCreatorFactory>>();
-//        
-//        // now loop through the extensions, looking for collisions
-//        // on the same uri
-//        for (String uri : map.keySet())
-//        {
-//            List<ExtElement>  elements = map.get(uri);
-//            
-//            if (elements.size() > 1)
-//            {
-//                Collections.sort(elements);
-//                
-//                MultiStatus chainedStatus = new MultiStatus(PDPlugin.getPluginId(), 0, "Collision detected in ITagCreatorFactory extensions for uri: "+uri+". Factories will be queried in the following order with the first contender to provide a ITagCreator winning",
-//                        new Throwable());
-//                
-//                for (ExtElement element : elements)
-//                {
-//                    IStatus status = 
-//                        new Status(IStatus.WARNING, PDPlugin.getPluginId(), element.getClassName());
-//                    chainedStatus.add(status);
-//                }
-//                
-//                PDPlugin.log(chainedStatus);
-//            }
-//            
-//            List<ITagCreatorFactory>  factories = 
-//                new ArrayList<ITagCreatorFactory>();
-//
-//            for (ExtElement element : elements)
-//            {
-//                factories.add(element.getFactoryInstance());
-//            }
-//            
-//            handlers.put(uri, factories);
-//        }
-//
-//        return handlers;
-//    }
-//
-//    private static class ExtElement implements Comparable<ExtElement>
-//    {
-//        private final IConfigurationElement  _element;
-//        
-//        private final ITagCreatorFactory  _factoryInstance;
-//        
-//        ExtElement(IConfigurationElement element) throws CoreException
-//        {
-//            _element = element;
-//            
-//            final String uri = getUri();
-//            final String factory = getClassName();
-//            
-//            if (uri == null || factory == null)
-//            {
-//                throw new CoreException(new Status(IStatus.ERROR,PDPlugin.getPluginId(), "uri and factory must not be null: uri="+uri+", factory="+factory));
-//            }
-//            
-//            Object obj = _element.createExecutableExtension("factory");
-//
-//            if (obj instanceof ITagCreatorFactory) 
-//            {
-//                _factoryInstance = (ITagCreatorFactory) obj;
-//            }
-//            else
-//            {
-//                throw new CoreException(new Status(IStatus.ERROR,PDPlugin.getPluginId(), "Factory must be instanceof ITagCreatorFactory"));
-//            }
-//        }
-//
-//        /**
-//         * @return the uri
-//         */
-//        public String getUri() {
-//            return _element.getAttribute("uri");
-//        }
-//
-//        /**
-//         * @return the class name
-//         */
-//        public String getClassName() {
-//            return _element.getAttribute("factory");
-//        }
-//
-//        /**
-//         * @return the factory instance or null
-//         */
-//        public ITagCreatorFactory getFactoryInstance() 
-//        {
-//            return _factoryInstance;
-//        }
-//
-//        /* 
-//         * Two elements compare by the canonical comparision of their
-//         * contributor's bundle name string
-//         */
-//        public int compareTo(ExtElement o)
-//        {
-//            return _element.getContributor().getName().compareTo
-//                (o._element.getContributor().getName());
-//        }
-//
-//        @Override
-//        public boolean equals(Object obj) 
-//        {
-//            // ensure that x.equals(y) iff x.compareTo(y) == 0
-//            if (obj instanceof ExtElement)
-//            {
-//                return compareTo((ExtElement) obj) == 0;
-//            }
-//            
-//            return false;
-//        }
-//
-//        @Override
-//        public int hashCode() 
-//        {
-//            // ensure that x.equals(y) => x.hashCode == y.hashCode
-//            return _element.getContributor().getName().hashCode();
-//        }
-//    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/AttributeDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/AttributeDescriptor.java
deleted file mode 100644
index c05f6f1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/AttributeDescriptor.java
+++ /dev/null
@@ -1,236 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.meta;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.StringTokenizer;
-
-import org.eclipse.jst.jsf.common.ui.internal.utils.StringUtil;
-
-/**
- * @author mengbo
- * @deprecated
- */
-public class AttributeDescriptor implements IAttributeDescriptor {
-	private String _attributeName;
-
-	private String _category;
-
-	private String _valueType;
-
-	private String _typeParameter;
-
-	private String _labelString;
-
-	private String _defaultValue;
-
-	private String _description;
-
-	private Map _parameterMap;
-
-	private Map _options;
-
-	private boolean _required;
-
-	/**
-	 * 
-	 */
-	public AttributeDescriptor() {
-		super();
-	}
-
-	/**
-	 * @param attrName
-	 */
-	public AttributeDescriptor(String attrName) {
-		this.setAttributeName(attrName);
-	}
-
-	/**
-	 * @param attributeName
-	 */
-	public void setAttributeName(String attributeName) {
-		this._attributeName = attributeName;
-	}
-
-	/**
-	 * @param category
-	 */
-	public void setCategory(String category) {
-		this._category = category;
-	}
-
-	/**
-	 * @param valueType
-	 */
-	public void setValueType(String valueType) {
-		this._valueType = valueType;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.cm.IAttributeDescriptor#getAttributeName()
-	 */
-	public String getAttributeName() {
-		return _attributeName;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.cm.IAttributeDescriptor#getDescription()
-	 */
-	public String getDescription() {
-		return _description;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.cm.IAttributeDescriptor#getCategory()
-	 */
-	public String getCategory() {
-		return _category;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.cm.IAttributeDescriptor#getValueType()
-	 */
-	public String getValueType() {
-		return _valueType;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.cm.IAttributeDescriptor#getOptions()
-	 */
-	public Map getOptions() {
-		return _options;
-	}
-
-	/**
-	 * @param description
-	 */
-	public void setDescription(String description) {
-		_description = description;
-	}
-
-	/**
-	 * @param map
-	 * @param defaultValue
-	 */
-	public void setOptions(Map map, String defaultValue) {
-		_options = map;
-		_defaultValue = defaultValue;
-	}
-
-	/**
-	 * @return Returns the typeParameter.
-	 */
-	public String getTypeParameter() {
-		return _typeParameter;
-	}
-
-	/**
-	 * @param typeParameter
-	 *            The typeParameter to set.
-	 */
-	public void setTypeParameter(String typeParameter) {
-		this._typeParameter = typeParameter;
-		_parameterMap = null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor#getLabelString()
-	 */
-	public String getLabelString() {
-		if (_labelString == null) {
-			_labelString = StringUtil.splitVariable(getAttributeName());
-		}
-		return _labelString;
-	}
-
-	/**
-	 * @param labelString
-	 *            The labelString to set.
-	 */
-	public void setLabelString(String labelString) {
-		this._labelString = labelString;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor#getParameterByName(java.lang.String)
-	 */
-	public String getParameterByName(String name) {
-		if (_parameterMap == null) {
-			parseParameter();
-		}
-		Object value = _parameterMap.get(name);
-		return value == null ? "" : value.toString();
-	}
-
-	/**
-	 * 
-	 */
-	private void parseParameter() {
-		_parameterMap = new HashMap();
-		if (_typeParameter == null) {
-			return;
-		}
-		StringTokenizer tokenizer = new StringTokenizer(_typeParameter, "||");
-		while (tokenizer.hasMoreTokens()) {
-			String parameterEntry = tokenizer.nextToken();
-			int index = parameterEntry.indexOf('=');
-			if (index != -1) {
-				_parameterMap.put(parameterEntry.substring(0, index),
-						parameterEntry.substring(index + 1));
-			}
-		}
-	}
-
-	public String getDefaultValue() {
-		return _defaultValue;
-	}
-
-	/**
-	 * @param value
-	 */
-	public void setDefaultValue(String value) {
-		_defaultValue = value;
-	}
-
-	public boolean isRequired() {
-		return _required;
-	}
-
-	/**
-	 * @param required
-	 */
-	public void setRequired(boolean required) {
-		this._required = required;
-	}
-	
-	public String toString(){
-		StringBuffer buf = new StringBuffer("AttributeDescriptor: ");
-		buf.append(this.getAttributeName());
-		return buf.toString();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/BindingHandlerDelegate.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/BindingHandlerDelegate.java
deleted file mode 100644
index 9a75e8d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/BindingHandlerDelegate.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.meta;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated
- */
-public class BindingHandlerDelegate implements IBindingHandler {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.IBindingHandler#handleBinding(org.eclipse.swt.widgets.Shell,
-	 *      org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode,
-	 *      org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement,
-	 *      java.lang.String)
-	 */
-	public String handleBinding(Shell shell, IDOMNode ancester,
-			IDOMElement element, String currentValue) {
-		IBindingHandler handler = getDelegatedHandler(ancester, element);
-		if (handler != null) {
-			return handler
-					.handleBinding(shell, ancester, element, currentValue);
-		}
-        return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.IBindingHandler#isEnabled(org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode,
-	 *      org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement)
-	 */
-	// public boolean isEnabled(IDOMNode ancester, IDOMElement element)
-	// {
-	// IBindingHandler handler = getDelegatedHandler(ancester, element);
-	// return (handler == null) ? false : handler.isEnabled(ancester, element);
-	// }
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.IBindingHandler#isEnabled(org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode,
-	 *      org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement,
-	 *      java.lang.String, java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor)
-	 */
-	public boolean isEnabled(IDOMNode ancester, IDOMElement element,
-			String uri, String tagName, IAttributeDescriptor attr) {
-		IBindingHandler handler = getDelegatedHandler(ancester, element);
-		return (handler == null) ? false : handler.isEnabled(ancester, element,
-				uri, tagName, attr);
-	}
-
-//	public boolean isEnabled(IDOMNode ancester, IDOMElement element,
-//			IPropertyPageDescriptor attr) {
-//		IBindingHandler handler = getDelegatedHandler(ancester, element);
-//		return (handler == null) ? false : handler.isEnabled(ancester, element,
-//				attr);
-//	}
-	
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.IBindingHandler#getImage()
-	 */
-	public Image getImage() {
-		return PDPlugin.getDefault().getImage("PD_Binding.gif");
-	}
-
-	public Image getDisabledImage() {
-		return PDPlugin.getDefault().getImage("PD_Binding_disabled.gif");
-	}
-
-	private IBindingHandler getDelegatedHandler(IDOMNode ancester,
-			IDOMElement element) {
-		IProject project = getProject(ancester, element);
-		if (project != null) {
-			Object obj = project.getAdapter(IBindingHandler.class);
-			if (obj instanceof IBindingHandler) {
-				return (IBindingHandler) obj;
-			}
-		}
-
-		return null;
-	}
-
-	private IProject getProject(IDOMNode ancester, IDOMElement element) {
-		IDOMModel model = getModel(ancester, element);
-		if (model != null) {
-			return StructuredModelUtil.getProjectFor(model);
-		}
-        return null;
-	}
-
-	private IDOMModel getModel(IDOMNode ancester, IDOMElement element) {
-		if (ancester != null) {
-			return ancester.getModel();
-		} else if (element != null) {
-			return element.getModel();
-		} else {
-			return null;
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/DefaultEditorCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/DefaultEditorCreator.java
deleted file mode 100644
index 2275079..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/DefaultEditorCreator.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.meta;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.jst.pagedesigner.meta.internal.CellEditorFactoryRegistry;
-import org.eclipse.jst.pagedesigner.ui.dialogfields.DialogFieldWrapper;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DefaultEditorCreator extends EditorCreator {
-	static IPropertyPageDescriptor _staticAttr;
-
-	static IDOMElement _staticElement;
-
-	//static IBindingHandler _staticHandler;
-
-	static CellEditorHolder _staticHolder;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.EditorCreator#createCellEditor(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.jst.pagedesigner.meta.IPropertyPageDescriptor,
-	 *      org.w3c.dom.Element)
-	 */
-	public CellEditor createCellEditor(Composite parent,
-			IPropertyPageDescriptor attr, IDOMElement element) {
-		return CellEditorFactoryRegistry.getInstance().createCellEditor(parent,
-				attr, element);
-	}
-
-//	/*
-//	 * (non-Javadoc)
-//	 * 
-//	 * @see org.eclipse.jst.pagedesigner.meta.EditorCreator#createDialogField(org.eclipse.jst.pagedesigner.meta.IPropertyPageDescriptor)
-//	 */
-//	public DialogField createDialogField(IPropertyPageDescriptor attr) {
-//		return CellEditorFactoryRegistry.getInstance().createDialogField(attr);
-//	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.EditorCreator#createCellEditorWithWrapper(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.jst.pagedesigner.meta.IPropertyPageDescriptor,
-	 *      org.w3c.dom.Element,
-	 *      org.eclipse.jst.pagedesigner.meta.IBindingHandler,
-	 *      org.eclipse.swt.graphics.Image)
-	 */
-	@SuppressWarnings("deprecation")
-    public CellEditor createCellEditorWithWrapper(Composite parent,
-			IPropertyPageDescriptor attr, final IDOMElement element,
-			IBindingHandler handler1) {
-//		final IBindingHandler handler = (handler1 == null ? getSystemDefaultBindingHandler()
-//				: handler1);
-//		String uri = CMUtil.getElementNamespaceURI(element);
-//		String tagName = element.getLocalName();
-		
-		return createCellEditor(parent, attr, element);
-//		
-//		if (!handler.isEnabled(element, element, uri, tagName, attr)) {
-//			// should not enabled, so directly return original cell editor
-//			return createCellEditor(parent, attr, element);
-//		}
-//		try {
-//			// since "createWrappedCellEditor()" and "getBindingImage()" is
-//			// called from the constructor of CellEditorWrapper, at that time,
-//			// can't reference this DefaultEditorCreator and final fields yet,
-//			// so use static variable for it.
-//			_staticAttr = attr;
-//			_staticElement = element;
-//			_staticHandler = handler;
-//
-//			return new CellEditorWrapper(parent) {
-//				/*
-//				 * (non-Javadoc)
-//				 * 
-//				 * @see org.eclipse.jst.pagedesigner.properties.celleditors.CellEditorWrapper#createWrappedCellEditor(org.eclipse.swt.widgets.Composite)
-//				 */
-//				protected CellEditor createWrappedCellEditor(Composite cell) {
-//					return EditorCreator.getInstance().createCellEditor(cell,
-//							_staticAttr, _staticElement);
-//				}
-//
-//				/*
-//				 * (non-Javadoc)
-//				 * 
-//				 * @see org.eclipse.jst.pagedesigner.properties.celleditors.CellEditorWrapper#openDialogBox(org.eclipse.swt.widgets.Control)
-//				 */
-//				protected Object openDialogBox(Control cellEditorWindow) {
-//					return handler.handleBinding(cellEditorWindow.getShell(),
-//							element, element, convertToString(this.getValue()));
-//				}
-//
-//				/*
-//				 * (non-Javadoc)
-//				 * 
-//				 * @see org.eclipse.jst.pagedesigner.properties.celleditors.CellEditorWrapper#getBindingImage()
-//				 */
-//				protected Image getBindingImage() {
-//					return _staticHandler.getImage();
-//				}
-//			};
-//		} finally {
-//			_staticAttr = null;
-//			_staticElement = null;
-//			_staticHandler = null;
-//			_staticHolder = null;
-//		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.EditorCreator#createCellEditorWithWrapper(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.jst.pagedesigner.meta.IPropertyPageDescriptor,
-	 *      org.eclipse.jst.pagedesigner.meta.EditorCreator.CellEditorHolder,
-	 *      org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement,
-	 *      org.eclipse.jst.pagedesigner.meta.IBindingHandler)
-	 */
-	@SuppressWarnings("deprecation")
-    public CellEditor createCellEditorWithWrapper(Composite parent,
-			IPropertyPageDescriptor attr, CellEditorHolder holder,
-			final IDOMElement element, IBindingHandler handler1) {
-//		final IBindingHandler handler = (handler1 == null ? getSystemDefaultBindingHandler()
-//				: handler1);
-//		String uri = CMUtil.getElementNamespaceURI(element);
-//		String tagName = element.getLocalName();
-		
-		return holder.createCellEditor(parent);
-		
-//		if (!handler.isEnabled(element, element, uri, tagName, attr)) {
-//			// should not enabled, so directly return original cell editor
-//			return holder.createCellEditor(parent);
-//		}
-//		try {
-//			// since "createWrappedCellEditor()" and "getBindingImage()" is
-//			// called from the constructor of CellEditorWrapper, at that time,
-//			// can't reference this DefaultEditorCreator and final fields yet,
-//			// so use static variable for it.
-//			_staticElement = element;
-//			_staticHandler = handler;
-//			_staticHolder = holder;
-//
-//			return new CellEditorWrapper(parent) {
-//				/*
-//				 * (non-Javadoc)
-//				 * 
-//				 * @see org.eclipse.jst.pagedesigner.properties.celleditors.CellEditorWrapper#createWrappedCellEditor(org.eclipse.swt.widgets.Composite)
-//				 */
-//				protected CellEditor createWrappedCellEditor(Composite cell) {
-//					return _staticHolder.createCellEditor(cell);
-//				}
-//
-//				/*
-//				 * (non-Javadoc)
-//				 * 
-//				 * @see org.eclipse.jst.pagedesigner.properties.celleditors.CellEditorWrapper#openDialogBox(org.eclipse.swt.widgets.Control)
-//				 */
-//				protected Object openDialogBox(Control cellEditorWindow) {
-//					return handler.handleBinding(cellEditorWindow.getShell(),
-//							element, element, convertToString(this.getValue()));
-//				}
-//
-//				/*
-//				 * (non-Javadoc)
-//				 * 
-//				 * @see org.eclipse.jst.pagedesigner.properties.celleditors.CellEditorWrapper#getBindingImage()
-//				 */
-//				protected Image getBindingImage() {
-//					return _staticHandler.getImage();
-//				}
-//			};
-//		} finally {
-//			_staticAttr = null;
-//			_staticElement = null;
-//			_staticHandler = null;
-//			_staticHolder = null;
-//		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.EditorCreator#createDialogFieldWithWrapper(java.lang.String,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.meta.IPropertyPageDescriptor,
-	 *      org.eclipse.jst.pagedesigner.meta.IBindingHandler)
-	 */
-	@SuppressWarnings("deprecation")
-    public DialogField createDialogFieldWithWrapper(String uri, String tagName,
-			IPropertyPageDescriptor attr, IBindingHandler handler1) {
-		final IBindingHandler handler = (handler1 == null ? getSystemDefaultBindingHandler()
-				: handler1);
-		DialogField field = createDialogField(attr);
-		// if (field instanceof StringButtonDialogField)
-		// {
-		// ((StringButtonDialogField) field).setButtonLabel("...");
-		// }
-		DialogFieldWrapper wrapper = new DialogFieldWrapper(field, handler
-				.getImage(), handler.getDisabledImage(), uri, tagName, attr,
-				handler);
-		wrapper.setDatabindingEnabled(true);
-
-		return wrapper;
-	}
-
-
-//	private String convertToString(Object value) {
-//		if (value == null) {
-//			return null;
-//		}
-//        return value.toString();
-//	}
-
-	@SuppressWarnings("deprecation")
-    @Override
-	public DialogField createDialogFieldWithWrapper(
-			IPropertyPageDescriptor attr, IBindingHandler handler1) {
-		final IBindingHandler handler = (handler1 == null ? getSystemDefaultBindingHandler()
-				: handler1);
-		DialogField field = createDialogField(attr);
-		// if (field instanceof StringButtonDialogField)
-		// {
-		// ((StringButtonDialogField) field).setButtonLabel("...");
-		// }
-		DialogFieldWrapper wrapper = new DialogFieldWrapper(field, handler
-				.getImage(), handler.getDisabledImage(), attr.getUri(), attr.getTagName(), attr,
-				handler);
-		wrapper.setDatabindingEnabled(true);
-
-		return wrapper;
-	}
-
-	@Override
-	public DialogField createDialogField(IPropertyPageDescriptor attr) {
-		return CellEditorFactoryRegistry.getInstance().createDialogField(attr);		
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/EditorCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/EditorCreator.java
deleted file mode 100644
index a6d6bb6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/EditorCreator.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.meta;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public abstract class EditorCreator {
-	static EditorCreator _instance;
-
-	@SuppressWarnings("deprecation")
-    static IBindingHandler _defaultHandler = new BindingHandlerDelegate();
-
-	/**
-	 * 
-	 */
-	public static interface CellEditorHolder {
-		/**
-		 * @param parent
-		 * @return the cell editor
-		 */
-		public CellEditor createCellEditor(Composite parent);
-	}
-
-	/**
-	 * Create a dialog field without databinding using the specified attribute
-	 * descriptor.
-	 * 
-	 * @param attr
-	 * @return DialogField
-	 */
-	public abstract DialogField createDialogField(IPropertyPageDescriptor attr);
-
-	/**
-	 * Create a dialog field that will have databinding support. Basically, this
-	 * method will create a normal dialog field using the attribute descriptor,
-	 * then make a wrapper on it.
-	 * 
-	 * @param uri
-	 *            the namespace uri
-	 * @param tagName
-	 *            the local tag name
-	 * @param attr
-	 * @param handler
-	 *            if null, system default mechanism will be used.
-	 * @return DialogField
-	 */
-	@SuppressWarnings("deprecation")
-    public abstract DialogField createDialogFieldWithWrapper(String uri,
-			String tagName, IPropertyPageDescriptor attr, IBindingHandler handler);
-
-
-	/**
-	 * @param descriptor
-	 * @param handler
-	 * @return the dialog field
-	 */
-	@SuppressWarnings("deprecation")
-    public abstract DialogField createDialogFieldWithWrapper(IPropertyPageDescriptor descriptor, IBindingHandler handler);
-//	
-//	/**
-//	 * Create a dialog field that will have databinding support. Basically, this
-//	 * method will create a normal dialog field using the attribute descriptor,
-//	 * then make a wrapper on it.
-//	 *
-//	 * @param uri
-//	 *            the namespace uri
-//	 * @param tagName
-//	 *            the local tag name
-//	 * @param attrName
-//	 * @param handler
-//	 *            if null, system default mechanism will be used.
-//	 * @return DialogField
-//	 */
-//	public abstract DialogField createDialogFieldWithWrapper(String uri,
-//			String tagName, String attrName, IBindingHandler handler);
-	/**
-	 * Create a cell editor.
-	 * 
-	 * @param parent
-	 * @param attr
-	 * @param element
-	 * @return CellEditor
-	 */
-	public abstract CellEditor createCellEditor(Composite parent,
-			IPropertyPageDescriptor attr, IDOMElement element);
-
-	/**
-	 * Create a cell editor that will have databinding support.
-	 * 
-	 * @param parent
-	 * @param attr
-	 * @param element
-	 * @param handler
-	 *            if null, system default mechanism will be used.
-	 * @return CellEditor
-	 */
-	@SuppressWarnings("deprecation")
-    public abstract CellEditor createCellEditorWithWrapper(Composite parent,
-			IPropertyPageDescriptor attr, IDOMElement element,
-			IBindingHandler handler);
-
-	/**
-	 * Create a cell edtior that will have databinding support. This method
-	 * don't provide an attribute descriptor, but it provide a CellEditorHolder
-	 * to create whatever normal cell editor it wants.
-	 * 
-	 * @param parent
-	 * @param attr
-	 *            could be null
-	 * @param holder
-	 * @param element
-	 * @param handler
-	 *            if null, system default mechanism will be used.
-	 * @return CellEditor
-	 */
-	@SuppressWarnings("deprecation")
-    public abstract CellEditor createCellEditorWithWrapper(Composite parent,
-			IPropertyPageDescriptor attr, CellEditorHolder holder,
-			IDOMElement element, IBindingHandler handler);
-
-	/**
-	 * @return the singleton instance
-	 */
-	public static EditorCreator getInstance() {
-		if (_instance == null) {
-			_instance = new DefaultEditorCreator();
-		}
-		return _instance;
-	}
-
-	/**
-	 * @return the binding handler
-	 */
-	@SuppressWarnings("deprecation")
-    public IBindingHandler getSystemDefaultBindingHandler() {
-		return _defaultHandler;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IAttributeCellEditorFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IAttributeCellEditorFactory.java
deleted file mode 100644
index f3d53c1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IAttributeCellEditorFactory.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.meta;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.swt.widgets.Composite;
-import org.w3c.dom.Element;
-
-/**
- * Factory for creating CellEditors to edit element attributes.
- * 
- * @author mengbo
- * @deprecated - not to be used.   use ITagAttributeCellEditorFactory
- */
-public interface IAttributeCellEditorFactory {
-	/**
-	 * create cell editor
-	 * 
-	 * @param parent
-	 * @param attr
-	 * @param ele
-	 * @return null means failed to create cell editor
-	 */
-	public CellEditor createCellEditor(Composite parent,
-			IAttributeDescriptor attr, Element ele);
-
-	/**
-	 * Normally, the DialogField for an attribute may appear in the following
-	 * places.
-	 * <ol>
-	 * <li>In the Quick Editor properties view, used to edit an element.
-	 * <li>In a dialog to edit an element
-	 * <li>In a dialog, to create an element
-	 * </ol>
-	 * 
-	 * It is the caller's responsibility to add valueChanged listener to the
-	 * dialog field to decide how to apply the value.
-	 * 
-	 * It is also the caller's responsibility to set the initial value of the
-	 * field.
-	 * 
-	 * The field should always be an instanceof <code>ISupportTextValue</code>,
-	 * it could also optionally implement <code>IElementContextable</code>
-	 * 
-	 * @param attr
-	 *            the attribute descriptor, meta data
-	 * @return A dialog field. null means this factory can't create one.
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.ISupportTextValue
-	 */
-	public DialogField createDialogField(IAttributeDescriptor attr);
-
-	/**
-	 * The value types supported by this factory.
-	 * 
-	 * @return null means this factory can behave as default factory.
-	 */
-	public String[] getSupportedValueTypes();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IAttributeDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IAttributeDescriptor.java
deleted file mode 100644
index 2953efe..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IAttributeDescriptor.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.meta;
-
-import java.util.Map;
-
-/**
- * 
- * @author mengbo
- * @deprecated
- */
-public interface IAttributeDescriptor {
-	/**
-	 * suffix
-	 */
-	final String PARAMETER_SUFFIX = "suffix";
-
-	/**
-	 * style
-	 */
-	final String PARAMETER_STYLE = "style";
-
-	/**
-	 * super type
-	 */
-	final String PARAMETER_SUPER_TYPE = "superType";
-
-	/**
-	 * separator
-	 */
-	final String PARAMETER_SEPARATOR = "separator";
-
-	/**
-	 * default
-	 */
-	final String PARAMETER_DEFAULT = "default";
-
-	/**
-	 * get the name of the attribute.
-	 * 
-	 * @return the attribute name
-	 */
-	public String getAttributeName();
-
-	/**
-	 * Returns a brief description of this property. This localized string is
-	 * shown to the user when this property is selected. and it is used as
-	 * tooltip of the property now.
-	 * 
-	 * @return a brief description, or <code>null</code> if none
-	 */
-	public String getDescription();
-
-	/**
-	 * return the category for this attribute.
-	 * 
-	 * @return the category
-	 */
-	public String getCategory();
-
-	/**
-	 * value type is used to construct the cell editor.
-	 * 
-	 * @return the value type
-	 */
-	public String getValueType();
-
-	/**
-	 * Some value type contains additional parameter information. For example,
-	 * if valueType is CLASSNAME, the typeParameter could be super
-	 * interface/super class name.
-	 * 
-	 * NOTE: if valueType is ENUMERATION, caller should use
-	 * <code>getOptions()</code>
-	 * 
-	 * @return null if there is no type parameter.
-	 */
-	public String getTypeParameter();
-
-	/**
-	 * @param name
-	 * @return the parameter
-	 */
-	public String getParameterByName(String name);
-
-	/**
-	 * when the value type is "enumeration", this method will be called to
-	 * construct the drop downlist.
-	 * 
-	 * The Map will be (key->display string)
-	 * 
-	 * @return the options
-	 */
-	public Map getOptions();
-
-	/**
-	 * Gets the default value of Options
-	 * 
-	 * @return the default value
-	 */
-	public String getDefaultValue();
-
-	/**
-	 * A human readable string as the label of the attribute.
-	 * 
-	 * @return the label
-	 */
-	public String getLabelString();
-
-	/**
-	 * Indicate whether the attribute is required.
-	 * 
-	 * @return true if is required
-	 */
-	public boolean isRequired();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IAttributeRuntimeValueType.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IAttributeRuntimeValueType.java
deleted file mode 100644
index 7c3bf3f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IAttributeRuntimeValueType.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.meta;
-
-/**
- * Enumeration of core attribute-value-runtime-types.
- * Not to be implemented by clients.
- */
-public interface IAttributeRuntimeValueType {
-	// shared for html and jsf
-	/**
-	 * 
-	 */
-	static final String prefix1 = "org.eclipse.jst.jsf.core.attributevalues.";
-	/**
-	 * 
-	 */
-	static final String prefix2 = "org.eclipse.jst.pagedesigner.attributevalues.";
-	
-	/**
-	 * 
-	 */
-	public static final String BASE = prefix1+"BaseType";
-	
-	/**
-	 * 
-	 */
-	public static final String CSSSTYLE = prefix1+"CSSStyleType";
-
-	/**
-	 * 
-	 */
-	public static final String CSSCLASS = prefix1+"CSSClassType";
-
-	/**
-	 * 
-	 */
-	public static final String CSSID = prefix1+"CSSIdType";
-
-	/**
-	 * 
-	 */
-	public static final String STRING = prefix1+"StringType";
-
-	/**
-	 * 
-	 */
-	public static final String BOOLEAN = prefix1+"BooleanType";
-
-	/**
-	 * 
-	 */
-	public static final String RELATIVEPATH = prefix1+"RelativePathType";
-
-	/**
-	 * 
-	 */
-	public static final String WEBPATH = prefix1+"WebPathType"; //FIXME
-
-	/**
-	 * 
-	 */
-	public static final String COLOR = prefix1+"ColorType";
-
-//	public static final String NAMED_BOOLEAN = prefix1+"NAMED-BOOLEAN";
-	
-	/**
-	 * 
-	 */
-	public static final String LONG = prefix1+"LongType";
-	
-	/**
-	 * 
-	 */
-	public static final String INTEGER = prefix1+"IntegerType";
-	
-	/**
-	 * 
-	 */
-	public static final String DOUBLE = prefix1+"DoubleType";
-
-	/**
-	 * 
-	 */
-	public static final String METHODBINDING = prefix1+"MethodBindingType";
-
-	/**
-	 * 
-	 */
-	public static final String JAVACLASS = prefix1+"JavaClassType";
-
-	/**
-	 * 
-	 */
-	public static final String SCRIPT = prefix1+"ScriptType";
-
-//	public static final String PROPERTYBINDING = prefix1+"PROPERTYBINDING";
-	
-	/**
-	 * 
-	 */
-	public static final String VALUE = prefix1+"ValueType";
-	
-	/**
-	 * 
-	 */
-	public static final String VALUEBINDING = prefix1+"ValueBindingType";
-
-	/**
-	 * 
-	 */
-	public static final String TIMEZONE = prefix1+"TimeZoneType";
-	
-	/**
-	 * 
-	 */
-	public static final String ACTION = prefix1+"ActionType";
-
-	/**
-	 * 
-	 */
-	public static final String CLASSPATH_RESOURCE = prefix1+"CLASSPATH_RESOURCE";
-
-	/**
-	 * 
-	 */
-	public static final String CURRENCYCODE = prefix1+"CurrencyCodeType";
-
-	/**
-	 * 
-	 */
-	public static final String LINK = prefix1+"LinkType";
-	
-	/**
-	 * 
-	 */
-	public static final String LOCALE = prefix1+"LocaleType";
-
-//	public static final String MULTICHOICE = prefix1+"MULTICHOICE";
-	
-	/**
-	 * 
-	 */
-	public static final String FACESCONFIGIDENTIFIER = prefix1+"FacesConfigIdentifierType";
-	
-	/**
-	 * 
-	 */
-	public static final String FACESCONFIGVALIDATORID = prefix1+"FacesConfigValidatorIDType";
-	
-	/**
-	 * 
-	 */
-	public static final String FACESCONFIGCONVERTERID = prefix1+"FacesConfigConverterIDType";
-	
-	/**
-	 * 
-	 */
-	public static final String COMPONENTBINDING = prefix1+"ComponentBindingType";
-	
-	/**
-	 * 
-	 */
-	public static final String COMPONENTID = prefix1+"ComponentIDType";
-	
-	/**
-	 * 
-	 */
-	public static final String LENGTH = prefix1+"LengthType";
-	
-	/**
-	 * 
-	 */
-	public static final String RESOURCEBUNDLE = prefix1+"ResourceBundleType";
-	
-	/**
-	 * 
-	 */
-	public static final String LANGUAGECODE = prefix1+"LanguageCodeType";
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IBindingHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IBindingHandler.java
deleted file mode 100644
index 514cb41..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IBindingHandler.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.meta;
-
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated
- */
-public interface IBindingHandler {
-	/**
-	 * This handler should open a dialog to accept user input.
-	 * 
-	 * @param shell
-	 * @param ancester
-	 * @param element
-	 * @param currentValue
-	 * @return null means user canceled the operation.
-	 */
-	public String handleBinding(Shell shell, IDOMNode ancester,
-			IDOMElement element, String currentValue);
-
-	/**
-	 * Whether should the binding be enabled for the specified element context.
-	 * element could be null.
-	 * 
-	 * @param ancester
-	 * @param element
-	 * @param uri
-	 * @param tagName
-	 * @param attr
-	 *            could be null.
-	 * @return true if is enabled
-	 */
-	public boolean isEnabled(IDOMNode ancester, IDOMElement element,
-			String uri, String tagName, IAttributeDescriptor attr);
-
-	
-//	public boolean isEnabled(IDOMNode ancester, IDOMElement element,
-//			IPropertyPageDescriptor attr);
-	
-	/**
-	 * given the meta data of an attribute, to see whether should enable binding
-	 * handler for it.
-	 * 
-	 * @param uri
-	 * @param tagName
-	 * @param attr
-	 * @return
-	 */
-	// public boolean isEnabled(String uri, String tagName, IAttributeDescriptor
-	// attr);
-	/**
-	 * Image used for the small button.
-	 * 
-	 * @return the image
-	 */
-	public Image getImage();
-
-	/**
-	 * @return the image indicating disablement
-	 */
-	public Image getDisabledImage();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/ICMRegistry.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/ICMRegistry.java
deleted file mode 100644
index 5c047fe..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/ICMRegistry.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.meta;
-
-/**
- * 
- * @author mengbo
- * @deprecated
- */
-public interface ICMRegistry {
-	/**
-	 * get the URI supported by this registry.
-	 * 
-	 * @return null if this is the global registry that support all the URI.
-	 */
-	public String getSupportedURI();
-
-	/**
-	 * get element descriptor by URI and tagname.
-	 * 
-	 * @param uri
-	 * @param tagname
-	 * @return the element descriptor
-	 */
-	public IElementDescriptor getElementDescriptor(String uri, String tagname);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IElementDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IElementDescriptor.java
deleted file mode 100644
index e16246c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/IElementDescriptor.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.meta;
-
-/**
- * 
- * @author mengbo
- *  * @deprecated
- */
-public interface IElementDescriptor {
-	/**
-	 * get the tagname
-	 * 
-	 * @return the tag name
-	 */
-	public String getTagName();
-
-	/**
-	 * get the namespace URI
-	 * 
-	 * @return te namespace
-	 */
-	public String getNamespaceURI();
-
-	/**
-	 * get all attribute descriptors
-	 * 
-	 * @return the attribute descriptors
-	 */
-	public IAttributeDescriptor[] getAttributeDescriptors();
-
-	/**
-	 * @param attributeName
-	 * @return the attribute by name
-	 */
-	public IAttributeDescriptor getAttributeDescriptor(String attributeName);
-
-	/**
-	 * get attribute descriptor by name
-	 * 
-	 * @param attrname
-	 * @return
-	 */
-	// public IAttributeDescriptor getAttributeDescriptor(String attrname);
-	/**
-	 * get reference. The ElementDescriptor being referenced may provide more
-	 * information. For example, &lt;h:inputText&gt; may reference
-	 * &lt;input&gt;. So those attribute descriptor not provided by
-	 * &lt;h:inputText&gt; could still be provided by &lt;input&gt;.
-	 * 
-	 * @return the reference
-	 */
-	public IElementDescriptor getReference();
-
-	/**
-	 * if this element have eclipse help topic, then could use this method to
-	 * return a context id.
-	 * 
-	 * @return could be null
-	 */
-	public String getHelpContextID();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/ITagAttributeCellEditorFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/ITagAttributeCellEditorFactory.java
deleted file mode 100644
index 363f858..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/ITagAttributeCellEditorFactory.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.meta;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.swt.widgets.Composite;
-import org.w3c.dom.Element;
-
-/**
- * Factory for creating CellEditors and DialogFields to edit element attributes.
- */
-public interface ITagAttributeCellEditorFactory {
-	/**
-	 * create cell editor
-	 * 
-	 * @param parent
-	 * @param attr
-	 * @param ele
-	 * @return null means failed to create cell editor
-	 */
-	public CellEditor createCellEditor(Composite parent,
-			IPropertyPageDescriptor attr, Element ele);
-
-	/**
-	 * Normally, the DialogField for an attribute may appear in the following
-	 * places.
-	 * <ol>
-	 * <li>In the Quick Editor properties view, used to edit an element.
-	 * <li>In a dialog to edit an element
-	 * <li>In a dialog, to create an element
-	 * </ol>
-	 * 
-	 * It is the caller's responsibility to add valueChanged listener to the
-	 * dialog field to decide how to apply the value.
-	 * 
-	 * It is also the caller's responsibility to set the initial value of the
-	 * field.
-	 * 
-	 * The field should always be an instanceof <code>ISupportTextValue</code>,
-	 * it could also optionally implement <code>IElementContextable</code>
-	 * 
-	 * @param attr
-	 *            the attribute descriptor, meta data
-	 * @return A dialog field. null means this factory can't create one.
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.ISupportTextValue
-	 */
-	public DialogField createDialogField(IPropertyPageDescriptor attr);
-
-	/**
-	 * The attribute runtime value types supported by this factory.
-	 * 
-	 * @return null means this factory can behave as default factory.
-	 */
-	public String[] getSupportedValueTypes();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/OLDIValueType.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/OLDIValueType.java
deleted file mode 100644
index e702a15..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/OLDIValueType.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.meta;
-
-/**
- * All value types will be upcased.
- * 
- * @author mengbo
- * @deprecated
- */
-public interface OLDIValueType {
-	// shared for html and jsf
-	/**
-	 * 
-	 */
-	public static final String CSSSTYLE = "CSSSTYLE";
-
-	/**
-	 * 
-	 */
-	public static final String CSSCLASS = "CSSCLASS";
-
-	/**
-	 * 
-	 */
-	public static final String CSSID = "CSSID";
-
-	/**
-	 * 
-	 */
-	public static final String ENUMERATED = "ENUMERATED";
-
-	/**
-	 * 
-	 */
-	public static final String BOOLEAN = "BOOLEAN";
-
-	/**
-	 * 
-	 */
-	public static final String RELATIVEPATH = "RELATIVEPATH";
-
-	/**
-	 * 
-	 */
-	public static final String WEBPATH = "WEBPATH";
-
-	/**
-	 * 
-	 */
-	public static final String COLOR = "COLOR";
-
-	/**
-	 * 
-	 */
-	public static final String NAMED_BOOLEAN = "NAMED-BOOLEAN";
-
-	// for jsf only
-	/**
-	 * 
-	 */
-	public static final String METHODBINDING = "METHODBINDING";
-
-	/**
-	 * 
-	 */
-	public static final String CLASSNAME = "CLASSNAME";
-
-	// new types
-	/**
-	 * 
-	 */
-	public static final String LINK = "LINK";
-
-	/**
-	 * 
-	 */
-	public static final String JAVASCRIPT = "JAVASCRIPT";
-
-	/**
-	 * 
-	 */
-	public static final String PROPERTYBINDING = "PROPERTYBINDING";
-
-	/**
-	 * 
-	 */
-	public static final String TIMEZONE = "TIMEZONE";
-
-	/**
-	 * 
-	 */
-	public static final String CLASSPATH_RESOURCE = "CLASSPATH_RESOURCE";
-
-	/**
-	 * 
-	 */
-	public static final String CURRENCYCODE = "CURRENCYCODE";
-
-	/**
-	 * 
-	 */
-	public static final String LOCALE = "LOCALE";
-
-	/**
-	 * 
-	 */
-	public static final String MULTICHOICE = "MULTICHOICE";
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/XXXEditorCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/XXXEditorCreator.java
deleted file mode 100644
index ec1bf2c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/XXXEditorCreator.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.pagedesigner.meta;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.jst.pagedesigner.meta.internal.XXXDefaultEditorCreator;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated 
- * will be deleted  (was EditorCreator)
- */
-public abstract class XXXEditorCreator {
-	static XXXEditorCreator _instance;
-
-	static IBindingHandler _defaultHandler = new BindingHandlerDelegate();
-
-	/**
-	 * Cell editor holder
-	 *
-	 */
-	public static interface CellEditorHolder {
-		/**
-		 * @param parent
-		 * @return the cell editor
-		 */
-		public CellEditor createCellEditor(Composite parent);
-	}
-
-	/**
-	 * Create a dialog field without databinding using the specified attribute
-	 * descriptor.
-	 * 
-	 * @param attr
-	 * @return DialogField
-	 */
-	public abstract DialogField createDialogField(IAttributeDescriptor attr);
-
-	/**
-	 * Create a dialog field that will have databinding support. Basically, this
-	 * method will create a normal dialog field using the attribute descriptor,
-	 * then make a wrapper on it.
-	 * 
-	 * @param uri
-	 *            the namespace uri
-	 * @param tagName
-	 *            the local tag name
-	 * @param attr
-	 * @param handler
-	 *            if null, system default mechanism will be used.
-	 * @return DialogField
-	 */
-	public abstract DialogField createDialogFieldWithWrapper(String uri,
-			String tagName, IAttributeDescriptor attr, IBindingHandler handler);
-
-	/**
-	 * @param descriptor
-	 * @param handler
-	 * @return the dialog field
-	 */
-	public abstract DialogField createDialogFieldWithWrapper(IPropertyPageDescriptor descriptor, IBindingHandler handler);
-//	
-//	/**
-//	 * Create a dialog field that will have databinding support. Basically, this
-//	 * method will create a normal dialog field using the attribute descriptor,
-//	 * then make a wrapper on it.
-//	 * 
-//	 * @param uri
-//	 *            the namespace uri
-//	 * @param tagName
-//	 *            the local tag name
-//	 * @param attrName
-//	 * @param handler
-//	 *            if null, system default mechanism will be used.
-//	 * @return DialogField
-//	 */
-//	public abstract DialogField createDialogFieldWithWrapper(String uri,
-//			String tagName, String attrName, IBindingHandler handler);
-	/**
-	 * Create a cell editor.
-	 * 
-	 * @param parent
-	 * @param attr
-	 * @param element
-	 * @return CellEditor
-	 */
-	public abstract CellEditor createCellEditor(Composite parent,
-			IAttributeDescriptor attr, IDOMElement element);
-
-	/**
-	 * Create a cell editor that will have databinding support.
-	 * 
-	 * @param parent
-	 * @param attr
-	 * @param element
-	 * @param handler
-	 *            if null, system default mechanism will be used.
-	 * @return CellEditor
-	 */
-	public abstract CellEditor createCellEditorWithWrapper(Composite parent,
-			IAttributeDescriptor attr, IDOMElement element,
-			IBindingHandler handler);
-
-	/**
-	 * Create a cell edtior that will have databinding support. This method
-	 * don't provide an attribute descriptor, but it provide a CellEditorHolder
-	 * to create whatever normal cell editor it wants.
-	 * 
-	 * @param parent
-	 * @param attr
-	 *            could be null
-	 * @param holder
-	 * @param element
-	 * @param handler
-	 *            if null, system default mechanism will be used.
-	 * @return CellEditor
-	 */
-	public abstract CellEditor createCellEditorWithWrapper(Composite parent,
-			IAttributeDescriptor attr, CellEditorHolder holder,
-			IDOMElement element, IBindingHandler handler);
-
-	/**
-	 * @return the singleton instance
-	 */
-	public static XXXEditorCreator getInstance() {
-		if (_instance == null) {
-			_instance = new XXXDefaultEditorCreator();
-		}
-		return _instance;
-	}
-
-	/**
-	 * @return the binding handler
-	 */
-	public IBindingHandler getSystemDefaultBindingHandler() {
-		return _defaultHandler;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/CMRegistry.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/CMRegistry.java
deleted file mode 100644
index d231517..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/CMRegistry.java
+++ /dev/null
@@ -1,235 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.meta.internal;
-
-import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.xml.parsers.FactoryConfigurationError;
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.IJMTConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.meta.ICMRegistry;
-import org.eclipse.jst.pagedesigner.meta.IElementDescriptor;
-import org.osgi.framework.Bundle;
-import org.xml.sax.SAXException;
-
-/**
- * XXX: temp implementation. In the future, will need add more things to allow
- * other plugins to contribute things.
- * 
- * @author mengbo
- * @deprecated
- */
-public class CMRegistry implements ICMRegistry {
-	static Logger _log = PDPlugin.getLogger(CMRegistry.class);
-
-	private Map _htmlMap = new HashMap();
-
-	private Map _jspMap = new HashMap();
-
-	private List _contributedRegistries = new ArrayList();
-
-	private static CMRegistry _instance = null;
-
-	/**
-	 * @return the singleton instance
-	 */
-	public static CMRegistry getInstance() {
-		if (_instance == null) {
-			_instance = new CMRegistry();
-		}
-		return _instance;
-	}
-
-	/**
-	 * 
-	 */
-	private CMRegistry() {
-		ProgressMonitorDialog progress = new ProgressMonitorDialog(null);
-		try {
-			progress.run(true, false, new IRunnableWithProgress() {
-				public void run(IProgressMonitor monitor)
-						throws InvocationTargetException {
-					try {
-						monitor
-								.beginTask(
-										PDPlugin
-												.getResourceString("CMRegistry.ReadConfigration"),
-										IProgressMonitor.UNKNOWN);
-						monitor
-								.subTask(PDPlugin
-										.getResourceString("CMRegistry.HTMLConfigration"));
-						loadCM("configs/cm/html.xml", _htmlMap);
-						monitor
-								.subTask(PDPlugin
-										.getResourceString("CMRegistry.JSPConfigration"));
-						loadCM("configs/cm/jsp.xml", _jspMap);
-						monitor
-								.subTask(PDPlugin
-										.getResourceString("CMRegistry.OtherConfigration"));
-						readExtensions();
-					} finally {
-						monitor.done();
-					}
-				}
-			});
-		} catch (InvocationTargetException e) {
-			// ignore
-		} catch (InterruptedException e) {
-			// ignore
-		}
-	}
-
-	/**
-	 * 
-	 */
-	private void readExtensions() {
-		IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
-				.getExtensionPoint(PDPlugin.getPluginId(),
-						IJMTConstants.EXTENSION_POINT_CMREGISTRY);
-		IConfigurationElement[] eles = extensionPoint
-				.getConfigurationElements();
-
-		for (int i = 0; i < eles.length; i++) {
-			if (eles[i].getName().equals("registry")) {
-				String uri = eles[i].getAttribute("uri");
-				if (uri == null || uri.length() == 0) {
-					// no uri, skip
-					continue;
-				}
-				String configFile = eles[i].getAttribute("configFile");
-				if (configFile != null && configFile.length() > 0) {
-					String bundleName = eles[i].getDeclaringExtension()
-							.getContributor().getName();
-					try {
-						Bundle bundle = Platform.getBundle(bundleName);
-						URL cmFileUrl = bundle.getEntry(configFile);
-						SimpleCMRegistry reg = new SimpleCMRegistry(uri,
-								cmFileUrl);
-						_contributedRegistries.add(reg);
-					} catch (ParserConfigurationException e) {
-                        PDPlugin.getLogger(getClass()).error(new Throwable(e));
-                    } catch (FactoryConfigurationError e) {
-                        PDPlugin.getLogger(getClass()).error(new Throwable(e));                    
-                    } catch (SAXException e) {
-                        PDPlugin.getLogger(getClass()).error(new Throwable(e));
-                    } catch (IOException e) {
-                        PDPlugin.getLogger(getClass()).error(new Throwable(e));
-                    }
-				}
-				String className = eles[i].getAttribute("class");
-				if (className != null && className.length() > 0) {
-					try {
-						Object obj = eles[i].createExecutableExtension("class");
-
-						if (obj instanceof ICMRegistry) {
-							_contributedRegistries.add(obj);
-						}
-					} catch (CoreException e) {
-					    PDPlugin.getLogger(getClass()).error(new Throwable(e));
-					}
-				}
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.ICMRegistry#getSupportedURI()
-	 */
-	public String getSupportedURI() {
-		return null;
-	}
-
-	private void loadCM(String fileName, Map map) {
-		try {
-			URL url = PDPlugin.getDefault().getBundle().getEntry(fileName);
-			ElementDescReader reader = new ElementDescReader(url);
-			reader.readElements(map);
-		} catch (Exception e) {
-			_log.error("Error loading " + fileName + ": " + e.getMessage());
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.cm.ICMRegistry#getElementDescriptor(java.lang.String,
-	 *      java.lang.String)
-	 */
-	public IElementDescriptor getElementDescriptor(String uri, String tagname) {
-		if (uri == null) {
-			uri = ITLDConstants.URI_HTML;
-		}
-		if (ITLDConstants.URI_HTML.equals(uri)) {
-			IElementDescriptor desc = getHTMLElementDescriptor(tagname);
-			if (desc != null) {
-				return desc;
-			}
-		}
-		if (ITLDConstants.URI_JSP.equals(uri)) {
-			return getJSPElementDescriptor(tagname);
-		}
-		for (int i = 0, size = _contributedRegistries.size(); i < size; i++) {
-			ICMRegistry reg = (ICMRegistry) _contributedRegistries.get(i);
-			if (uri.equals(reg.getSupportedURI())) {
-				IElementDescriptor ret = reg.getElementDescriptor(uri, tagname);
-				if (ret != null) {
-					return ret;
-				}
-			}
-		}
-
-		return null;
-	}
-
-	private IElementDescriptor getHTMLElementDescriptor(String tagname) {
-		return (IElementDescriptor) _htmlMap.get(tagname.toLowerCase());
-	}
-
-	private IElementDescriptor getJSPElementDescriptor(String tagname) {
-		return (IElementDescriptor) _jspMap.get(tagname.toLowerCase());
-	}
-	
-	/**
-	 * @return list of {@link ICMRegistry}
-	 */
-	public List<ICMRegistry> getRegistries() {
-		List<ICMRegistry> ret = new ArrayList<ICMRegistry>(_contributedRegistries);
-		ret.add(this);
-		return ret;
-	}
-	
-	/**
-	 * call to free up memory used
-	 */
-	public void unloadRegistry(){
-		_instance = null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/CategoryNameComparator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/CategoryNameComparator.java
deleted file mode 100644
index 2a438b3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/CategoryNameComparator.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.meta.internal;
-
-import java.util.Comparator;
-import java.util.HashSet;
-
-/**
- * Sorts categories and ensures that @see{ITabbedPropertiesConstants.OTHER_CATEGORY} comes last
- * @author mengbo
- */
-public class CategoryNameComparator implements Comparator {
-	static HashSet _pairs = new HashSet();
-
-	private final static CategoryNameComparator _instance = new CategoryNameComparator();
-
-	static class Pair {
-		String s1;
-
-		String s2;
-
-		Pair(String a, String b) {
-			s1 = a;
-			s2 = b;
-		}
-
-		public int hashCode() {
-			return s1.hashCode() + s2.hashCode();
-		}
-
-		public boolean equals(Object o) {
-			if (o instanceof Pair) {
-				Pair p = (Pair) o;
-				return s1.equals(p.s1) && s2.equals(p.s2);
-			}
-			return false;
-		}
-	}
-
-	/**
-	 * @param s1
-	 * @param s2
-	 */
-	public static void addPair(String s1, String s2) {
-		_pairs.add(new Pair(s1, s2));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
-	 */
-	public int compare(Object o1, Object o2) {
-		if (o1.equals(o2))
-			return 0;
-
-		//Below code sorted OTHER category ("Attributes") to the bottom
-		//Commenting out as it just looks strange
-//		if (ITabbedPropertiesConstants.OTHER_CATEGORY.equals(o1))
-//			return 1;
-//		if (ITabbedPropertiesConstants.OTHER_CATEGORY.equals(o2))
-//			return -1;
-
-//		Pair p = new Pair((String) o1, (String) o2);
-//		if (_pairs.contains(p))
-//			return -1;
-		return ((String)o1).compareTo(((String)o2));
-	}
-
-	/**
-	 * @return the instance
-	 */
-	public static CategoryNameComparator getInstance() {
-		return _instance;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/CellEditorFacRegistryReader.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/CellEditorFacRegistryReader.java
deleted file mode 100644
index 36b9ac2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/CellEditorFacRegistryReader.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.meta.internal;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.pagedesigner.IJMTConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.meta.ITagAttributeCellEditorFactory;
-
-/**
- * Read the registry to find out all the CellEditorFactory.
- * 
- * @author mengbo
- */
-public class CellEditorFacRegistryReader {
-	static ITagAttributeCellEditorFactory[] _factories = null;
-
-	/**
-	 * @return ITagAttributeCellEditorFactory[]
-	 */
-	public static synchronized ITagAttributeCellEditorFactory[] getAllFactories() {
-		if (_factories == null) {
-			_factories = readAllFactories();
-		}
-		return _factories;
-
-	}
-
-	private static ITagAttributeCellEditorFactory[] readAllFactories() {
-		List result = new ArrayList();
-		IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
-				.getExtensionPoint(PDPlugin.getPluginId(),
-						IJMTConstants.EXTENSION_POINT_PAGEDESIGNER);
-		IExtension[] extensions = extensionPoint.getExtensions();
-
-		for (int i = 0; i < extensions.length; i++) {
-			IExtension ext = extensions[i];
-			IConfigurationElement[] facs = ext.getConfigurationElements();
-
-			for (int j = 0; j < facs.length; j++) {
-				if (facs[j].getName().equals(
-						IJMTConstants.TAG_ATTRIBUTE_CELLEDITOR_FACTORY)) {
-					Object obj;
-					try {
-						obj = facs[j].createExecutableExtension("class");
-
-						if (obj instanceof ITagAttributeCellEditorFactory) {
-							result.add(obj);
-						}
-					} catch (CoreException e) {
-						// ignore the exception
-						e.printStackTrace();
-					}
-				}
-			}
-		}
-		ITagAttributeCellEditorFactory[] ret = new ITagAttributeCellEditorFactory[result
-				.size()];
-		result.toArray(ret);
-		return ret;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/CellEditorFactoryRegistry.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/CellEditorFactoryRegistry.java
deleted file mode 100644
index 2435800..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/CellEditorFactoryRegistry.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.meta.internal;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ISupportTextValue;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.jst.pagedesigner.meta.ITagAttributeCellEditorFactory;
-import org.eclipse.jst.pagedesigner.properties.celleditors.CellEditorFactory;
-import org.eclipse.swt.widgets.Composite;
-import org.w3c.dom.Element;
-
-/**
- * CellEditorFactoryRegistry also read information from plugin.xml extension to
- * allow other plugins to contribute new kinds of cell editors.
- * 
- */
-public class CellEditorFactoryRegistry {
-//	private static final Logger _log = PDPlugin
-//			.getLogger(CellEditorFactoryRegistry.class);
-
-	private static CellEditorFactoryRegistry _instance;
-
-	private Map _factoryMap = new HashMap();
-
-	private List _defaultFactories = new ArrayList();
-
-	/**
-	 * @return singleton CellEditorFactoryRegistry
-	 */
-	public static CellEditorFactoryRegistry getInstance() {
-		if (_instance == null) {
-			_instance = new CellEditorFactoryRegistry();
-		}
-		return _instance;
-	}
-
-	private CellEditorFactoryRegistry() {
-		ITagAttributeCellEditorFactory[] facs = CellEditorFacRegistryReader
-				.getAllFactories();
-		if (facs != null) {
-			for (int i = 0; i < facs.length; i++) {
-				addCellEditorFactory(facs[i]);
-			}
-		}
-		addCellEditorFactory(new CellEditorFactory());
-	}
-
-	/**
-	 * @param fac
-	 */
-	public void addCellEditorFactory(ITagAttributeCellEditorFactory fac) {
-		String[] types = fac.getSupportedValueTypes();
-		if (types == null || types.length == 0) {
-			_defaultFactories.add(fac);
-		} else {
-			for (int i = 0; i < types.length; i++) {
-				_factoryMap.put(types[i], fac);
-			}
-		}
-	}
-
-	/**
-	 * Return cell editor for attribute based upon runtime value type
-	 * @param parent
-	 * @param attr
-	 * @param element
-	 * @return CellEditor
-	 */
-	public CellEditor createCellEditor(Composite parent,
-			IPropertyPageDescriptor attr, Element element) {
-		String type = attr.getValueType();
-		if (type == null || type.length() == 0)
-			return null;
-
-		CellEditor result = null;
-		ITagAttributeCellEditorFactory fac = (ITagAttributeCellEditorFactory) _factoryMap
-				.get(type);
-		
-		if (fac != null) {
-			result = fac.createCellEditor(parent, attr, element);
-		}
-		if (result == null) {
-			for (int i = 0, size = _defaultFactories.size(); i < size; i++) {
-				result = ((ITagAttributeCellEditorFactory) _defaultFactories
-						.get(i)).createCellEditor(parent, attr, element);
-				if (result != null)
-					break;
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @param attr
-	 * @return DialogField
-	 */
-	public DialogField createDialogField(IPropertyPageDescriptor attr) {
-		String type = attr.getValueType();
-		if (type == null || type.length() == 0) {
-			DialogField result = createTextDialogField(attr);
-			result.setLabelText(attr.getLabel()); //labelProvider???
-			return result;
-		}
-//		type = type.toUpperCase();
-
-		DialogField result = null;
-		ITagAttributeCellEditorFactory fac = (ITagAttributeCellEditorFactory) _factoryMap
-				.get(type);
-		if (fac != null) {
-			result = fac.createDialogField(attr);
-		}
-		if (result == null) {
-			for (int i = 0, size = _defaultFactories.size(); i < size; i++) {
-				result = ((ITagAttributeCellEditorFactory) _defaultFactories
-						.get(i)).createDialogField(attr);
-				if (result != null) {
-					break;
-				}
-			}
-		}
-		if (result == null) {
-			result = createTextDialogField(attr);
-		}
-		if (!(result instanceof ISupportTextValue)) {
-			result = createTextDialogField(attr);
-		}
-//		result.setLabelText(attr.getLabel() + ":"); //$NON-NLS-1$
-		return result;
-	}
-
-	/**
-	 * @param attr
-	 * @return DialogField
-	 */
-	public DialogField createTextDialogField(IPropertyPageDescriptor attr) {
-		StringDialogField field = new StringDialogField();
-		field.setLabelText(attr.getLabel());
-		field.setRequired(attr.isRequired());
-		field.setToolTip(attr.getDescription());
-		return field;
-	}
-//	/**
-//	 * This is NOT a product method. It should only be used by testing code.
-//	 * 
-//	 * @return String[] of value types
-//	 */
-//	public String[] getAllValueTypes() {
-//		//FIXME
-//		Set valueTypes = new HashSet();
-//		for (Iterator iter = _factoryMap.values().iterator(); iter.hasNext();) {
-//			ITagAttributeCellEditorFactory fac = (ITagAttributeCellEditorFactory) iter
-//					.next();
-//			String[] supportedTypes = fac.getSupportedValueTypes();
-//
-//			if (supportedTypes != null) {
-//				for (int i = 0; i < supportedTypes.length; i++) {
-//					valueTypes.add(supportedTypes[i]);
-//				}
-//			}
-//		}
-//		// add those default ones.
-//		Field[] fields = OLDIValueType.class.getFields();
-//		for (int i = 0; i < fields.length; i++) {
-//			int modifiers = fields[i].getModifiers();
-//			if (Modifier.isStatic(modifiers) && Modifier.isFinal(modifiers)) {
-//				if (fields[i].getType() == String.class) {
-//					try {
-//						valueTypes.add(fields[i].get(null));
-//					} catch (IllegalArgumentException ex) {
-//						// "Error in fields retrieving:"
-//						_log.info("CellEditorFactoryRegistry.Info.2", ex); //$NON-NLS-1$
-//					} catch (IllegalAccessException ex) {
-//						// "Error in fields retrieving:"
-//						_log.info("CellEditorFactoryRegistry.Info.3", ex); //$NON-NLS-1$
-//					}
-//				}
-//			}
-//		}
-//		String[] ret = new String[valueTypes.size()];
-//		valueTypes.toArray(ret);
-//		return ret;
-//	}
-
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/ElementDescReader.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/ElementDescReader.java
deleted file mode 100644
index b0c970a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/ElementDescReader.java
+++ /dev/null
@@ -1,445 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.meta.internal;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.PropertyResourceBundle;
-import java.util.ResourceBundle;
-import java.util.Set;
-import java.util.StringTokenizer;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.FactoryConfigurationError;
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.ResourceUtils;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.meta.AttributeDescriptor;
-import org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.SAXException;
-
-/**
- * Used by Sybase CMConfig model loader
- * @author mengbo
- * @deprecated
- */
-public class ElementDescReader {
-	private static Logger _log = PDPlugin.getLogger(ElementDescReader.class);
-
-	private Map _definedCategoryMap = new HashMap();
-
-	private Map _definedAttributeMap = new HashMap();
-
-	private URL _url;
-
-	private String[] _optimizedLocales = null;
-
-	/**
-	 * @param url
-	 */
-	public ElementDescReader(URL url) {
-		this._url = url;
-	}
-
-	/**
-	 * Read xml information and fill the map
-	 * 
-	 * @param map
-	 * @throws ParserConfigurationException
-	 * @throws FactoryConfigurationError
-	 * @throws SAXException
-	 * @throws IOException
-	 */
-	public void readElements(Map map) throws ParserConfigurationException,
-			FactoryConfigurationError, SAXException, IOException {
-		DocumentBuilder builder = DocumentBuilderFactory.newInstance()
-				.newDocumentBuilder();
-		
-		InputStream stream = null; 
-		Document doc = null;
-		try
-		{
-			stream = this._url.openStream();
-			doc = builder.parse(stream);
-		}
-		finally
-		{
-			ResourceUtils.ensureClosed(stream);
-		}
-
-		Element taglib = doc.getDocumentElement();
-		String nameSpace = taglib.getAttribute("uri");
-
-		NodeList list = doc.getElementsByTagName("tag");
-		if (list != null && list.getLength() != 0) {
-			int size = list.getLength();
-			for (int i = 0; i < size; i++) {
-				Element tag = (Element) list.item(i);
-				ElementDescriptor desc = new ElementDescriptor();
-				desc.setTagName(tag.getAttribute("name"));
-				desc.setNamespaceURI(nameSpace);
-
-				// support for help context id.
-				desc.setHelpContextID(tag.getAttribute("helpContextId"));
-
-				NodeList children = tag.getChildNodes();
-				// first calculate category and refered category quantity
-				NodeList cateNodes = tag.getElementsByTagName("category");
-				NodeList referedCateNodes = tag
-						.getElementsByTagName("referedcategory");
-				int cateNum = 0;
-				if (cateNodes != null) {
-					cateNum += cateNodes.getLength();
-				}
-				if (referedCateNodes != null) {
-					cateNum += referedCateNodes.getLength();
-				}
-
-				if (cateNum > 0) {
-					int length = children.getLength();
-					String[] cates = new String[cateNum];
-					List attrList = new ArrayList();
-					int realCate = 0;
-					for (int j = 0; j < length; j++) {
-						Node node = children.item(j);
-						if (node.getNodeType() == Node.ELEMENT_NODE) {
-							Element element = (Element) node;
-							String tagName = element.getTagName();
-							if ("category".equals(tagName)
-									|| "referedcategory".equals(tagName)) {
-								String categoryName = element
-										.getAttribute("name");
-								if (categoryName != null
-										&& !"".equals(categoryName)) {
-									cates[realCate++] = categoryName;
-									parseCategory(element, element, attrList);
-								} else {
-									Element definedCategory = handleReference(
-											doc, element, true);
-									String labelKey = definedCategory
-											.getAttribute("displaylabel");
-									if (labelKey != null
-											&& !"".equals(labelKey)) {
-										cates[realCate++] = getValue(labelKey);
-									} else {
-										cates[realCate++] = calculateDisplayLabel(definedCategory);
-									}
-
-									parseCategory(element, definedCategory,
-											attrList);
-								}
-							}
-						}
-
-					}
-
-					// for sort categories
-					for (int m = 0, len = cates.length; m < len; m++) {
-						for (int j = m + 1; j < len; j++) {
-							CategoryNameComparator.addPair(cates[m], cates[j]);
-						}
-					}
-					desc.setAttributeDescriptors(attrList);
-				}
-
-				map.put(desc.getTagName(), desc);
-			}
-		}
-	}
-
-	private String calculateDisplayLabel(Element definedElement) {
-		String label = definedElement.getAttribute("displaylabel");
-		return getValue(label);
-	}
-
-	private void parseCategory(Element category, Element definedCategory,
-			List attrList) {
-		String cateLabel = calculateDisplayLabel(definedCategory);
-		// if the category is a referedcategory tag
-		if (category != definedCategory) {
-			String labelKey = category.getAttribute("displaylabel");
-			if (labelKey != null && !"".equals(labelKey)) {
-				cateLabel = getValue(labelKey);
-			}
-		}
-		handleAttributes(definedCategory, cateLabel, attrList);
-		if (category == definedCategory) {
-			return;
-		}
-
-		// the category should be a referedcategory tag
-		// include/add more attributes to category
-		NodeList includes = category.getElementsByTagName("includeattrs");
-		if (includes != null && includes.getLength() != 0) {
-			Element includeAttrsTag = (Element) includes.item(0);
-			handleAttributes(includeAttrsTag, cateLabel, attrList);
-
-			// handle attribute override
-			HashMap tempMap = new HashMap();
-			Iterator itor = attrList.iterator();
-			while (itor.hasNext()) {
-				AttributeDescriptor adp = (AttributeDescriptor) itor.next();
-				tempMap.put(adp.getAttributeName(), adp);
-			}
-			int listSize = attrList.size();
-			int mapSize = tempMap.size();
-			if (listSize != mapSize) {
-				attrList.clear();
-				Set set = tempMap.keySet();
-				Iterator setor = set.iterator();
-				while (setor.hasNext()) {
-					String atName = (String) setor.next();
-					AttributeDescriptor ad = (AttributeDescriptor) tempMap
-							.get(atName);
-					attrList.add(ad);
-				}
-			}
-
-		}
-
-		// exclude attributes from category
-		NodeList excludes = category.getElementsByTagName("excludeattrs");
-		if (excludes != null && excludes.getLength() != 0) {
-			String displayNames = ((Element) excludes.item(0))
-					.getAttribute("refs");
-			StringTokenizer tokenizer = new StringTokenizer(displayNames, ", ");
-
-			while (tokenizer.hasMoreTokens()) {
-				String name = tokenizer.nextToken();
-				Iterator itr = attrList.iterator();
-				while (itr.hasNext()) {
-					IAttributeDescriptor atr = (IAttributeDescriptor) itr
-							.next();
-					String atrName = atr.getAttributeName();
-					if (name.equals(atrName)) {
-						attrList.remove(atr);
-						break;
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * handle all attribute element and referedattribute element under the root
-	 * element
-	 * 
-	 * @param root
-	 * @param cateLabel
-	 * @param list
-	 */
-	private void handleAttributes(Element root, String cateLabel, List attrList) {
-		NodeList allNodes = root.getChildNodes();
-		NodeList attrNodes = root.getElementsByTagName("attribute");
-		NodeList referedattrNodes = root
-				.getElementsByTagName("referedattribute");
-		int attrNum = 0;
-		if (attrNodes != null) {
-			attrNum += attrNodes.getLength();
-		}
-		if (referedattrNodes != null) {
-			attrNum += referedattrNodes.getLength();
-		}
-
-		if (attrNum > 0) {
-			int incAttrLength = allNodes.getLength();
-			for (int i = 0; i < incAttrLength; i++) {
-				Node node = allNodes.item(i);
-				if (node.getNodeType() == Node.ELEMENT_NODE) {
-					Element incAttr = (Element) node;
-					String tagName = incAttr.getTagName();
-					if ("attribute".equals(tagName)
-							|| "referedattribute".equals(tagName)) {
-						String incAtrName = incAttr.getAttribute("name");
-						Element refAttr = incAttr;
-						if (incAtrName == null || "".equals(incAtrName)) {
-							incAttr = handleReference(root.getOwnerDocument(),
-									incAttr, false);
-						}
-						AttributeDescriptor attrDesc = parseAttribute(
-								cateLabel, incAttr);
-						String overrideName = refAttr
-								.getAttribute("overridename");
-						if (overrideName != null
-								&& !"".equalsIgnoreCase(overrideName)) {
-							attrDesc.setAttributeName(overrideName);
-						}
-						String ovDisplayLabel = refAttr
-								.getAttribute("displaylabel");
-						if (ovDisplayLabel != null
-								&& !"".equalsIgnoreCase(ovDisplayLabel)) {
-							attrDesc.setLabelString(getValue(ovDisplayLabel));
-						}
-						attrList.add(attrDesc);
-					}
-
-				}
-
-			}
-		}
-	}
-
-	private Element handleReference(Document doc, Element refElment,
-			boolean isCategory) {
-		String refName = refElment.getAttribute("ref");
-		if (isCategory) {
-			if (_definedCategoryMap.get(refName) != null) {
-				Element definedCategory = (Element) _definedCategoryMap
-						.get(refName);
-				return definedCategory;
-			}
-		} else {
-			if (_definedAttributeMap.get(refName) != null) {
-				Element definedAttribute = (Element) _definedAttributeMap
-						.get(refName);
-				return definedAttribute;
-			}
-		}
-
-		NodeList catgs = null;
-		if (isCategory) {
-			NodeList defineCates = doc.getElementsByTagName("categories");
-			Element firstCate = (Element) defineCates.item(0);
-			catgs = firstCate.getElementsByTagName("category");
-		} else {
-			NodeList defineCates = doc.getElementsByTagName("attributes");
-			Element firstCate = (Element) defineCates.item(0);
-			catgs = firstCate.getElementsByTagName("attribute");
-		}
-		int cateLen = catgs.getLength();
-		Element definedElement = null;
-		for (int n = 0; n < cateLen; n++) {
-			String cateName = ((Element) catgs.item(n)).getAttribute("name");
-			if (refName.equals(cateName) && !"".equals(refName)) {
-				definedElement = (Element) catgs.item(n);
-				break;
-			}
-		}
-		if (isCategory) {
-			_definedCategoryMap.put(refName, definedElement);
-		} else {
-			_definedAttributeMap.put(refName, definedElement);
-		}
-		return definedElement;
-	}
-
-	private AttributeDescriptor parseAttribute(String categoryName,
-			Element attribute) {
-		AttributeDescriptor attrDesc = new AttributeDescriptor();
-		attrDesc.setCategory(categoryName);
-
-		attrDesc.setAttributeName(attribute.getAttribute("name"));
-		attrDesc.setDescription(attribute.getAttribute("description"));
-		attrDesc.setValueType(attribute.getAttribute("type"));
-		attrDesc.setRequired(attribute.hasAttribute("required"));
-		attrDesc.setTypeParameter(attribute.getAttribute("typeparam"));
-		String labelKey = attribute.getAttribute("displaylabel");
-		attrDesc.setLabelString(getValue(labelKey));
-
-		NodeList optionNodes = attribute.getElementsByTagName("option");
-		if (optionNodes != null && optionNodes.getLength() != 0) {
-			HashMap optionMap = new HashMap();
-			int opLength = optionNodes.getLength();
-			String defaultValue = null;
-			for (int m = 0; m < opLength; m++) {
-				Element optNode = (Element) optionNodes.item(m);
-				String key = optNode.getAttribute("key");
-				String value = optNode.getAttribute("value");
-				if (value == null || value.length() == 0) {
-					value = key;
-				}
-				if (optNode.hasAttribute("default")) {
-					defaultValue = value;
-				}
-				optionMap.put(key, value);
-			}
-			attrDesc.setOptions(optionMap, defaultValue);
-		}
-
-		return attrDesc;
-	}
-
-	private String getValue(String key) {
-		if (key != null && key.startsWith("%")) {
-			String cmStr = this._url.toString();
-			String propBaseStr = cmStr.substring(0, cmStr.lastIndexOf("."));
-
-			String[] localeOptions = LocaleFallback.fallBack(Locale
-					.getDefault());
-			String[] options = localeOptions;
-			if (_optimizedLocales != null) {
-				options = _optimizedLocales;
-			}
-			for (int i = 0, size = options.length; i < size; i++) {
-				StringBuffer sb = new StringBuffer();
-				sb.append(propBaseStr);
-				sb.append(options[i]);
-				sb.append(".properties");
-				String str = sb.toString();
-
-				ResourceBundle rb = null;
-				try {
-					URL propUrl = new URL(str);
-					rb = new PropertyResourceBundle(propUrl.openStream());
-				} catch (Exception e1) {
-					// we don't handle the exception here,since it is in a
-					// fallback route,it is possible of not exist
-					// _log.info("Info.ElementDescReader.ReadPropertyFile",
-					// str);
-					continue;
-				}
-				if (_optimizedLocales == null) {
-					setOptimizedLocales(localeOptions, i);
-				}
-
-				String rbKey = key.substring(1);
-				String value = null;
-				try {
-					value = rb.getString(rbKey);
-				} catch (Exception e) {
-					_log.info("Info.ElementDescReader.ReadPropertyFile.Key",
-							rbKey, str, null);
-					continue;
-				}
-
-				if (value != null) {
-					return value;
-				}
-
-			}
-			return null;
-		}
-		return key;
-	}
-
-	private void setOptimizedLocales(String[] originalLocales, int startPoint) {
-		int size = originalLocales.length - startPoint;
-		_optimizedLocales = new String[size];
-		for (int i = 0; i < size; i++) {
-			_optimizedLocales[i] = originalLocales[i + startPoint];
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/ElementDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/ElementDescriptor.java
deleted file mode 100644
index 91dd59c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/ElementDescriptor.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.meta.internal;
-
-import java.util.List;
-
-import org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor;
-import org.eclipse.jst.pagedesigner.meta.IElementDescriptor;
-
-/**
- * @author mengbo
- * @deprecated 
- */
-public class ElementDescriptor implements IElementDescriptor {
-	String _tagName;
-
-	String _namespaceURI;
-
-	IAttributeDescriptor[] _attrs;
-
-	private String _helpContextID;
-
-	/**
-	 * 
-	 */
-	public ElementDescriptor() {
-		super();
-		// TODO Auto-generated constructor stub
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.cm.IElementDescriptor#getTagName()
-	 */
-	public String getTagName() {
-		return _tagName;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.cm.IElementDescriptor#getNamespaceURI()
-	 */
-	public String getNamespaceURI() {
-		return _namespaceURI;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.cm.IElementDescriptor#getAttributeDescriptors()
-	 */
-	public IAttributeDescriptor[] getAttributeDescriptors() {
-		return _attrs;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.cm.IElementDescriptor#getReference()
-	 */
-	public IElementDescriptor getReference() {
-		return null;
-	}
-
-	/**
-	 * @param namespaceURI
-	 */
-	public void setNamespaceURI(String namespaceURI) {
-		this._namespaceURI = namespaceURI;
-	}
-
-	/**
-	 * @param tagName
-	 */
-	public void setTagName(String tagName) {
-		this._tagName = tagName;
-	}
-
-	/**
-	 * @param attrs
-	 */
-	public void setAttributeDescriptors(List attrs) {
-		if (attrs == null || attrs.isEmpty()) {
-			_attrs = new IAttributeDescriptor[0];
-		} else {
-			_attrs = new IAttributeDescriptor[attrs.size()];
-			attrs.toArray(_attrs);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.IElementDescriptor#getAttributeDescriptor(java.lang.String)
-	 */
-	public IAttributeDescriptor getAttributeDescriptor(String attributeName) {
-		if (_attrs != null) {
-			for (int i = 0; i < _attrs.length; i++) {
-				IAttributeDescriptor descriptor = _attrs[i];
-				if (descriptor.getAttributeName().equalsIgnoreCase(
-						attributeName)) {
-					return descriptor;
-				}
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.IElementDescriptor#getHelpContextID()
-	 */
-	public String getHelpContextID() {
-		return _helpContextID;
-	}
-
-	/**
-	 * @param contextid
-	 */
-	public void setHelpContextID(String contextid) {
-		_helpContextID = contextid;
-	}
-	
-	public String toString(){
-		StringBuffer buf = new StringBuffer("ElementDescriptor: ");
-		buf.append(this.getTagName()).append("(").append(this.getNamespaceURI()).append(")");
-		return buf.toString();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/LocaleFallback.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/LocaleFallback.java
deleted file mode 100644
index d99b6d5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/LocaleFallback.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.meta.internal;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated 
- */
-public class LocaleFallback {
-	private static Map map = new HashMap();
-
-	/**
-	 * @param locale
-	 * @return the list of local values
-	 */
-	public static synchronized String[] fallBack(Locale locale) {
-		if (map.get(locale) != null) {
-			return (String[]) map.get(locale);
-		}
-		// first compute the fallback locales according to the input locale
-		List inputLocaleList = calculateLocaleNames(locale);
-		String[] ins = reverseList(inputLocaleList);
-		// then compute the fallback locales accroding to the system default
-		// locale
-		int defsSize = 0;
-		String[] defs = null;
-		if (!locale.equals(Locale.getDefault())) {
-			List defLocaleList = calculateLocaleNames(Locale.getDefault());
-			defs = reverseList(defLocaleList);
-			defsSize = defs.length;
-		}
-
-		int insSize = ins.length;
-		int size = insSize + defsSize;
-
-		String[] options = new String[size + 1];
-		for (int i = 0; i < size; i++) {
-			if (i < insSize) {
-				options[i] = ins[i];
-			} else {
-				options[i] = defs[i - insSize];
-			}
-		}
-		// last add blank string in order to search the base file
-		options[size] = "";
-		map.put(locale, options);
-
-		return options;
-
-	}
-
-	private static List calculateLocaleNames(Locale locale) {
-		List list = new ArrayList();
-		StringBuffer item;
-
-		String language = locale.getLanguage();
-		String country = locale.getCountry();
-		String variant = locale.getVariant();
-
-		int languageLength = language.length();
-		int countryLength = country.length();
-		int variantLength = variant.length();
-
-		if (languageLength == 0 && countryLength == 0 && variantLength == 0) {
-			// The locale is "", "", "".
-			return list;
-		}
-        item = new StringBuffer();
-        item = item.append('_').append(language);
-        list.add(item.toString());
-
-		if (countryLength == 0 && variantLength == 0) {
-			return list;
-		}
-        item.append('_').append(country);
-        list.add(item.toString());
-
-		if (variantLength == 0) {
-			return list;
-		}
-        item.append('_').append(variantLength);
-        list.add(item.toString());
-
-		return list;
-	}
-
-	private static String[] reverseList(List list) {
-		int size = list.size();
-		String[] vals = new String[size];
-		for (int i = 0; i < size; i++) {
-			vals[i] = (String) list.get(size - 1 - i);
-		}
-		return vals;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/SimpleCMRegistry.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/SimpleCMRegistry.java
deleted file mode 100644
index 5d4e73f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/SimpleCMRegistry.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.meta.internal;
-
-import java.io.IOException;
-import java.net.URL;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.xml.parsers.FactoryConfigurationError;
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.eclipse.jst.pagedesigner.meta.ICMRegistry;
-import org.eclipse.jst.pagedesigner.meta.IElementDescriptor;
-import org.xml.sax.SAXException;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-@SuppressWarnings("deprecation")
-public class SimpleCMRegistry implements ICMRegistry {
-	String _uri;
-
-	Map _map = new HashMap();
-
-	/**
-	 * @param uri 
-	 * @param cmFileUrl 
-	 * @throws IOException
-	 * @throws SAXException
-	 * @throws FactoryConfigurationError
-	 * @throws ParserConfigurationException
-	 * 
-	 */
-	public SimpleCMRegistry(String uri, URL cmFileUrl)
-			throws ParserConfigurationException, FactoryConfigurationError,
-			SAXException, IOException {
-		this._uri = uri;
-		ElementDescReader reader = new ElementDescReader(cmFileUrl);
-		reader.readElements(_map);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.ICMRegistry#getSupportedURI()
-	 */
-	public String getSupportedURI() {
-		return _uri;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.ICMRegistry#getElementDescriptor(java.lang.String,
-	 *      java.lang.String)
-	 */
-	public IElementDescriptor getElementDescriptor(String uri, String tagname) {
-		if (uri.equals(_uri)) {
-			return (IElementDescriptor) _map.get(tagname);
-		}
-		return null;
-	}
-	
-	/**
-	 * @return an unmodifiable map of the registry
-	 */
-	public Map getMap(){
-		return Collections.unmodifiableMap(_map);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/XXXCellEditorFacRegistryReader.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/XXXCellEditorFacRegistryReader.java
deleted file mode 100644
index b8cab33..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/XXXCellEditorFacRegistryReader.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.meta.internal;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.pagedesigner.IJMTConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.meta.IAttributeCellEditorFactory;
-
-/**
- * Read the registry to find out all the CellEditorFactory.
- * 
- * @author mengbo
- * will be deleted
- */
-@SuppressWarnings("deprecation")
-public class XXXCellEditorFacRegistryReader {
-	static IAttributeCellEditorFactory[] _factories = null;
-
-	/**
-	 * @return the factories
-	 */
-	public static synchronized IAttributeCellEditorFactory[] getAllFactories() {
-		if (_factories == null) {
-			_factories = readAllFactories();
-		}
-		return _factories;
-
-	}
-
-	private static IAttributeCellEditorFactory[] readAllFactories() {
-		List result = new ArrayList();
-		IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
-				.getExtensionPoint(PDPlugin.getPluginId(),
-						IJMTConstants.EXTENSION_POINT_PAGEDESIGNER);
-		IExtension[] extensions = extensionPoint.getExtensions();
-
-		for (int i = 0; i < extensions.length; i++) {
-			IExtension ext = extensions[i];
-			IConfigurationElement[] facs = ext.getConfigurationElements();
-
-			for (int j = 0; j < facs.length; j++) {
-				if (facs[j].getName().equals(
-						IJMTConstants.ATTRIBUTE_CELLEDITOR_FACTORY)) {
-//					facs[j].getAttribute("class");
-					Object obj;
-					try {
-						obj = facs[j].createExecutableExtension("class");
-
-						if (obj instanceof IAttributeCellEditorFactory) {
-							result.add(obj);
-						}
-					} catch (CoreException e) {
-						// ignore the exception
-						e.printStackTrace();
-					}
-				}
-			}
-		}
-		IAttributeCellEditorFactory[] ret = new IAttributeCellEditorFactory[result
-				.size()];
-		result.toArray(ret);
-		return ret;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/XXXCellEditorFactoryRegistry.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/XXXCellEditorFactoryRegistry.java
deleted file mode 100644
index d55c586..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/XXXCellEditorFactoryRegistry.java
+++ /dev/null
@@ -1,293 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.meta.internal;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-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.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ISupportTextValue;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.jst.pagedesigner.meta.IAttributeCellEditorFactory;
-import org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor;
-import org.eclipse.jst.pagedesigner.meta.OLDIValueType;
-import org.eclipse.jst.pagedesigner.properties.celleditors.OLDCellEditorFactory;
-import org.eclipse.swt.widgets.Composite;
-import org.w3c.dom.Element;
-
-/**
- * CellEditorFactoryRegistry also read information from plugin.xml extension to
- * allow other plugins to contribute new kinds of cell editors.
- * 
- * @author mengbo
- * will be deleted
- */
-@SuppressWarnings("deprecation")
-public class XXXCellEditorFactoryRegistry {
-	private static final Logger _log = PDPlugin
-			.getLogger(XXXCellEditorFactoryRegistry.class);
-
-	private static XXXCellEditorFactoryRegistry _instance;
-
-	private Map _factoryMap = new HashMap();
-
-	private List _defaultFactories = new ArrayList();
-
-	/**
-	 * @return the singleton registry instance
-	 */
-	public static XXXCellEditorFactoryRegistry getInstance() {
-		if (_instance == null) {
-			_instance = new XXXCellEditorFactoryRegistry();
-		}
-		return _instance;
-	}
-
-	private XXXCellEditorFactoryRegistry() {
-		IAttributeCellEditorFactory[] facs = XXXCellEditorFacRegistryReader
-				.getAllFactories();
-		if (facs != null) {
-			for (int i = 0; i < facs.length; i++) {
-				addCellEditorFactory(facs[i]);
-			}
-		}
-		addCellEditorFactory(new OLDCellEditorFactory());
-	}
-
-	/**
-	 * @param fac
-	 */
-	public void addCellEditorFactory(IAttributeCellEditorFactory fac) {
-		String[] types = fac.getSupportedValueTypes();
-		if (types == null || types.length == 0) {
-			_defaultFactories.add(fac);
-		} else {
-			for (int i = 0; i < types.length; i++) {
-				_factoryMap.put(types[i].toUpperCase(), fac);
-			}
-		}
-	}
-
-	/**
-	 * @param parent
-	 * @param attr
-	 * @param element
-	 * @return the cell editor
-	 */
-	public CellEditor createCellEditor(Composite parent,
-			IAttributeDescriptor attr, Element element) {
-		String type = attr.getValueType();
-		if (type == null || type.length() == 0)
-			return null;
-		type = type.toUpperCase();
-
-		CellEditor result = null;
-		IAttributeCellEditorFactory fac = (IAttributeCellEditorFactory) _factoryMap
-				.get(type);
-		if (fac != null) {
-			result = fac.createCellEditor(parent, attr, element);
-		}
-		if (result == null) {
-			for (int i = 0, size = _defaultFactories.size(); i < size; i++) {
-				result = ((IAttributeCellEditorFactory) _defaultFactories
-						.get(i)).createCellEditor(parent, attr, element);
-				if (result != null)
-					break;
-			}
-		}
-		return result;
-	}
-	
-	/**
-	 * @param parent
-	 * @param attr
-	 * @param element
-	 * @return the cell editor
-	 */
-	public CellEditor createCellEditor(Composite parent,
-			IPropertyPageDescriptor attr, Element element) {
-//		String type = attr.getValueType();
-//		if (type == null || type.length() == 0)
-//			return null;
-//		type = type.toUpperCase();
-
-		CellEditor result = null;
-	result = new TextCellEditor(parent);
-//		IAttributeCellEditorFactory fac = (IAttributeCellEditorFactory) _factoryMap
-//				.get(type);
-//		if (fac != null) {
-//			result = fac.createCellEditor(parent, attr, element);
-//		}
-//		if (result == null) {
-//			for (int i = 0, size = _defaultFactories.size(); i < size; i++) {
-//				result = ((IAttributeCellEditorFactory) _defaultFactories
-//						.get(i)).createCellEditor(parent, attr, element);
-//				if (result != null)
-//					break;
-//			}
-//		}
-		return result;
-	}
-
-	/**
-	 * @param attr
-	 * @return DialogField
-	 */
-	public DialogField createDialogField(IAttributeDescriptor attr) {
-		String type = attr.getValueType();
-		if (type == null || type.length() == 0) {
-			DialogField result = createTextDialogField(attr);
-			result.setLabelText(attr.getLabelString() + ":"); //$NON-NLS-1$
-			return result;
-		}
-		type = type.toUpperCase();
-
-		DialogField result = null;
-		IAttributeCellEditorFactory fac = (IAttributeCellEditorFactory) _factoryMap
-				.get(type);
-		if (fac != null) {
-			result = fac.createDialogField(attr);
-		}
-		if (result == null) {
-			for (int i = 0, size = _defaultFactories.size(); i < size; i++) {
-				result = ((IAttributeCellEditorFactory) _defaultFactories
-						.get(i)).createDialogField(attr);
-				if (result != null) {
-					break;
-				}
-			}
-		}
-		if (result == null) {
-			result = createTextDialogField(attr);
-		}
-		if (!(result instanceof ISupportTextValue)) {
-			result = createTextDialogField(attr);
-		}
-		result.setLabelText(attr.getLabelString() + ":"); //$NON-NLS-1$
-		return result;
-	}
-
-	/**
-	 * @param attr
-	 * @return the dialog field
-	 */
-	public DialogField createDialogField(IPropertyPageDescriptor attr) {
-		String type = attr.getValueType();
-		if (type == null || type.length() == 0) {
-			DialogField result = createTextDialogField(attr);
-			result.setLabelText(attr.getLabel()); //labelProvider???
-			return result;
-		}
-		type = type.toUpperCase();
-
-		DialogField result = null;
-//		IAttributeCellEditorFactory fac = (IAttributeCellEditorFactory) _factoryMap
-//				.get(type);
-//		if (fac != null) {
-//			result = fac.createDialogField(attr);
-//		}
-//		if (result == null) {
-//			for (int i = 0, size = _defaultFactories.size(); i < size; i++) {
-//				result = ((IAttributeCellEditorFactory) _defaultFactories
-//						.get(i)).createDialogField(attr);
-//				if (result != null) {
-//					break;
-//				}
-//			}
-//		}
-//		if (result == null) {
-			result = createTextDialogField(attr);
-//		}
-		if (!(result instanceof ISupportTextValue)) {
-			result = createTextDialogField(attr);
-		}
-//		result.setLabelText(attr.getLabel() + ":"); //$NON-NLS-1$
-		return result;
-	}
-	/**
-	 * @param attr
-	 * @return DialogField
-	 */
-	public DialogField createTextDialogField(IAttributeDescriptor attr) {
-		StringDialogField field = new StringDialogField();
-		field.setLabelText(attr.getLabelString());
-		field.setRequired(attr.isRequired());
-		field.setToolTip(attr.getDescription());
-		return field;
-	}
-
-	/**
-	 * @param attr
-	 * @return DialogField
-	 */
-	public DialogField createTextDialogField(IPropertyPageDescriptor attr) {
-		StringDialogField field = new StringDialogField();
-		field.setLabelText(attr.getLabel());
-		field.setRequired(attr.isRequired());
-		field.setToolTip(attr.getDescription());
-		return field;
-	}
-	/**
-	 * This is NOT a product method. It should only be used by testing code.
-	 * 
-	 * @return String[] of value types
-	 */
-	public String[] getAllValueTypes() {
-		Set valueTypes = new HashSet();
-		for (Iterator iter = _factoryMap.values().iterator(); iter.hasNext();) {
-			IAttributeCellEditorFactory fac = (IAttributeCellEditorFactory) iter
-					.next();
-			String[] supportedTypes = fac.getSupportedValueTypes();
-
-			if (supportedTypes != null) {
-				for (int i = 0; i < supportedTypes.length; i++) {
-					valueTypes.add(supportedTypes[i]);
-				}
-			}
-		}
-		// add those default ones.
-		Field[] fields = OLDIValueType.class.getFields();
-		for (int i = 0; i < fields.length; i++) {
-			int modifiers = fields[i].getModifiers();
-			if (Modifier.isStatic(modifiers) && Modifier.isFinal(modifiers)) {
-				if (fields[i].getType() == String.class) {
-					try {
-						valueTypes.add(fields[i].get(null));
-					} catch (IllegalArgumentException ex) {
-						// "Error in fields retrieving:"
-						_log.info("CellEditorFactoryRegistry.Info.2", ex); //$NON-NLS-1$
-					} catch (IllegalAccessException ex) {
-						// "Error in fields retrieving:"
-						_log.info("CellEditorFactoryRegistry.Info.3", ex); //$NON-NLS-1$
-					}
-				}
-			}
-		}
-		String[] ret = new String[valueTypes.size()];
-		valueTypes.toArray(ret);
-		return ret;
-	}
-
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/XXXDefaultEditorCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/XXXDefaultEditorCreator.java
deleted file mode 100644
index 1facad9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/meta/internal/XXXDefaultEditorCreator.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.meta.internal;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor;
-import org.eclipse.jst.pagedesigner.meta.IBindingHandler;
-import org.eclipse.jst.pagedesigner.meta.XXXEditorCreator;
-import org.eclipse.jst.pagedesigner.properties.celleditors.CellEditorWrapper;
-import org.eclipse.jst.pagedesigner.ui.dialogfields.DialogFieldWrapper;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- * will be deleted
- */
-@SuppressWarnings("deprecation")
-public class XXXDefaultEditorCreator extends XXXEditorCreator {
-	static IAttributeDescriptor _staticAttr;
-
-	static IDOMElement _staticElement;
-
-	static IBindingHandler _staticHandler;
-
-	static CellEditorHolder _staticHolder;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.EditorCreator#createCellEditor(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor,
-	 *      org.w3c.dom.Element)
-	 */
-	public CellEditor createCellEditor(Composite parent,
-			IAttributeDescriptor attr, IDOMElement element) {
-		return XXXCellEditorFactoryRegistry.getInstance().createCellEditor(parent,
-				attr, element);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.EditorCreator#createDialogField(org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor)
-	 */
-	public DialogField createDialogField(IAttributeDescriptor attr) {
-		return XXXCellEditorFactoryRegistry.getInstance().createDialogField(attr);
-	}
-	
-	/**
-	 * @param attr
-	 * @return the dialog field
-	 */
-	public DialogField createDialogField(IPropertyPageDescriptor attr) {
-		return XXXCellEditorFactoryRegistry.getInstance().createDialogField(attr);
-	}
-	
-	
-
-//	/*
-//	 * (non-Javadoc)
-//	 * 
-//	 * @see org.eclipse.jst.pagedesigner.meta.EditorCreator#createDialogField(org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor)
-//	 */
-//	public DialogField createDialogField(IAttributeDescriptor attr) {
-//		return XXXCellEditorFactoryRegistry.getInstance().createDialogField(attr);
-//	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.EditorCreator#createCellEditorWithWrapper(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor,
-	 *      org.w3c.dom.Element,
-	 *      org.eclipse.jst.pagedesigner.meta.IBindingHandler,
-	 *      org.eclipse.swt.graphics.Image)
-	 */
-	public CellEditor createCellEditorWithWrapper(Composite parent,
-			IAttributeDescriptor attr, final IDOMElement element,
-			IBindingHandler handler1) {
-		final IBindingHandler handler = (handler1 == null ? getSystemDefaultBindingHandler()
-				: handler1);
-		String uri = CMUtil.getElementNamespaceURI(element);
-		String tagName = element.getLocalName();
-		if (!handler.isEnabled(element, element, uri, tagName, attr)) {
-			// should not enabled, so directly return original cell editor
-			return createCellEditor(parent, attr, element);
-		}
-		try {
-			// since "createWrappedCellEditor()" and "getBindingImage()" is
-			// called from the constructor of CellEditorWrapper, at that time,
-			// can't reference this XXXDefaultEditorCreator and final fields yet,
-			// so use static variable for it.
-			_staticAttr = attr;
-			_staticElement = element;
-			_staticHandler = handler;
-
-			return new CellEditorWrapper(parent) {
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.jst.pagedesigner.properties.celleditors.CellEditorWrapper#createWrappedCellEditor(org.eclipse.swt.widgets.Composite)
-				 */
-				protected CellEditor createWrappedCellEditor(Composite cell) {
-					return XXXEditorCreator.getInstance().createCellEditor(cell,
-							_staticAttr, _staticElement);
-				}
-
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.jst.pagedesigner.properties.celleditors.CellEditorWrapper#openDialogBox(org.eclipse.swt.widgets.Control)
-				 */
-				protected Object openDialogBox(Control cellEditorWindow) {
-					return handler.handleBinding(cellEditorWindow.getShell(),
-							element, element, convertToString(this.getValue()));
-				}
-
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.jst.pagedesigner.properties.celleditors.CellEditorWrapper#getBindingImage()
-				 */
-				protected Image getBindingImage() {
-					return _staticHandler.getImage();
-				}
-			};
-		} finally {
-			_staticAttr = null;
-			_staticElement = null;
-			_staticHandler = null;
-			_staticHolder = null;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.EditorCreator#createCellEditorWithWrapper(org.eclipse.swt.widgets.Composite,
-	 *      org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor,
-	 *      org.eclipse.jst.pagedesigner.meta.EditorCreator.CellEditorHolder,
-	 *      org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement,
-	 *      org.eclipse.jst.pagedesigner.meta.IBindingHandler)
-	 */
-	public CellEditor createCellEditorWithWrapper(Composite parent,
-			IAttributeDescriptor attr, CellEditorHolder holder,
-			final IDOMElement element, IBindingHandler handler1) {
-		final IBindingHandler handler = (handler1 == null ? getSystemDefaultBindingHandler()
-				: handler1);
-		String uri = CMUtil.getElementNamespaceURI(element);
-		String tagName = element.getLocalName();
-		if (!handler.isEnabled(element, element, uri, tagName, attr)) {
-			// should not enabled, so directly return original cell editor
-			return holder.createCellEditor(parent);
-		}
-		try {
-			// since "createWrappedCellEditor()" and "getBindingImage()" is
-			// called from the constructor of CellEditorWrapper, at that time,
-			// can't reference this XXXDefaultEditorCreator and final fields yet,
-			// so use static variable for it.
-			_staticElement = element;
-			_staticHandler = handler;
-			_staticHolder = holder;
-
-			return new CellEditorWrapper(parent) {
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.jst.pagedesigner.properties.celleditors.CellEditorWrapper#createWrappedCellEditor(org.eclipse.swt.widgets.Composite)
-				 */
-				protected CellEditor createWrappedCellEditor(Composite cell) {
-					return _staticHolder.createCellEditor(cell);
-				}
-
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.jst.pagedesigner.properties.celleditors.CellEditorWrapper#openDialogBox(org.eclipse.swt.widgets.Control)
-				 */
-				protected Object openDialogBox(Control cellEditorWindow) {
-					return handler.handleBinding(cellEditorWindow.getShell(),
-							element, element, convertToString(this.getValue()));
-				}
-
-				/*
-				 * (non-Javadoc)
-				 * 
-				 * @see org.eclipse.jst.pagedesigner.properties.celleditors.CellEditorWrapper#getBindingImage()
-				 */
-				protected Image getBindingImage() {
-					return _staticHandler.getImage();
-				}
-			};
-		} finally {
-			_staticAttr = null;
-			_staticElement = null;
-			_staticHandler = null;
-			_staticHolder = null;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.EditorCreator#createDialogFieldWithWrapper(java.lang.String,
-	 *      java.lang.String,
-	 *      org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor,
-	 *      org.eclipse.jst.pagedesigner.meta.IBindingHandler)
-	 */
-	public DialogField createDialogFieldWithWrapper(String uri, String tagName,
-			IAttributeDescriptor attr, IBindingHandler handler1) {
-		final IBindingHandler handler = (handler1 == null ? getSystemDefaultBindingHandler()
-				: handler1);
-		DialogField field = createDialogField(attr);
-		// if (field instanceof StringButtonDialogField)
-		// {
-		// ((StringButtonDialogField) field).setButtonLabel("...");
-		// }
-		DialogFieldWrapper wrapper = new DialogFieldWrapper(field, handler
-				.getImage(), handler.getDisabledImage(), uri, tagName, attr,
-				handler);
-		wrapper.setDatabindingEnabled(true);
-
-		return wrapper;
-	}
-
-
-	private String convertToString(Object value) {
-		if (value == null) {
-			return null;
-		}
-        return value.toString();
-	}
-
-	@Override
-	public DialogField createDialogFieldWithWrapper(
-			IPropertyPageDescriptor attr, IBindingHandler handler1) {
-		final IBindingHandler handler = (handler1 == null ? getSystemDefaultBindingHandler()
-				: handler1);
-		DialogField field = createDialogField(attr);
-		// if (field instanceof StringButtonDialogField)
-		// {
-		// ((StringButtonDialogField) field).setButtonLabel("...");
-		// }
-		DialogFieldWrapper wrapper = new DialogFieldWrapper(field, handler
-				.getImage(), handler.getDisabledImage(), attr.getUri(), attr.getTagName(), attr,
-				handler);
-		wrapper.setDatabindingEnabled(true);
-
-		return wrapper;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/CSSStyleAdapterFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/CSSStyleAdapterFactory.java
deleted file mode 100644
index 1ba1fd0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/CSSStyleAdapterFactory.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.parts;
-
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.style.AbstractStyle;
-import org.eclipse.wst.sse.core.internal.provisional.AbstractAdapterFactory;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class CSSStyleAdapterFactory extends AbstractAdapterFactory {
-	static Class ADAPTERKEY = ICSSStyle.class;
-
-	// TODO: dead? private static CSSStyleAdapterFactory _instance = new CSSStyleAdapterFactory();
-
-	private CSSStyleAdapterFactory() {
-		super(ADAPTERKEY, 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 Element) {
-			return new AbstractStyle((Element) target);
-		}
-        return null;
-	}
-
-	/**
-	 * @return the factory instance
-	 */
-	public static CSSStyleAdapterFactory getInstance() {
-        // TODO: this 'singleton' is broken
-		return new CSSStyleAdapterFactory();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/DocumentEditPart.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/DocumentEditPart.java
deleted file mode 100644
index 71a4214..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/DocumentEditPart.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.parts;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.FlowPage;
-import org.eclipse.wst.css.core.internal.event.ICSSStyleListener;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSModel;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSSelector;
-import org.eclipse.wst.html.core.internal.htmlcss.StyleListener;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- */
-public class DocumentEditPart extends NodeEditPart implements StyleListener,
-		ICSSStyleListener {
-	boolean _refreshing = false;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractEditPart#getModelChildren()
-	 */
-	protected List getModelChildren() {
-		List list = new ArrayList();
-		Node model = (Node) getModel();
-		if (model == null) {
-			return list;
-		}
-
-		NodeList children1 = model.getChildNodes();
-		for (int i = 0, n = children1.getLength(); i < n; i++) {
-			Node node = children1.item(i);
-			if (node.getNodeType() != Node.TEXT_NODE
-					&& node.getNodeType() != Node.ELEMENT_NODE) {
-				continue;
-			}
-			list.add(node);
-		}
-		return list;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure()
-	 */
-	protected IFigure createFigure() {
-		FlowPage f = new FlowPage();
-		return f;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#notifyChanged(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier,
-	 *      int, java.lang.Object, java.lang.Object, java.lang.Object, int)
-	 */
-	public void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-		refresh();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#refresh()
-	 */
-	public void refresh() {
-		if (_refreshing) {
-			return;
-		}
-		_refreshing = true;
-		try {
-			super.refresh();
-		} finally {
-			_refreshing = false;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractEditPart#refreshChildren()
-	 */
-	protected void refreshChildren() {
-		super.refreshChildren();
-		List children1 = getChildren();
-		for (int i = 0, size = children1.size(); i < size; i++) {
-			((EditPart) children1.get(i)).refresh();
-		}
-	}
-
-	// protected void removeChildVisual(EditPart childEditPart)
-	// {
-	// if (childEditPart instanceof SubNodeEditPart)
-	// {
-	// Node node = ((SubNodeEditPart) childEditPart).getNodeForFigure();
-	// if (node != null)
-	// {
-	// getDestDocumentForDesign().removeChild(node);
-	// }
-	// }
-	// super.removeChildVisual(childEditPart);
-	// }
-	//    
-	// protected void addChildVisual(EditPart childEditPart, int index)
-	// {
-	// if (childEditPart instanceof SubNodeEditPart)
-	// {
-	// Node node = ((SubNodeEditPart) childEditPart).getNodeForFigure();
-	// if (node != null)
-	// {
-	// NodeList nodeList = getDestDocumentForDesign().getChildNodes();
-	// if (nodeList.getLength() > index)
-	// {
-	// getDestDocumentForDesign().insertBefore(node, nodeList.item(index));
-	// }
-	// else
-	// {
-	// getDestDocumentForDesign().appendChild(node);
-	// }
-	// }
-	// }
-	// super.addChildVisual(childEditPart, index);
-	// }
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.html.core.internal.htmlcss.StyleListener#styleChanged()
-	 */
-	public void styleChanged() {
-		// refresh the whole document when style change (<style> or <link>)
-		this.refreshStyle();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.css.core.internal.event.ICSSStyleListener#styleChanged(org.eclipse.wst.css.core.internal.provisional.document.ICSSModel,
-	 *      org.eclipse.wst.css.core.document.ICSSSelector[],
-	 *      org.eclipse.wst.css.core.document.ICSSSelector[], java.lang.String)
-	 */
-	public void styleChanged(ICSSModel srcModel, ICSSSelector[] removed,
-			ICSSSelector[] added, String media) {
-		if ((removed != null && removed.length > 0) || added != null
-				&& added.length > 0) {
-			this.refreshStyle();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.css.core.internal.event.ICSSStyleListener#styleUpdate(org.eclipse.wst.css.core.internal.provisional.document.ICSSModel)
-	 */
-	public void styleUpdate(ICSSModel srcModel) {
-		this.refreshStyle();
-	}
-
-	/**
-	 * 
-	 */
-	private void refreshStyle() {
-		List childParts = this.getChildren();
-		for (Iterator iter = childParts.iterator(); iter.hasNext();) {
-			EditPart part = (EditPart) iter.next();
-			if (part instanceof ElementEditPart) {
-				IDOMNode node = (IDOMNode) ((ElementEditPart) part)
-						.getNodeForFigure();
-				if (node != null) {
-					refreshChildStyles(node);
-				}
-			}
-		}
-		getFigure().revalidate();
-		// getFigure().repaint();
-	}
-
-	/**
-	 * @param node
-	 */
-	private void refreshChildStyles(IDOMNode node) {
-		NodeList childNodes = node.getChildNodes();
-		for (int i = 0, size = childNodes.getLength(); i < size; i++) {
-			refreshChildStyles((IDOMNode) childNodes.item(i));
-		}
-		if (node instanceof IDOMElement) {
-			// only refresh style on element.
-			ICSSStyle a = (ICSSStyle) node.getAdapterFor(ICSSStyle.class);
-			if (a != null) {
-				a.reset();
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/EditProxyAdapter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/EditProxyAdapter.java
deleted file mode 100644
index cac1252..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/EditProxyAdapter.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.parts;
-
-import org.eclipse.jst.pagedesigner.css2.style.IRangeSelectionProxy;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-
-/**
- * EditProxyAdapter is used to provide additional information to the underlying
- * figures. As when we doing the "convert", we are creating new nodes and
- * generate figure using those new nodes. This class is used to adapt to those
- * new nodes, and providing additional information to them.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class EditProxyAdapter implements INodeAdapter, IRangeSelectionProxy {
-	ElementEditPart _part;
-
-	/**
-	 * @param part 
-	 */
-	public EditProxyAdapter(ElementEditPart part) {
-		_part = part;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#isAdapterForType(java.lang.Object)
-	 */
-	public boolean isAdapterForType(Object type) {
-		if (type == IRangeSelectionProxy.class) {
-			return true;
-		} else if (type == EditProxyAdapter.class) {
-			return true;
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#notifyChanged(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier,
-	 *      int, java.lang.Object, java.lang.Object, java.lang.Object, int)
-	 */
-	public void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-        // do nothing?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.style.IRangeSelectionProxy#isRangeSelected()
-	 */
-	public boolean isRangeSelected() {
-		return _part.isRangeSelected();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/ElementEditPart.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/ElementEditPart.java
deleted file mode 100644
index 408d1d6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/ElementEditPart.java
+++ /dev/null
@@ -1,638 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.parts;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.requests.LocationRequest;
-import org.eclipse.gef.tools.DragEditPartsTracker;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.converter.IConverterFactory;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSWidgetLayout;
-import org.eclipse.jst.pagedesigner.css2.style.AbstractStyle;
-import org.eclipse.jst.pagedesigner.css2.widget.HiddenProvider;
-import org.eclipse.jst.pagedesigner.dtmanager.DTManager;
-import org.eclipse.jst.pagedesigner.editpolicies.ElementMenuBar;
-import org.eclipse.jst.pagedesigner.editpolicies.ElementResizableEditPolicy;
-import org.eclipse.jst.pagedesigner.editpolicies.IEnhancedSelectionEditPolicy;
-import org.eclipse.jst.pagedesigner.elementedit.ElementEditFactoryRegistry;
-import org.eclipse.jst.pagedesigner.elementedit.IElementEdit;
-import org.eclipse.jst.pagedesigner.figurehandler.FigureFactory;
-import org.eclipse.jst.pagedesigner.figurehandler.IFigureHandler;
-import org.eclipse.jst.pagedesigner.jsp.core.IJSPCoreConstants;
-import org.eclipse.jst.pagedesigner.range.RangeUtil;
-import org.eclipse.jst.pagedesigner.requests.PageDesignerRequestConstants;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.graphics.Cursor;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMText;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ElementEditPart extends SubNodeEditPart {
-	private static Logger _log = PDPlugin.getLogger(ElementEditPart.class);
-
-	private Element _elementNode;
-
-	private ITagConverter _tagConverter;
-    
-    private ElementMenuBar  _nonVisualElementBar;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.EditPart#setModel(java.lang.Object)
-	 */
-	public void setModel(Object model) {
-		super.setModel(model);
-		_elementNode = (Element) model;
-		_tagConverter = getTagConverter(_elementNode);
-		_tagConverter.convertRefresh(null);
-		adaptEditProxy();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.NodeEditPart#getDragTracker(org.eclipse.gef.Request)
-	 */
-	public DragTracker getDragTracker(Request request) 
-    {
-        EditPolicy policy = this
-            .getEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE);
-
-        if (PageDesignerRequestConstants.REQ_SELECTION_TRACKER.equals(request.getType())
-                || org.eclipse.gef.RequestConstants.REQ_SELECTION.equals(request.getType()))
-        {
-            if (policy instanceof IEnhancedSelectionEditPolicy
-                    && request instanceof LocationRequest)
-            {
-                return ((IEnhancedSelectionEditPolicy)policy).getSelectionDragTracker((LocationRequest)request);
-            }
-            
-            return null;
-        }
-        
-        // should not happen
-        return new DragEditPartsTracker(this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.NodeEditPart#createEditPolicies()
-	 */
-	protected void createEditPolicies() {
-		super.createEditPolicies();
-		IElementEdit support = getElementEdit();
-		if (support != null) {
-			support.createEditPolicies(this);
-		}
-
-		// if ElementEdit didn't install special SELECTION_FEEDBACK_ROLE policy,
-		// then default
-		if (this.getEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE) == null) {
-			this.installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE,
-					new ElementResizableEditPolicy());
-		}
-	}
-
-	/**
-	 * @return the associated element edit
-	 */
-	public IElementEdit getElementEdit() {
-		// XXX: should we cache it?
-		return ElementEditFactoryRegistry.getInstance().createElementEdit(
-				_elementNode);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.NodeEditPart#addNotify()
-	 */
-	public void addNotify() {
-		if (_tagConverter == null) {
-			_tagConverter = getTagConverter(_elementNode);
-			_tagConverter.convertRefresh(null);
-			adaptEditProxy();
-		}
-		super.addNotify();
-	}
-
-	/**
-	 * @param node
-	 * @return
-	 */
-	private ITagConverter getTagConverter(Element node) {
-		return DTManager.getInstance().getTagConverter(node,
-				IConverterFactory.MODE_DESIGNER,
-				this.getDestDocumentForDesign());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#removeNotify()
-	 */
-	public void removeNotify() {
-		super.removeNotify();
-		// if (_tagConverter != null)
-		// {
-		// _tagConverter.dispose();
-		// _tagConverter = null;
-		// }
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractEditPart#getModelChildren()
-	 */
-	protected List getModelChildren() {
-		List children_ = new ArrayList(_tagConverter.getChildModeList());
-        
-        for (Iterator it = _tagConverter.getNonVisualChildren().iterator(); it.hasNext();)
-        {
-            Element nonVisualChild = (Element) it.next();
-            children_.add(DTManager.getInstance().getTagConverter(nonVisualChild,
-                IConverterFactory.MODE_DESIGNER,
-                this.getDestDocumentForDesign()));
-        }
-        return children_;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure()
-	 */
-	protected IFigure createFigure() {
-		// if (_tagConverter.isVisualByHTML())
-		// {
-		// Element result = _tagConverter.getResultElement();
-		// return FigureFactory.createFigure(result,
-		// true);//_tagConverter.isMultiLevel());
-		// }
-		// else
-		// {
-		// CSSWidgetFigure figure = new CSSWidgetFigure(this._elementNode,
-		// createHiddenProvider());
-		// return figure;
-		// }
-		return new CSSFigure();
-	}
-
-	/**
-	 * @return
-	 */
-	private HiddenProvider createHiddenProvider() {
-		Element result = _tagConverter.getHostElement();
-		String localName = result.getLocalName();
-		String appendString = localName;
-		if (localName.equalsIgnoreCase(IJSPCoreConstants.TAG_DIRECTIVE_TAGLIB)) {
-			appendString = ((IDOMElement) result)
-					.getAttribute(IJSPCoreConstants.ATTR_URI);
-			if (appendString == null) {
-				appendString = "";
-			}
-		}
-		Image image = _tagConverter.getVisualImage();
-		HiddenProvider provider = new HiddenProvider(image, this);
-		((CSSFigure) getFigure()).setCSSStyle(provider.getCSSStyle());
-		provider.setLabel(appendString);
-		return provider;
-	}
-
-	/**
-	 * called by the
-	 * @param recursive
-	 * 
-	 */
-	public void refreshModelChange(boolean recursive) {
-		IElementEdit support = getElementEdit();
-		if (support == null
-				|| !support.handleModelChange(_elementNode, this, recursive)) {
-			this.refresh(recursive);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#refresh()
-	 */
-	public void refresh() {
-		refresh(false);
-	}
-
-	/**
-	 * @param recursive
-	 */
-	public void refresh(boolean recursive) {
-		if (!_tagConverter.isVisualByHTML()) {
-			_tagConverter.convertRefresh(null);
-			((CSSFigure) getFigure())
-					.setFixedLayoutManager(new CSSWidgetLayout(
-							(CSSFigure) getFigure(), createHiddenProvider()));
-			// nothing to refresh
-			// ((CSSWidgetFigure)
-			// getFigure()).setProvider(createHiddenProvider());
-			return;
-		}
-		EditPart editPart;
-		Object model;
-
-		Map modelToEditPart = new HashMap();
-		List children1 = getChildren();
-
-		for (int i = 0, n = children1.size(); i < n; i++) {
-			editPart = (EditPart) children1.get(i);
-			modelToEditPart.put(editPart.getModel(), editPart);
-			// remove child visual, since we may reconstruct the figure
-			// structure of this edit part
-			removeChildVisual(editPart);
-		}
-
-		Element oldEle = _tagConverter.getResultElement();
-
-		// link parent node.
-		Node parent = oldEle.getParentNode();
-		_tagConverter.convertRefresh(null);
-		if (parent != null) {
-			// a new element is generated. replace the old one.
-			parent.replaceChild(_tagConverter.getResultElement(), oldEle);
-		}
-
-		adaptEditProxy();
-
-		// XXX: comment out the if-else for always deep update.
-		// this is for the case when a empty container generate child
-		// text node, and then when user input data into the container,
-		// the node change from "multiLevel" state to "non-multilevel"
-		// state. We don't handle this very well yet, so always to deep
-		// update for now. (lium)
-		// if (_tagConverter.isMultiLevel())
-		// {
-		FigureFactory.updateDeepFigure(_tagConverter.getResultElement(),
-				oldEle, (CSSFigure) this.getFigure());
-		// }
-		// else
-		// {
-		// FigureFactory.updateNonDeepFigure(_tagConverter.getResultElement(),
-		// this.getFigure());
-		// }
-
-		List modelObjects = getModelChildren();
-		if (!recursive) {
-			for (int i = 0, n = modelObjects.size(); i < n; i++) {
-				model = modelObjects.get(i);
-
-				// Look to see if the EditPart is already around but in the
-				// wrong location
-				editPart = (EditPart) modelToEditPart.remove(model);
-
-				if (editPart != null) {
-					addChildVisual(editPart, i);
-				} else {
-					// An editpart for this model doesn't exist yet. Create and
-					// insert one.
-					editPart = createChild(model);
-					addChild(editPart, i);
-				}
-			}
-			for (Iterator iter = modelToEditPart.values().iterator(); iter
-					.hasNext();) {
-				EditPart part = (EditPart) iter.next();
-				removeChild(part);
-			}
-		} else {
-			// remove all child, and recreate them.
-			for (Iterator iter = modelToEditPart.values().iterator(); iter
-					.hasNext();) {
-				EditPart part = (EditPart) iter.next();
-				removeChild(part);
-			}
-			for (int i = 0, n = modelObjects.size(); i < n; i++) {
-				model = modelObjects.get(i);
-
-				// Look to see if the EditPart is already around but in the
-				// wrong location
-				// An editpart for this model doesn't exist yet. Create and
-				// insert one.
-				editPart = createChild(model);
-				addChild(editPart, i);
-			}
-		}
-	}
-
-	/**
-	 * 
-	 */
-	private void adaptEditProxy() {
-		Element resultEle = _tagConverter.getResultElement();
-		if (resultEle instanceof IDOMElement) {
-			INodeAdapter adapter = ((IDOMElement) resultEle)
-					.getAdapterFor(EditProxyAdapter.class);
-			if (adapter != null) {
-				((IDOMElement) resultEle).removeAdapter(adapter);
-			}
-			((IDOMElement) resultEle).addAdapter(new EditProxyAdapter(this));
-		}
-	}
-
-	/**
-	 * @return true if we are in range mode and this is in 
-	 * the selection range
-	 */
-	public boolean isRangeSelected() {
-		IHTMLGraphicalViewer viewer = (IHTMLGraphicalViewer) this.getViewer();
-		if (viewer == null || !viewer.isInRangeMode()) {
-			return false;
-		}
-		DesignRange range = viewer.getRangeSelection();
-		if (range == null || !range.isValid()) {
-			return false;
-		}
-		return RangeUtil.intersect(range, this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.NodeEditPart#isWidget()
-	 */
-	public boolean isWidget() {
-		return _tagConverter.isWidget();
-	}
-
-	/**
-	 * @return true if our model node can have direct text children
-	 */
-	public boolean canHaveDirectTextChild() {
-		return CMUtil.canHaveDirectTextChild(this._elementNode);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.NodeEditPart#isResizable()
-	 */
-	public boolean isResizable() {
-		if (!_tagConverter.isVisualByHTML()) {
-			return false;
-		}
-		IElementEdit edit = this.getElementEdit();
-		if (edit != null) {
-			return edit.isResizable(this._elementNode);
-		}
-        CMElementDeclaration decl = CMUtil
-        		.getElementDeclaration(this._elementNode);
-        if (decl != null) {
-        	// XXX: default implementation, if this element support "style"
-        	// attribute,
-        	// then we think it support resize.
-        	return decl.getAttributes().getNamedItem("style") != null;
-        }
-        return true;
-	}
-
-	/**
-	 * @param parent
-	 * @return
-	 */
-	private IFigure getFigure(Node parent) {
-		if (parent instanceof INodeNotifier) {
-			IFigureHandler handler = (IFigureHandler) ((INodeNotifier) parent)
-					.getAdapterFor(IFigureHandler.class);
-			if (handler != null) {
-				return handler.getFigure();
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#addChildVisual(org.eclipse.gef.EditPart,
-	 *      int)
-	 */
-	protected void addChildVisual(EditPart childEditPart, int index) {
-        
-        boolean figureAdded = false;
-
-        if (childEditPart instanceof NonVisualComponentEditPart)
-        {
-            getNonVisualElementBar().addNonVisualChild(((NonVisualComponentEditPart) childEditPart));
-            figureAdded = true;
-            //TODO: need better flow of control.
-            return;
-        }
-        
-		Node childNode = (Node) childEditPart.getModel();
-		IFigure childFigure = ((GraphicalEditPart) childEditPart).getFigure();
-		ConvertPosition position = _tagConverter
-				.getChildVisualPosition(childNode);
-		if (position != null) {
-			Node parent = position.getParentNode();
-			// link up figure.
-			IFigure parentFigure = getFigure(parent);
-			if (parentFigure != null) {
-				parentFigure.add(childFigure, position.getIndex());
-				figureAdded = true;
-			}
-			// link up style
-			if (parent instanceof INodeNotifier) {
-				ICSSStyle parentStyle = (ICSSStyle) ((INodeNotifier) parent)
-						.getAdapterFor(ICSSStyle.class);
-				if (parentStyle != null) {
-					ICSSStyle childStyle = (ICSSStyle) ((INodeNotifier) childNode)
-							.getAdapterFor(ICSSStyle.class);
-					if (childStyle instanceof AbstractStyle) {
-						((AbstractStyle) childStyle)
-								.setParentStyle(parentStyle);
-					}
-				}
-			}
-			// link up the nodeForFigure
-			if (childEditPart instanceof SubNodeEditPart) {
-				Node nodeForFigure = ((SubNodeEditPart) childEditPart)
-						.getNodeForFigure();
-				if (nodeForFigure != null /*
-											 * && !(nodeForFigure instanceof
-											 * PseudoElement)
-											 */) {
-					parent.appendChild(nodeForFigure);
-				}
-			}
-		} else {
-		    _log.error("getChildVisualPosition() return null");
-		}
-
-		if (!figureAdded) {
-			super.addChildVisual(childEditPart, index);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#removeChildVisual(org.eclipse.gef.EditPart)
-	 */
-	protected void removeChildVisual(EditPart childEditPart) {
-        // remove figure
-        IFigure childFigure = ((GraphicalEditPart) childEditPart).getFigure();
-        IFigure parent = childFigure.getParent();
-
-		if (parent != null) {
-			parent.remove(childFigure);
-		}
-        
-        if (childEditPart instanceof NonVisualComponentEditPart)
-        {
-            _nonVisualElementBar.removeNonVisualChild((NonVisualComponentEditPart) childEditPart);
-        }
-        // this only applies to visual edit parts
-        else
-        {
-    		// de-link style
-    		Node childNode = (Node) childEditPart.getModel();
-    		ICSSStyle childStyle = (ICSSStyle) ((INodeNotifier) childNode)
-    				.getAdapterFor(ICSSStyle.class);
-    		if (childStyle instanceof AbstractStyle) {
-    			((AbstractStyle) childStyle).setParentStyle(null);
-    		}
-    		// de-link nodeForFigure
-    		if (childEditPart instanceof SubNodeEditPart) {
-    			Node nodeForFigure = ((SubNodeEditPart) childEditPart)
-    					.getNodeForFigure();
-    			if (nodeForFigure != null && nodeForFigure.getParentNode() != null) {
-    				nodeForFigure.getParentNode().removeChild(nodeForFigure);
-    			}
-    		}
-        }
-	}
-
-	/**
-	 * @return the associated tag converter
-	 */
-	public ITagConverter getTagConvert() {
-		return _tagConverter;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#notifyChanged(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier,
-	 *      int, java.lang.Object, java.lang.Object, java.lang.Object, int)
-	 */
-	public void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-        // XXX: this can cause multiple refreshes on the same edit part for the 
-        // same change.  I can also cause incorrect child refreshes...
-		refresh();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.SubNodeEditPart#getNodeForFigure()
-	 */
-	public Node getNodeForFigure() {
-		return _tagConverter.getResultElement();
-	}
-
-	/**
-	 * @return true this part's node has non whitespace child nodes
-	 */
-	public boolean haveNonWhitespaceTextChild() {
-		List children1 = this.getChildren();
-		for (int i = 0, size = children1.size(); i < size; i++) {
-			if (children1.get(i) instanceof TextEditPart) {
-				IDOMText xmltext = (IDOMText) ((TextEditPart) children1.get(i))
-						.getIDOMNode();
-				if (!xmltext.isElementContentWhitespace()) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-    private ElementMenuBar getNonVisualElementBar()
-    {
-        if (_nonVisualElementBar == null)
-        {
-            _nonVisualElementBar = new ElementMenuBar(this);
-        }
-        return _nonVisualElementBar;
-    }
-
-    /**
-     * @return the element menu bar for this element
-     */
-    public ElementMenuBar getElementMenuBar() {
-        return getNonVisualElementBar();
-    }
-
-    public void deactivate() {
-        super.deactivate();
-        if (_nonVisualElementBar != null)
-        {
-            _nonVisualElementBar.dispose();
-            _nonVisualElementBar = null;
-        }
-        if (_tagConverter != null) {
-        	_tagConverter.dispose();
-        }
-    }
-
-    public Cursor getCursor(Point mouseLocation) {
-        // let the selection edit policy dictate
-        EditPolicy  editPolicy = getEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE);
-        
-        if (editPolicy instanceof IEnhancedSelectionEditPolicy)
-        {
-            return  ((IEnhancedSelectionEditPolicy)editPolicy).getSelectionToolCursor(mouseLocation);
-        }
-        return super.getCursor(mouseLocation);
-    }
-    
-    
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/HTMLEditPartsFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/HTMLEditPartsFactory.java
deleted file mode 100644
index 66dd085..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/HTMLEditPartsFactory.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.parts;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartFactory;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.w3c.dom.Node;
-
-/**
- * The model here can only be Document/Element/Text.
- * 
- * @author mengbo
- */
-public class HTMLEditPartsFactory implements EditPartFactory {
-	private IDOMDocument _destDocument;
-
-	/**
-	 * @param destDoc
-	 */
-	public HTMLEditPartsFactory(IDOMDocument destDoc) {
-		this._destDocument = destDoc;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.EditPartFactory#createEditPart(org.eclipse.gef.EditPart,
-	 *      java.lang.Object)
-	 */
-	public EditPart createEditPart(EditPart context, Object model) {
-        NodeEditPart part = null;
-        
-        if (model instanceof Node)
-        {
-    		Node node = (Node) model;
-    		if (node.getNodeType() == Node.DOCUMENT_NODE) {
-    			part = new DocumentEditPart();
-    		} else if (node.getNodeType() == Node.ELEMENT_NODE) {
-    			// String tag = ((Element)node).getTagName();
-    			// if ("TABLE".equalsIgnoreCase(tag))
-    			// part = new HTMLTableEditPart();
-    			// else
-                    part = new ElementEditPart();
-    		} else if (node.getNodeType() == Node.TEXT_NODE
-    				|| node.getNodeType() == Node.CDATA_SECTION_NODE) {
-    			part = new TextEditPart();
-    		}
-        }
-        // XXX: we need to create wrapper that allows us to know when
-        // a model object represents a non-visual decorator
-        else if (model instanceof ITagConverter)
-        {
-            part = new NonVisualComponentEditPart();
-        }
-        
-		if (part != null) {
-			part.setDestDocumentForDesign(this._destDocument);
-			part.setModel(model);
-		}
-		return part;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/NodeEditPart.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/NodeEditPart.java
deleted file mode 100644
index 653ba15..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/NodeEditPart.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.parts;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.RequestConstants;
-import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
-import org.eclipse.gef.requests.LocationRequest;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.pagedesigner.dnd.LocalDropRequest;
-import org.eclipse.jst.pagedesigner.dnd.internal.LocalDropEditPolicy;
-import org.eclipse.jst.pagedesigner.editpolicies.DragMoveEditPolicy;
-import org.eclipse.jst.pagedesigner.itemcreation.ItemCreationEditPolicy;
-import org.eclipse.jst.pagedesigner.itemcreation.ItemCreationRequest;
-import org.eclipse.jst.pagedesigner.tools.RangeDragTracker;
-import org.eclipse.swt.graphics.Cursor;
-import org.eclipse.ui.views.properties.IPropertySource;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public abstract class NodeEditPart extends AbstractGraphicalEditPart implements
-		INodeAdapter {
-
-	private IDOMDocument _destDocument;
-	private boolean      _isDragActive;
-    
-	/**
-	 * this method is called from the HTMLEditPartsFactory directly after the
-	 * part's creation.
-	 * 
-	 * @param doc
-	 */
-	public void setDestDocumentForDesign(IDOMDocument doc) {
-		this._destDocument = doc;
-	}
-
-	/**
-	 * @return to owner document of this part's model node
-	 */
-	public IDOMDocument getDestDocumentForDesign() {
-		if (this._destDocument == null) {
-			return (IDOMDocument) this.getIDOMNode().getOwnerDocument();
-		}
-        return this._destDocument;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractEditPart#createEditPolicies()
-	 */
-	protected void createEditPolicies() {
-		installEditPolicy(EditPolicy.NODE_ROLE, null);
-		installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, null);
-		installEditPolicy(LocalDropRequest.REQ_LOCAL_DROP,
-				new LocalDropEditPolicy());
-		installEditPolicy(ItemCreationRequest.REQ_ITEM_CREATION,
-				new ItemCreationEditPolicy());
-		installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE,
-				new DragMoveEditPolicy());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.sse.model.INodeAdapter#isAdapterForType(java.lang.Object)
-	 */
-	public boolean isAdapterForType(Object type) {
-		return type == EditPart.class;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#addNotify()
-	 */
-	public void addNotify() {
-		Object obj = getModel();
-		if (obj instanceof INodeNotifier) {
-			((INodeNotifier) obj).addAdapter(this);
-		}
-		super.addNotify();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#removeNotify()
-	 */
-	public void removeNotify() {
-		super.removeNotify();
-		Object obj = getModel();
-		if (obj instanceof INodeNotifier) {
-			((INodeNotifier) obj).removeAdapter(this);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.EditPart#deactivate()
-	 */
-	public void deactivate() {
-		LocationRequest hoverRequest = new LocationRequest();
-		hoverRequest.setType(RequestConstants.REQ_SELECTION_HOVER);
-		this.eraseTargetFeedback(hoverRequest);
-		super.deactivate();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class key) {
-		Object obj = getModel();
-		if (key == IPropertySource.class) {
-			if (obj instanceof INodeNotifier) {
-				return ((INodeNotifier) obj)
-						.getAdapterFor(IPropertySource.class);
-			}
-		}
-
-		if (obj instanceof IAdaptable) {
-			Object ret = ((IAdaptable) obj).getAdapter(key);
-			if (ret != null)
-				return ret;
-		}
-		return super.getAdapter(key);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#getDragTracker(org.eclipse.gef.Request)
-	 */
-	public DragTracker getDragTracker(Request request) {
-		return new RangeDragTracker(this);
-	}
-
-	/**
-	 * @return the model node as an IDOMNode
-	 */
-	public IDOMNode getIDOMNode() {
-		return ((IDOMNode) getModel());
-	}
-
-    /**
-     * @return the model node as a node
-     */
-    public Node getDOMNode()
-    {
-        return ((Node)getModel());
-    }
-    
-    /**
-     * @return if this edit part's model is an Element, then returns
-     * the tag identifier. Otherwise, null.
-     */
-    public TagIdentifier getTagIdentifier()
-    {
-        Node node = getDOMNode();
-        
-        if (node instanceof Element)
-        {
-            return TagIdentifierFactory.createDocumentTagWrapper(((Element)node));
-        }
-        
-        return null;
-    }
-    
-	/**
-	 * if a EditPart don't support caret inside it, and don't can't have child
-	 * edit part, then we call it as a widget.
-	 * 
-	 * @return true if this part represents a widget
-	 */
-	public boolean isWidget() {
-		return false; // child class must override.
-	}
-
-	/**
-	 * whether this EditPart allow the selection range to have one edge in the
-	 * edit part and one edge outside the edit part.
-	 * 
-	 * @return true if selection range across is allowed
-	 */
-	public boolean allowSelectionRangeAcross() {
-		return true;
-	}
-
-	/**
-	 * @return true if this part is resizable
-	 */
-	public boolean isResizable() {
-		return false;
-	}
-    
-    /**
-     * @return true if drag is active on this part
-     */
-    public boolean isDragActive() {
-        return _isDragActive;
-    }
-    
-    /**
-     * @param newValue
-     */
-    public void setDragActive(boolean newValue)
-    {
-        _isDragActive = newValue;
-    }
-    
-    /**
-     * @param mouseLocation
-     * @return this edit part's cursor or null if this edit part
-     * does not wish to specify a specific cursor (the default
-     * should be used).  
-     * Note that this is only called when no drag tracker is active,
-     * when the mouse enters the edit part with the RangeSelectionTool
-     * and the current state is INITIAL.  This allows the editpart to
-     * specify a custom mouse-over tool cursor
-     * TODO: perhaps getCursor is not a specific enough a name
-     */
-    public Cursor getCursor(Point mouseLocation)
-    {
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/NonVisualComponentEditPart.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/NonVisualComponentEditPart.java
deleted file mode 100644
index 08b76d1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/NonVisualComponentEditPart.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.parts;
-
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.ImageFigure;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPolicy;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.eclipse.jst.pagedesigner.editpolicies.NonVisualChildGraphicalEditPolicy;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * Represents a node that is non-visual in the runtime rendering
- * but which may wish to have a meta-representation on the design canvas.
- *
- */
-public class NonVisualComponentEditPart extends NodeEditPart 
-{
-    protected IFigure createFigure() 
-    {
-        IFigure figure_ = new ImageFigure(getTagConverter().getVisualImage())
-        {
-
-            protected void paintFigure(Graphics graphics) {
-                super.paintFigure(graphics);
-                
-                if (getImage() == null)
-                    return;
-
-                Rectangle srcRect = new Rectangle(getImage().getBounds());
-                graphics.drawImage(getImage(), srcRect, getClientArea());
-            }
-            
-        };
-        
-        figure_.setMinimumSize(new Dimension(0,0));
-        return figure_;
-    }
-
-    public void notifyChanged(INodeNotifier notifier, int eventType,
-            Object changedFeature, Object oldValue, Object newValue, int pos) {
-        // for now, do nothing
-    }
-
-    protected void createEditPolicies() {
-        super.createEditPolicies();
-        installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE
-                          , new NonVisualChildGraphicalEditPolicy());
-        installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE,
-                null);
-    }
-
-    @Override
-    public void deactivate()
-    {
-        ITagConverter tagConverter = (ITagConverter) getModel();
-        if (tagConverter != null)
-        {
-            tagConverter.dispose();
-        }
-        
-        // always do super stuff
-        super.deactivate();
-    }
-
-    /**
-     * @return the tag converter
-     */
-    protected ITagConverter getTagConverter()
-    {
-    	ITagConverter tagConverter = (ITagConverter)getModel();
-    	//need to call convertRefresh to get image (if any) from metadata
-    	if (tagConverter != null) {
-    		tagConverter.convertRefresh(null);
-    	}
-    	return tagConverter;
-    }
-    
-    /**
-     * @return the host element for this edit part
-     */
-    protected Element getModelElement()
-    {
-        return getTagConverter().getHostElement();
-    }
-
-    public IDOMNode getIDOMNode() 
-    {
-        return (IDOMNode) getModelElement();
-    }
-
-    public Node getDOMNode() {
-        return getModelElement();
-    }
-
-//    public DragTracker getDragTracker(Request request) {
-//        // TODO: need to define drag semantics for these
-//        // Also, right now edit part dragging causes bad behaviour
-//        // in the non-visual decorator
-//        return null;//new ObjectModeDragTracker(this);
-//    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/Refresher.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/Refresher.java
deleted file mode 100644
index 67e62f2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/Refresher.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.parts;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class Refresher implements INodeAdapter {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#isAdapterForType(java.lang.Object)
-	 */
-	public boolean isAdapterForType(Object type) {
-		return (type == Refresher.class);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.sse.core.internal.provisional.INodeAdapter#notifyChanged(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier,
-	 *      int, java.lang.Object, java.lang.Object, java.lang.Object, int)
-	 */
-	public void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-		if (eventType == INodeNotifier.ADD || eventType == INodeNotifier.REMOVE) {
-			// for ADD and REMOVE, system will fire CHANGE event, so we ignore
-			// the ADD/REMOVE
-			// event here.
-			return;
-		}
-		if (notifier instanceof IDOMNode) {
-			IDOMNode node = (IDOMNode) notifier;
-			// we need to refresh all CSS style adapter of node and its
-			// children.
-			EditPart part = (EditPart) node.getAdapterFor(EditPart.class);
-			if (part instanceof SubNodeEditPart) {
-				Node nodeForFigure = ((SubNodeEditPart) part)
-						.getNodeForFigure();
-				if (nodeForFigure instanceof IDOMNode) {
-					refreshChildStyles((IDOMNode) nodeForFigure);
-				}
-			}
-
-			// we need also find the nearest parent node that has editpart, and
-			// refresh it.
-			refreshContainingPart(node,
-					eventType == INodeNotifier.STRUCTURE_CHANGED);
-
-			part = (EditPart) node.getAdapterFor(EditPart.class);
-			if (part != null) {
-				((IHTMLGraphicalViewer) part.getViewer()).clearSelectionRange();
-			}
-		}
-	}
-
-	/**
-	 * @param node
-	 */
-	private void refreshContainingPart(IDOMNode node, boolean recursive) {
-		if (node.getOwnerDocument() == node) {
-			EditPart part = (EditPart) node.getAdapterFor(EditPart.class);
-			if (part != null) {
-				part.refresh();
-			}
-		} else {
-			while (node != null) {
-				EditPart part = (EditPart) node.getAdapterFor(EditPart.class);
-				if (part != null) {
-					if (part instanceof ElementEditPart) {
-						((ElementEditPart) part).refreshModelChange(recursive);
-					} else {
-						part.refresh();
-					}
-					return;
-				}
-				node = (IDOMNode) node.getParentNode();
-			}
-		}
-	}
-
-	/**
-	 * @param node
-	 */
-	private void refreshChildStyles(IDOMNode node) {
-		NodeList childNodes = node.getChildNodes();
-		for (int i = 0, size = childNodes.getLength(); i < size; i++) {
-			refreshChildStyles((IDOMNode) childNodes.item(i));
-		}
-		if (node instanceof IDOMElement) {
-			// only refresh style on element.
-			ICSSStyle a = (ICSSStyle) node.getAdapterFor(ICSSStyle.class);
-			if (a != null) {
-				a.reset();
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/RefresherFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/RefresherFactory.java
deleted file mode 100644
index bb9c599..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/RefresherFactory.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.parts;
-
-import org.eclipse.wst.sse.core.internal.provisional.AbstractAdapterFactory;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class RefresherFactory extends AbstractAdapterFactory {
-	private final Refresher refresher = new Refresher();
-
-	RefresherFactory() {
-		super(Refresher.class, true);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @seeorg.eclipse.wst.sse.core.internal.provisional.AbstractAdapterFactory#createAdapter(org.eclipse.wst.sse.core.internal.provisional.INodeNotifier)
-	 */
-	protected INodeAdapter createAdapter(INodeNotifier target) {
-		return refresher;
-	}
-
-	static RefresherFactory _instance = new RefresherFactory();
-
-	/**
-	 * @return the factory singleton
-	 */
-	public static RefresherFactory getInstance() {
-		return _instance;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/SubNodeEditPart.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/SubNodeEditPart.java
deleted file mode 100644
index 8056dd9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/SubNodeEditPart.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.parts;
-
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public abstract class SubNodeEditPart extends NodeEditPart {
-	/**
-	 * 
-	 * @return could be null
-	 */
-	public abstract Node getNodeForFigure();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/TextEditPart.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/TextEditPart.java
deleted file mode 100644
index 60377b5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/TextEditPart.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.parts;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.SharedCursors;
-import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSTextFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.ICSSFigure;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.css2.provider.ICSSTextProvider;
-import org.eclipse.jst.pagedesigner.css2.style.DefaultStyle;
-import org.eclipse.jst.pagedesigner.editpolicies.LinkEditPolicy;
-import org.eclipse.jst.pagedesigner.range.RangeUtil;
-import org.eclipse.jst.pagedesigner.utils.HTMLUtil;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.graphics.Cursor;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public class TextEditPart extends SubNodeEditPart implements ICSSTextProvider {
-	private String _cachedData;
-
-	private Text _textNode;
-
-	private Text _textNodeForFigure;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.EditPart#setModel(java.lang.Object)
-	 */
-	public void setModel(Object model) {
-		super.setModel(model);
-		_textNode = (Text) model;
-		_cachedData = _textNode.getData();
-		_textNodeForFigure = getDestDocumentForDesign().createTextNode(
-				_cachedData);
-	}
-
-	protected IFigure createFigure() {
-		// XXX: currently creating of CSSTextFigure is distributed both here
-		// and FigureFactory. We may want to unify them later.
-		return new CSSTextFigure(this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editparts.AbstractEditPart#createEditPolicies()
-	 */
-	protected void createEditPolicies() {
-		super.createEditPolicies();
-		this.installEditPolicy("link editpolicy", new LinkEditPolicy());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.SubNodeEditPart#getNodeForFigure()
-	 */
-	public Node getNodeForFigure() {
-		return _textNodeForFigure;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see com.ibm.sse.model.INodeAdapter#notifyChanged(com.ibm.sse.model.INodeNotifier,
-	 *      int, java.lang.Object, java.lang.Object, java.lang.Object, int)
-	 */
-	public void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-		_cachedData = _textNode.getData();
-		_textNodeForFigure.setData(_cachedData);
-		if (eventType == INodeNotifier.CHANGE) {
-			getFigure().revalidate();
-		} else {
-			// XXX: been removed? parent EditPart should have handled it.
-		}
-	}
-
-
-	/**
-	 * @return the associated css style for this text node
-	 */
-	public ICSSStyle getCSSStyle() {
-		IFigure figure1 = this.getFigure();
-		if (figure1 instanceof ICSSFigure) {
-			ICSSStyle style = ((ICSSFigure) figure1).getCSSStyle();
-			if (style != null) {
-				return style;
-			}
-		}
-		return DefaultStyle.getInstance();
-	}
-
-	/**
-	 * As when text are displayed in HTML, they are "normalized". For example,
-	 * leading whitespace may be removed dure to previous node as trailing
-	 * whitespace. Entity reference may have be resolved. Sequence whitespace
-	 * been merged.
-	 * 
-	 * It is also possible that the text node is in "PRE" mode, in that case the
-	 * above things are not done.
-	 * 
-	 * This method return the really value that is going to be presented to
-	 * user. EditPartPosition's offset is referencing this value.
-	 * 
-	 * @return the text data
-	 * @see org.eclipse.jst.pagedesigner.viewer.DesignPosition
-	 */
-	public String getTextData() {
-		ICSSStyle style = getCSSStyle();
-		String data = _cachedData;
-		if (style.getStyleProperty(ICSSPropertyID.ATTR_WHITESPACE) != ICSSPropertyID.VAL_PRE) {
-			return HTMLUtil.compactWhitespaces(_textNode, data);
-		}
-        return data;
-	}
-
-	/**
-	 * check what part of this text node is in the range selection.
-	 * 
-	 * @return text node ranges
-	 */
-	public int[] getSelectedRange() {
-		IHTMLGraphicalViewer viewer = (IHTMLGraphicalViewer) this.getViewer();
-		if (viewer == null || !viewer.isInRangeMode()) {
-			return null;
-		}
-		DesignRange range = viewer.getRangeSelection();
-		if (range == null || !range.isValid()) {
-			return null;
-		}
-		if (!RangeUtil.intersect(range, this)) {
-			return null;
-		}
-		// ok, we intersect with the range.
-		range = RangeUtil.normalize(range);
-		EditPart startContainer = range.getStartPosition().getContainerPart();
-		EditPart endContainer = range.getEndPosition().getContainerPart();
-		int[] ret = new int[2];
-		if (startContainer != this) {
-			ret[0] = 0;
-		} else {
-			ret[0] = range.getStartPosition().getOffset();
-		}
-		if (endContainer != this) {
-			ret[1] = this.getTextData().length();
-		} else {
-			{
-				ret[1] = range.getEndPosition().getOffset();
-			}
-		}
-		return ret;
-	}
-
-	public boolean isSelectable() {
-        // controls, amongst other things, whether or not a standard 
-        // hit test in SelectionTool for mouse over will find this edit part 
-		return true;
-	}
-
-    public Cursor getCursor(Point mouseLocation) {
-        return SharedCursors.IBEAM;
-    }
-    
-    
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PageExpressionContext.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PageExpressionContext.java
deleted file mode 100644
index 83d190d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PageExpressionContext.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.preview;
-
-import java.io.BufferedInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-
-import javax.servlet.jsp.el.ELException;
-import javax.servlet.jsp.el.FunctionMapper;
-import javax.servlet.jsp.el.VariableResolver;
-
-import org.apache.commons.el.ExpressionEvaluatorImpl;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IStorage;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.ResourceUtils;
-import org.eclipse.jst.jsf.core.internal.tld.LoadBundleUtil;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.jsp.core.el.JSFELParserHelper;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.IPageVariablesProvider;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.IVariableInfo;
-
-/**
- * This is a static class. But it has "session" concept in it. To make it static
- * is only to simplify its use.
- * 
- * This class currently is only used by TagConverter, when calculating the
- * displayed string for resource bundle items.
- * 
- * XXX: in the future, if we want to this to be non-static, we may incorportate
- * it into the context of the tag converter.
- * 
- * @author mengbo
- * @version 1.5
- */
-// TODO: we may consider support cache the properties.
-public class PageExpressionContext {
-	private static final Logger _log = PDPlugin
-			.getLogger(PageExpressionContext.class);
-
-	static PageExpressionContext _current;
-
-	List _pageVarProviders = new ArrayList();
-
-	VariableResolver resolver = new SimpleVariableResolver();
-
-	private IProject _prj;
-
-	/**
-	 * @param prj
-	 */
-	public PageExpressionContext(IProject prj) {
-		_prj = prj;
-	}
-
-	/**
-	 * reset the context.
-	 */
-	public static void reset() {
-		_current = null;
-	}
-
-	/**
-	 * Initialize the current context
-	 * @param prj
-	 */
-	public static void initialize(IProject prj) {
-		_current = new PageExpressionContext(prj);
-	}
-
-	/**
-	 * @return the current context
-	 */
-	public static PageExpressionContext getCurrent() {
-		return _current;
-	}
-
-	/**
-	 * @param provider
-	 */
-	public void pushPageVarProvider(IPageVariablesProvider provider) {
-		_pageVarProviders.add(provider);
-	}
-
-	/**
-	 * @param provider
-	 */
-	public void popPageVarProvider(IPageVariablesProvider provider) {
-		try {
-			_pageVarProviders.remove(_pageVarProviders.size() - 1);
-		} catch (Exception ex) {
-			// "Error"
-			_log.info("PageExpressionContext.Info.0", ex); //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * this method is for design time expression evaluation. Currently it only
-	 * handles
-	 * 
-	 * @param expression
-	 * @param expectedClass 
-	 * @param options
-	 *            XXX: not used today. In the future, we may support things like
-	 *            locale in options
-	 * @return the result of evaluating the expression
-	 * @throws ELException 
-	 */
-	public Object evaluateExpression(String expression, Class expectedClass,
-			Map options) throws ELException {
-		expression = JSFELParserHelper.toJspElExpression(expression);
-		ExpressionEvaluatorImpl evaluator = new ExpressionEvaluatorImpl();
-		FunctionMapper mapper = new EmptyFunctionMapper();
-
-		return evaluator.evaluate(expression, expectedClass, resolver, mapper);
-	}
-
-	class SimpleVariableResolver implements VariableResolver {
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see javax.servlet.jsp.el.VariableResolver#resolveVariable(java.lang.String)
-		 */
-		public Object resolveVariable(String varName) throws ELException {
-			// reverse order.
-			for (int k = _pageVarProviders.size() - 1; k >= 0; k--) {
-				IPageVariablesProvider _pageVars = (IPageVariablesProvider) _pageVarProviders
-						.get(k);
-				if (_pageVars != null) {
-					IVariableInfo[] vars = _pageVars.getBeanInfos();
-					if (vars != null) {
-						for (int i = 0; i < vars.length; i++) {
-							if (varName.equals(vars[i].getName())) {
-								// ok we found.
-								if (vars[i].getMode() == IVariableInfo.RESOURCEBUNDLE) {
-									String resourceName = vars[i]
-											.getTypeInfoString();
-									IStorage s = null;
-									try {
-										s = LoadBundleUtil
-												.getLoadBundleResource(_prj,
-														resourceName);
-									} catch (CoreException ex) {
-										// "Error"
-										_log
-												.info(
-														"PageExpressionContext.Info.0", ex); //$NON-NLS-1$
-									}
-									if (s == null) {
-										throw new ELException();
-									}
-									InputStream input = null;
-									try {
-										input = new BufferedInputStream(s
-												.getContents());
-										Properties p = new Properties();
-										p.load(input);
-										return p;
-									} catch (CoreException e) {
-										throw new ELException(e);
-									} catch (IOException e) {
-										throw new ELException(e);
-									} finally {
-										ResourceUtils.ensureClosed(input);
-									}
-								}
-							}
-						}
-					}
-				}
-			}
-			throw new ELException("Can't find: " + varName); //$NON-NLS-1$
-		}
-
-	}
-
-	static class EmptyFunctionMapper implements FunctionMapper {
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see javax.servlet.jsp.el.FunctionMapper#resolveFunction(java.lang.String,
-		 *      java.lang.String)
-		 */
-		public Method resolveFunction(String arg0, String arg1) {
-			return null;
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewConvertContext.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewConvertContext.java
deleted file mode 100644
index 4c0b2f7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewConvertContext.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.preview;
-
-import java.util.List;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.converter.ConvertPosition;
-import org.eclipse.jst.pagedesigner.converter.IConverterFactory;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.eclipse.jst.pagedesigner.dtmanager.DTManager;
-import org.eclipse.wst.xml.core.internal.document.InvalidCharacterException;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMText;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PreviewConvertContext {
-	private Logger _log = PDPlugin.getLogger(PreviewConvertContext.class);
-
-	private IDOMDocument _destDocument;
-
-	/**
-	 * Instantiates an instance for the specified IDOMDocument.
-	 * 
-	 * @param destDocument IDOMDocument instance.
-	 */
-	public PreviewConvertContext(IDOMDocument destDocument) {
-		this._destDocument = destDocument;
-	}
-
-	/**
-	 * Converts specified Node for preview.
-	 * 
-	 * @param ele Node instance to convert.
-	 * @return Converted Node instance.
-	 */
-	public Node previewConvert(Node ele) {
-		if (ele instanceof Element) {
-			return previewConvertElement((Element) ele);
-		} else if (ele instanceof Text) {
-			return createText((Text) ele);
-		} else {
-			// XXX: we'll support other node like doctype etc in the future.
-			// so they should also be rendered into preview.
-
-			return null;
-		}
-	}
-
-	/**
-	 * @param text
-	 * @return
-	 */
-	private Node createText(Text text) {
-		Text previewText = this._destDocument.createTextNode(text.getData());
-		try {
-			((IDOMText) previewText).setSource(((IDOMText) text).getSource());
-		} catch (InvalidCharacterException e) {
-			// "Error"
-			_log.info("PreviewConvertContext.Error.0", e); //$NON-NLS-1$
-		}
-		return previewText;
-	}
-
-	/**
-	 * Converts specified Element instance for preview.
-	 * 
-	 * @param ele Element instance to be converted.
-	 * @return Converted Node instance.
-	 */
-	protected Node previewConvertElement(Element ele) {
-		ITagConverter converter = createTagConverter(ele);
-		if (!converter.isVisualByHTML()) {
-			return null;
-		}
-		converter.convertRefresh(null);
-		Element result = converter.getResultElement();
-		List children = converter.getChildModeList();
-		if (children != null) {
-			for (int i = 0, size = children.size(); i < size; i++) {
-				Node child = (Node) children.get(i);
-				if (child != null) {
-					Node childPreview = previewConvert(child);
-					if (childPreview != null) {
-						ConvertPosition position = converter
-								.getChildVisualPosition(child);
-						if (position != null) {
-							/* FIX for bug #179403
-							// FIXME: not using index here, need fix.
-							position.getParentNode().appendChild(childPreview);
-							*/
-							NodeList childNodes = position.getParentNode().getChildNodes();
-							if (childNodes.getLength() > position.getIndex()) {
-								Node item = childNodes.item(position.getIndex());
-								position.getParentNode().insertBefore(childPreview, item);
-							} else {
-								position.getParentNode().appendChild(childPreview);
-							}
-						}
-					}
-				}
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @param ele
-	 * @return
-	 */
-	private ITagConverter createTagConverter(Element ele) {
-		return DTManager.getInstance().getTagConverter(ele,
-				IConverterFactory.MODE_PREVIEW, _destDocument);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewHandlerNew.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewHandlerNew.java
deleted file mode 100644
index 16c5a34..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewHandlerNew.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.preview;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.IPageVariablesProvider;
-import org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter.IDocumentPageVariableAdapter;
-import org.eclipse.jst.pagedesigner.parts.DocumentEditPart;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.utils.PreviewUtil;
-import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
-import org.eclipse.wst.html.core.internal.provisional.contenttype.ContentTypeIdForHTML;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.xml.core.internal.document.XMLGeneratorImpl;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.ISourceGenerator;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PreviewHandlerNew {
-	//private static Logger _log = PDPlugin.getLogger(PreviewHandlerNew.class);
-
-	/**
-	 * @param part
-	 * @param result
-	 */
-	public static void generatePreview(DocumentEditPart part,
-			StringBuffer result) {
-		try {
-			IProject prj = StructuredModelUtil.getProjectFor(part.getIDOMNode()
-					.getModel());
-			PageExpressionContext.initialize(prj);
-
-			IDOMDocument doc = (IDOMDocument) part.getIDOMNode();
-			Object obj = doc.getAdapterFor(IDocumentPageVariableAdapter.class);
-			if (obj instanceof IPageVariablesProvider) {
-				((IPageVariablesProvider) obj).refresh();
-				PageExpressionContext.getCurrent().pushPageVarProvider(
-						(IPageVariablesProvider) obj);
-			} else {
-				PageExpressionContext.getCurrent().pushPageVarProvider(null);
-			}
-
-			// IDOMModel previewModel =
-			// (IDOMModel)StructuredModelManager.getModelManager().createNewInstance(doc.getModel());
-			// IDOMDocument previewDoc = previewModel.getDocument();
-
-			// CR400625: creating XML model here instead of HTML model. Since
-			// for HTML model, there are checking enforced
-			// by WTP to make sure the HTML content model is not invalidated.
-			// And sometimes, the converted HTML may not fully
-			// comply with HTML content model.
-			// Use XML instead to workaround the content model validation.
-
-			// CR403449: But if we use XML, then system can't recogonize special
-			// tag such as "script", "style", they
-			// support <!-- --> in them.
-			// So we are still using HTML model, but in TagConverter, we are
-			// always caling DOMUtil.cloneNodeDeepIgnoreError
-			// to try to skip the errors.
-			// Hopefully in later version of SSE, the famous "br" problem is
-			// fixed, and we won't met error when doing
-			// deep clone.
-			// IStructuredModel sModel =
-			// StructuredModelManager.getModelManager().createUnManagedStructuredModelFor(IContentTypeIdentifier.ContentTypeID_XML);
-			// FIXME: if is not jsp, should use original contentType, if is jsp,
-			// should use the corresponding
-			// content type
-			IStructuredModel sModel = StructuredModelManager.getModelManager()
-					.createUnManagedStructuredModelFor(
-							ContentTypeIdForHTML.ContentTypeID_HTML);
-
-			IDOMDocument previewDoc = ((IDOMModel) sModel).getDocument();
-			PreviewConvertContext context = new PreviewConvertContext(
-					previewDoc);
-
-			ISourceGenerator generator = XMLGeneratorImpl.getInstance();
-			List subeditparts = part.getChildren();
-			for (int i = 0, size = subeditparts.size(); i < size; i++) {
-				NodeEditPart subpart = (NodeEditPart) subeditparts.get(i);
-				Node node = context.previewConvert(subpart.getIDOMNode());
-
-				PreviewUtil.previewNode(node);
-
-				if (node != null) {
-					result.append(generator.generateSource(node));
-				}
-
-			}
-			sModel.releaseFromEdit();
-		} finally {
-			PageExpressionContext.reset();
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewResources.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewResources.java
deleted file mode 100644
index bae36d9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewResources.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.preview;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.ResourceUtils;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-
-/**
- * @author mengbo
- */
-public class PreviewResources extends ResourceUtils {
-	/** Create the logger for this class */
-	private static Logger _log = PDPlugin.getLogger(PreviewResources.class);
-
-	private static PreviewResources _resource; // singleton
-
-	private static final String BUNDLE = "org.eclipse.jst.pagedesigner.preview.PreviewResources";
-
-	/**
-	 * Empty Constructor.
-	 * 
-	 * @return WizardsResources
-	 */
-
-	public static PreviewResources getInstance() {
-		if (_resource == null) {
-			_resource = new PreviewResources();
-		}
-		return _resource;
-	}
-
-	/**
-	 * The constructor create a resource bundle
-	 */
-	protected PreviewResources() {
-		try {
-			_resources = ResourceBundle.getBundle(BUNDLE);
-			// NOTE: this throws a runtime "MissingResourceException".
-		} catch (MissingResourceException ee) {
-			_log
-					.error(
-							"Log.Error.PreviewResources.ResouceNotFound", BUNDLE, ee); //$NON-NLS-1$
-		}
-		setBundle(_resources, BUNDLE);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewResources.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewResources.properties
deleted file mode 100644
index 1e42ee3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PreviewResources.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-####################################################
-# Resource message for RenderingTraverser
-####################################################
-RenderingTraverser.Error.FileNotFound		=	File not found.
-RenderingTraverser.Error.UnsupportedEncoding	=	Unsupport encoding.
-RenderingTraverser.Error.IO		=	IO exception.
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/WindowsIEBrowser.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/WindowsIEBrowser.java
deleted file mode 100644
index 2901f70..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/WindowsIEBrowser.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.preview;
-
-import java.io.File;
-
-import org.eclipse.swt.browser.Browser;
-import org.eclipse.swt.browser.ProgressEvent;
-import org.eclipse.swt.browser.ProgressListener;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * Models the windows IE browser for preview
- *
- */
-public class WindowsIEBrowser implements ProgressListener {
-	private Browser _browser;
-
-	/**
-	 * @param composite
-	 * @param i
-	 */
-	public void create(Composite composite, int i) {
-		_browser = new Browser(composite, i);
-		_browser.addProgressListener(this);
-	}
-
-	/**
-	 * @param file
-	 */
-	public synchronized void loadFile(File file) {
-		if (_browser == null) {
-			return;
-		}
-        String s = "file:" + file.getAbsolutePath();
-        _browser.setUrl(s);
-        return;
-	}
-
-	/**
-	 * dispose the instance
-	 */
-	public void dispose() {
-		if (_browser == null) {
-			return;
-		}
-        _browser.dispose();
-        _browser = null;
-        return;
-	}
-
-	public void changed(ProgressEvent progressevent) {
-        // do nothing
-	}
-
-	public void completed(ProgressEvent progressevent) {
-	    // do nothing
-	}
-
-	/**
-	 * @return the underlying swt Browser instance
-	 */
-	public Browser getBrowser() {
-		return _browser;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/AllPropertySection.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/AllPropertySection.java
deleted file mode 100644
index 3c40094..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/AllPropertySection.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.layout.FormAttachment;
-import org.eclipse.swt.layout.FormData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.IPropertySourceProvider;
-import org.eclipse.ui.views.properties.tabbed.AbstractPropertySection;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * Mainly copied from AdvancedPropertySection. But extend it to allow setting
- * PropertySourceProvider.
- * 
- * @author mengbo
- */
-public class AllPropertySection extends AbstractPropertySection {
-	// FIXME: workaround the eclipse properties view limitation of sorting
-	// category.
-	private AttributePropertySheetPage page;
-
-	/**
-	 * IPropertySourceProvider for this section
-	 */
-	protected IPropertySourceProvider _provider;
-
-	/**
-	 * selected tag IDOMElement 
-	 */
-	protected IDOMElement _element;
-
-	/**
-	 * The INodeAdapter to use for notification of model change
-	 */
-	protected INodeAdapter _adapter = new INodeAdapter() {
-		public boolean isAdapterForType(Object type) {
-			return false;
-		}
-
-		public void notifyChanged(INodeNotifier notifier, int eventType,
-				Object changedFeature, Object oldValue, Object newValue, int pos) {
-			refresh();
-		}
-	};
-
-	/**
-	 * Constructor
-	 */
-	public AllPropertySection() {
-		this.setPropertySourceProvider(new AttributePropertySourceProvider());
-	}
-
-	@Override
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage tabbedPropertySheetPage) {
-		super.createControls(parent, tabbedPropertySheetPage);
-		
-	
-		Composite composite = getWidgetFactory()
-				.createFlatFormComposite(parent);
-		page = new AttributePropertySheetPage();
-		page.init(tabbedPropertySheetPage.getSite());
-
-		if (_provider != null) {
-			page.setPropertySourceProvider(_provider);
-		}
-
-		page.createControl(composite);
-		FormData data = new FormData();
-		data.left = new FormAttachment(0, 0);
-		data.right = new FormAttachment(100, 0);
-		data.top = new FormAttachment(0, 0);
-		data.bottom = new FormAttachment(100, 0);
-		data.height = 100;
-		data.width = 100;
-		page.getControl().setLayoutData(data);
-	}
-
-	@Override
-	public void setInput(IWorkbenchPart part, ISelection selection) {
-		IDOMElement newEle = (IDOMElement) DesignerPropertyTool.getElement(
-				part, selection);
-
-		if (_element != newEle && page != null) {
-			super.setInput(part, selection);
-			page.selectionChanged(part, selection);
-			if (_element != null) {
-				_element.removeAdapter(_adapter);
-			}
-			_element = newEle;
-			if (_element != null) {
-				_element.addAdapter(_adapter);
-			}
-		}
-	}
-
-	@Override
-	public void dispose() {
-		super.dispose();
-
-		if (_element != null) {
-			_element.removeAdapter(_adapter);
-		}
-		if (page != null) {
-			page.dispose();
-			page = null;
-		}
-	}
-
-	@Override
-	public void refresh() {
-		if (page != null)
-			page.refresh();
-	}
-
-	@Override
-	public boolean shouldUseExtraSpace() {
-		return true;
-	}
-
-	/**
-	 * Set provider into tabbedPropertiesPage
-	 * @param provider
-	 */
-	public void setPropertySourceProvider(IPropertySourceProvider provider) {
-		_provider = provider;
-		if (page != null){
-			page.setPropertySourceProvider(_provider);
-
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/AttributePropertySheetPage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/AttributePropertySheetPage.java
deleted file mode 100644
index 9b236f9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/AttributePropertySheetPage.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties;
-
-import org.eclipse.jst.pagedesigner.meta.internal.CategoryNameComparator;
-import org.eclipse.ui.views.properties.PropertySheetPage;
-import org.eclipse.ui.views.properties.PropertySheetSorter;
-
-/**
- * In PropertySheetPage, the <code>setSorter</code> is protected. Creating
- * this class to make setSorter accessible to us.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class AttributePropertySheetPage extends PropertySheetPage {
-//	TODO: add actions
-//	public void makeContributions(IMenuManager menuManager,
-//			IToolBarManager toolBarManager, IStatusLineManager statusLineManager) {
-//		super.makeContributions(menuManager, toolBarManager, statusLineManager);
-//		//add actions here
-//			hide/show all categories
-//			collapse
-//			remove
-//	}
-
-	/**
-	 * Use my sorter to sort the category name. Only override the
-	 * compareCategories method.
-	 * 
-	 * @author mengbo
-	 * @version 1.5
-	 */
-	private static class MySorter extends PropertySheetSorter {
-		public int compareCategories(String categoryA, String categoryB) {
-			return CategoryNameComparator.getInstance().compare(categoryA,
-					categoryB);
-		}
-	}
-
-	/**
-	 * Constructor
-	 */
-	public AttributePropertySheetPage() {
-		super();
-		setSorter(new MySorter());
-	}
-
-//	public void createControl(Composite parent) {
-//		super.createControl(parent);
-////		PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(),
-////				PDPlugin.getResourceString("MyPropertySheetPage.help.id"));
-//	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/AttributePropertySource.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/AttributePropertySource.java
deleted file mode 100644
index 2f128d1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/AttributePropertySource.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.properties;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.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.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.jsf.metadataprocessors.MetaDataEnabledProcessingFactory;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeAttributeCommand;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.ui.views.properties.IPropertySource;
-import org.eclipse.ui.views.properties.PropertyDescriptor;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-
-/**
- * 
- * @author mengbo
- */
-public class AttributePropertySource implements IPropertySource {
-	private IDOMElement _element;
-
-	private IPropertySource _innerSource;
-
-	private Entity _tagEntity;
-
-	private IStructuredDocumentContext _context;
-
-	private IPropertyDescriptor[] _descriptors;
-
-	/**
-	 * Constructor
-	 * @param ele
-	 * @param source
-	 */
-	public AttributePropertySource(Element ele, IPropertySource source) {
-		_element = (IDOMElement) ele;
-		_innerSource = source;
-		_tagEntity = getTagEntity();
-	}
-
-	private Entity getTagEntity() {
-		_context = 
-				IStructuredDocumentContextFactory.INSTANCE.getContext(_element.getStructuredDocument(), _element);
-		if (_context == null) 
-			return null;
-		
-		IWorkspaceContextResolver wsresolver = 
-				IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(_context);
-		if (wsresolver == null) 
-			return null;
-		
-		ITaglibContextResolver resolver = 
-				IStructuredDocumentContextResolverFactory.INSTANCE.getTaglibContextResolver(_context);
-		if (resolver == null) return null;
-		
-		String uri = resolver.getTagURIForNodeName(_element);
-		
-		//TODO: make below better
-		if (uri == null){
-			if (_element.getNamespaceURI() != null && _element.getNamespaceURI().equals("http://java.sun.com/JSP/Page")) //$NON-NLS-1$
-				uri = "JSP11"; //$NON-NLS-1$
-			else
-				uri = "HTML"; //$NON-NLS-1$
-		}
-		ITaglibDomainMetaDataModelContext domainContext = 
-				TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(wsresolver.getProject(), uri);
-		return TaglibDomainMetaDataQueryHelper.getEntity(domainContext, _element.getLocalName());		
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertySource#getEditableValue()
-	 */
-	public Object getEditableValue() {
-		return _innerSource.getEditableValue();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(java.lang.Object)
-	 */
-	public Object getPropertyValue(Object id) {
-		// CR377844: when the attribute in source is "a&gt;b", we would like to
-		// display
-		// "a>b" in cell editor. But _innerSource.getPropertyValue(id) will
-		// return the source
-		// of the attribute, so can't use that here.
-		// read QTS log for detail.
-		// return _innerSource.getPropertyValue(id);
-		if (id == null) {
-			return null;
-		}
-		String name = id.toString();
-		String value = _element.getAttribute(name);
-		if (value == null) {
-			value = ""; //$NON-NLS-1$
-		}
-		return value;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertySource#isPropertySet(java.lang.Object)
-	 */
-	public boolean isPropertySet(Object id) {
-		return _innerSource.isPropertySet(id);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertySource#resetPropertyValue(java.lang.Object)
-	 */
-	public void resetPropertyValue(Object id) {
-		_innerSource.resetPropertyValue(id);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertySource#setPropertyValue(java.lang.Object,
-	 *      java.lang.Object)
-	 */
-	public void setPropertyValue(final Object id, final Object value) {
-		Object oldValue = getPropertyValue(id);
-		if (oldValue == value || (oldValue != null && oldValue.equals(value))) {
-			return;
-		}
-		Command c = new ChangeAttributeCommand(
-				PDPlugin
-						.getResourceString("AttributePropertySource.CommandLabel.ChangeAttribute"), _element, (String) id, (String) value); //$NON-NLS-1$
-		c.execute();
-	}
-
-	/**
-	 * the major job of this wrapper is to provide
-	 */
-	public IPropertyDescriptor[] getPropertyDescriptors() {
-		if (_descriptors == null) {
-			List result = new ArrayList();
-	
-				IPropertyDescriptor[] descs = _innerSource.getPropertyDescriptors();
-				if (descs != null) {
-					for (int i = 0; i < descs.length; i++) {
-						IPropertyDescriptor pd = getAttrPropertyDescriptor((String)descs[i].getId());
-						if (pd != null)
-							result.add(new PropertyDescriptorWrapper(
-									_element,
-									pd));//, 
-									//getStatusLineManager()));
-						else {
-							if (descs[i] instanceof PropertyDescriptor)
-								((PropertyDescriptor)descs[i]).setCategory(ITabbedPropertiesConstants.OTHER_CATEGORY);
-							result.add(new PropertyDescriptorWrapper(
-									_element, 
-									descs[i]));//, 
-									//getStatusLineManager()));
-						}
-							
-					}
-				}
-	
-			_descriptors = new IPropertyDescriptor[result.size()];
-			result.toArray(_descriptors);
-			
-		}
-		return _descriptors;
-	}
-
-//	private IAttributeDescriptor findReferencedAttribute(
-//			IElementDescriptor elementDescriptor, IPropertyDescriptor desc) {
-//		return null;
-//	}
-
-//	private IElementDescriptor getElementDescriptor() {
-//		ICMRegistry registry = CMRegistry.getInstance();
-//		String uri = CMUtil.getElementNamespaceURI(_element);
-//		return registry.getElementDescriptor(uri, _element.getLocalName());
-//	}
-
-	private IPropertyDescriptor getAttrPropertyDescriptor(String attrName){
-		Entity attrEntity = TaglibDomainMetaDataQueryHelper.getEntity(_tagEntity, attrName);
-		List ppds = MetaDataEnabledProcessingFactory.getInstance().getAttributeValueRuntimeTypeFeatureProcessors(IPropertyPageDescriptor.class, _context, attrEntity);
-		if (ppds.size() > 0)
-			return (IPropertyDescriptor)((IPropertyPageDescriptor)ppds.get(0)).getAdapter(IPropertyDescriptor.class);
-		
-		return null;
-			
-	}
-	
-//	private IStatusLineManager getStatusLineManager() {
-//		_page.getSite().getActionBars().getStatusLineManager();
-//	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/AttributePropertySourceProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/AttributePropertySourceProvider.java
deleted file mode 100644
index 086072b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/AttributePropertySourceProvider.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties;
-
-import org.eclipse.ui.views.properties.IPropertySource;
-import org.eclipse.ui.views.properties.IPropertySourceProvider;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.ui.internal.properties.XMLPropertySource;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class AttributePropertySourceProvider implements IPropertySourceProvider {
-
-	/**
-	 * Constructor
-	 */
-	public AttributePropertySourceProvider() {
-		//
-	}
-
-	public IPropertySource getPropertySource(Object object) {
-		Element model = null;
-		IPropertySource source = null;
-
-		if ((model = DesignerPropertyTool.getElementNode(object)) != null) {
-			source = (IPropertySource) ((INodeNotifier) (model))
-					.getAdapterFor(IPropertySource.class);
-			if (source == null) {
-				source = new XMLPropertySource((INodeNotifier) model);
-			}
-		}
-		if (source != null) {
-			return new AttributePropertySource( model, source);
-		}
-		return source;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/BaseCustomSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/BaseCustomSection.java
deleted file mode 100644
index db8742d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/BaseCustomSection.java
+++ /dev/null
@@ -1,258 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StatusUtil;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IFileEditorInput;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.AbstractPropertySection;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public abstract class BaseCustomSection extends AbstractPropertySection {
-
-	/**
-	 * Status that all is OK
-	 */
-	protected static final Status OKSTATUS = new Status(IStatus.OK, PDPlugin
-			.getPluginId(), 0, "", null); //$NON-NLS-1$
-
-	private WPETabbedPropertySheetPage _propertySheetPage;
-
-	private boolean _visible = false;
-
-	/**
-	 * the tag IDOMElement
-	 */
-	protected IDOMElement _element;
-
-	/**
-	 * the INodeAdapter used to receive notifications of model updates
-	 */
-	protected INodeAdapter _adapter = new INodeAdapter() {
-		public boolean isAdapterForType(Object type) {
-			return false;
-		}
-
-		public void notifyChanged(INodeNotifier notifier, int eventType,
-				Object changedFeature, Object oldValue, Object newValue, int pos) {
-			BaseCustomSection.this.notifyChanged(notifier, eventType,
-					changedFeature, oldValue, newValue, pos);
-		}
-	};
-
-	public void setInput(IWorkbenchPart part, ISelection selection) {
-		super.setInput(part, selection);
-		IDOMElement newEle = (IDOMElement) DesignerPropertyTool.getElement(
-				part, selection);
-		if (_element != newEle) {
-			if (_element != null) {
-				_element.removeAdapter(_adapter);
-			}
-			_element = newEle;
-			if (_element != null) {
-				_element.addAdapter(_adapter);
-			}
-		}
-	}
-
-	/**
-	 * Method adapter will call when element has changed
-	 * 
-	 * @param notifier
-	 * @param eventType
-	 * @param changedFeature
-	 * @param oldValue
-	 * @param newValue
-	 * @param pos
-	 */
-	protected abstract void notifyChanged(INodeNotifier notifier,
-			int eventType, Object changedFeature, Object oldValue,
-			Object newValue, int pos);
-
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage aTabbedPropertySheetPage) {
-		super.createControls(parent, aTabbedPropertySheetPage);
-		_propertySheetPage = (WPETabbedPropertySheetPage) aTabbedPropertySheetPage;
-	}
-
-	/**
-	 * for certain action performed in the section, may result big change in the
-	 * model. e.g: change tag name will result in editpart recreate. In this
-	 * case, we need do a total refresh.
-	 * 
-	 */
-	protected void refreshPropertySheetPage() {
-		if (_propertySheetPage != null) {
-			IWorkbenchPart part = getPart();
-			if (part != null) {
-				ISelection sel = part.getSite().getSelectionProvider()
-						.getSelection();
-				_propertySheetPage.selectionChanged(part, sel);
-			} else {
-				// XXX: will else happen?
-				System.out.println("AbstractCustomSection --> What to do?"); //$NON-NLS-1$
-			}
-		}
-	}
-
-	/**
-	 * Change selection
-	 * @param node
-	 */
-	protected void gotoNode(Node node) {
-		_propertySheetPage.internalChangeSelection(node, node);
-	}
-
-	/**
-	 * @return IStatusLineManager to use for the property sheet page
-	 */
-	protected IStatusLineManager getStatusLineManager() {
-		if (_propertySheetPage != null) {
-			IActionBars bar = _propertySheetPage.getSite().getActionBars();
-			if (bar != null) {
-				return bar.getStatusLineManager();
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param status to display on status line
-	 */
-	protected void applyStatus(IStatus[] status) {
-		if (!_visible) {
-			return;
-		}
-
-		IStatusLineManager statusLine = getStatusLineManager();
-		if (statusLine == null) {
-			return;
-		}
-
-		IStatus s;
-		if (status == null || status.length == 0) {
-			s = null;
-		} else {
-			s = StatusUtil.getMostSevere(status);
-		}
-
-		if (s == null || s.getSeverity() != IStatus.ERROR) {
-			statusLine.setErrorMessage(null);
-		} else {
-			statusLine.setErrorMessage(s.getMessage());
-		}
-	}
-
-	/**
-	 * @param message
-	 */
-	protected void setErrorMessage(String message) {
-		IStatusLineManager s = getStatusLineManager();
-		if (s != null) {
-			s.setErrorMessage(message);
-		}
-	}
-
-	/**
-	 * @param message
-	 * @return Status
-	 */
-	protected Status createErrorStatus(String message) {
-		return new Status(IStatus.ERROR, PDPlugin.getPluginId(), 0, message,
-				null);
-	}
-
-	public void aboutToBeHidden() {
-		applyStatus(null);
-		_visible = false;
-//		IDOMElement newEle = (IDOMElement) DesignerPropertyTool.getElement(
-//				part, selection);
-//		if (_element != newEle) {
-			if (_element != null) {
-				_element.removeAdapter(_adapter);
-			}
-//			_element = newEle;
-//			if (_element != null) {
-//				_element.addAdapter(_adapter);
-//			}
-//		}
-		super.aboutToBeHidden();
-	}
-
-	public void aboutToBeShown() {
-		super.aboutToBeShown();
-//		IDOMElement newEle = (IDOMElement) DesignerPropertyTool.getElement(
-//				part, selection);
-//		if (_element != newEle) {
-//			if (_element != null) {
-//				_element.removeAdapter(_adapter);
-//			}
-//			_element = newEle;
-			if (_element != null) {
-				_element.addAdapter(_adapter);
-			}
-//		}
-		_visible = true;
-	}
-
-	/**
-	 * @return IProject for the WPE editing instance
-	 */
-	protected IProject getProject() {
-		if (_propertySheetPage != null) {
-			IEditorInput input = _propertySheetPage.getEditor()
-					.getEditorInput();
-			if (input instanceof IFileEditorInput) {
-				return ((IFileEditorInput) input).getFile().getProject();
-			}
-		}
-		return null;
-	}
-
-	public void dispose() {
-		super.dispose();
-		if (_element != null) {
-			_element.removeAdapter(_adapter);
-		}
-	}
-
-	/**
-	 * @return IFile for WPE editing instance
-	 */
-	protected IFile getFile() {
-		if (_propertySheetPage != null) {
-			IEditorInput input = _propertySheetPage.getEditor()
-					.getEditorInput();
-			if (input instanceof IFileEditorInput) {
-				return ((IFileEditorInput) input).getFile();
-			}
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/DesignerPropertyTool.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/DesignerPropertyTool.java
deleted file mode 100644
index d32d534..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/DesignerPropertyTool.java
+++ /dev/null
@@ -1,356 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IProjectNature;
-import org.eclipse.gef.editparts.AbstractEditPart;
-import org.eclipse.gef.ui.parts.GraphicalEditor;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.jst.pagedesigner.utils.SelectionHelper;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.editors.text.TextEditor;
-import org.eclipse.ui.views.contentoutline.ContentOutline;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
-import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
-import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Attr;
-import org.w3c.dom.CDATASection;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * This is util class most used by Property related operation.
- * 
- * @author mengbo
- */
-public class DesignerPropertyTool {
-	
-	/**
-	 * @param fNode
-	 * @param attributeDesc
-	 * @return attribute value
-	 */
-	public static String getAttributeValue(Element fNode, CMNode attributeDesc) {
-		if (attributeDesc == null) {
-			return ""; //$NON-NLS-1$
-		}
-		String returnedValue = ""; //$NON-NLS-1$
-		NamedNodeMap attrMap = fNode.getAttributes();
-		if (attrMap != null) {
-			Node attribute = attrMap.getNamedItem(attributeDesc.getNodeName());
-			if (attribute != null) {
-				if (attribute instanceof IDOMNode) {
-					returnedValue = ((IDOMNode) attribute).getValueSource();
-				} else {
-					returnedValue = attribute.getNodeValue();
-				}
-			}
-		}
-		return returnedValue;
-	}
-
-//	/**
-//	 * @param fNode
-//	 * @param filter
-//	 * @return array of attributes as objects
-//   * (unused)	
-//	 */
-//	public static Object[] getElementReferedAttributes(Element fNode,
-//			String[] filter) {
-//		List result = new ArrayList();
-//		CMNamedNodeMap cmnnm = getElementDeclaredAttributes(fNode);
-//		for (int i = 0, n = cmnnm.getLength(); i < n; i++) {
-//			String name = cmnnm.item(i).getNodeName();
-//			if (Arrays.asList(filter).contains(name)) {
-//				result.add(cmnnm.item(i));
-//			}
-//		}
-//		return result.toArray(new CMNode[result.size()]);
-//	}
-
-	/**
-	 * @param fNode
-	 * @return CMNamedNodeMap
-	 */
-	public static CMNamedNodeMap getElementDeclaredAttributes(Node fNode) {
-		IStructuredModel structModel = null;
-		if (fNode instanceof IDOMNode) {
-			structModel = ((IDOMNode) fNode).getModel();
-		}
-		if (null == structModel) {
-			return null;
-		}
-		CMElementDeclaration cmde = null;
-		CMNamedNodeMap cmnnm = null;
-		if (fNode == null || fNode.getNodeType() != Node.ELEMENT_NODE) {
-			cmde = null;
-		}
-		ModelQuery modelQuery = ModelQueryUtil.getModelQuery(fNode
-				.getOwnerDocument());
-		if (modelQuery != null) {
-			cmde = modelQuery.getCMElementDeclaration((Element) fNode);
-		}
-		if (cmde != null) {
-			cmnnm = cmde.getAttributes();
-		}
-		return cmnnm;
-	}
-
-	/**
-	 * the selection could be different kinds of selection, including: 1.
-	 * ITextSelection 2. IStructuredSelection (Node) 3. IStructuredSelection
-	 * (EditPart) 4. DesignRange we want to normalize it to only #2. If the node
-	 * is ATTR or TEXT/CDATA_SECTION, will use it's parent node.
-	 * 
-	 * @param selectingPart
-	 * @param selection
-	 * @param htmlEditor
-	 * @return null if can't normalize.
-	 */
-	public static Node normalizeSelectionToElement(
-			IWorkbenchPart selectingPart, ISelection selection,
-			HTMLEditor htmlEditor) {
-		
-		Node node = null;
-		if (selectingPart instanceof HTMLEditor) {
-			IEditorPart part = ((HTMLEditor) selectingPart).getActiveEditor();
-			if (part instanceof TextEditor) {
-				if (selection instanceof ITextSelection) {
-					IStructuredModel model = ((HTMLEditor) selectingPart)
-							.getModel();
-					node = SelectionHelper.toNode(model,
-							(ITextSelection) selection);
-				}
-			} else if (part instanceof GraphicalEditor) {
-				if (selection instanceof IStructuredSelection) {
-					node = SelectionHelper
-							.toNode((IStructuredSelection) selection);
-				} else if (selection instanceof DesignRange) {
-					node = SelectionHelper.toNode((DesignRange) selection);
-				}
-			}
-			if (node instanceof Attr) {
-				node = ((Attr) node).getOwnerElement();
-			} else if (node instanceof Text || node instanceof CDATASection) {
-				node = node.getParentNode();
-			}
-		} else if (selectingPart instanceof ContentOutline) {
-			if (selection instanceof IStructuredSelection
-					&& ((ContentOutline) selectingPart).getCurrentPage() != null
-					&& ((ContentOutline) selectingPart).getCurrentPage()
-							.getControl().isFocusControl()) {
-				node = SelectionHelper.toNode((IStructuredSelection) selection);
-				if (node == null) {
-					node = htmlEditor.getDOMDocument();
-				}
-			}
-		}
-
-		return node;
-	}
-
-	/**
-	 * @param node as Object
-	 * @return element 
-	 */
-	public static Element getElementNode(Object node) {
-		Object model;
-		Element element = null;
-		if (node == null) {
-			return null;
-		}
-
-		if (node instanceof Element) {
-			element = (Element) node;
-		} else if (node instanceof AbstractEditPart) {
-			model = ((AbstractEditPart) node).getModel();
-			if (model instanceof Element) {
-				element = (Element) model;
-			}
-		} else if (node instanceof ISelection) {
-			element = getElement(null, (ISelection) node);
-		}
-		return element;
-	}
-
-	/**
-	 * @param element
-	 * @param filter
-	 * @return list of attribute names
-	 */
-	public static List getNameList(Element element, String[] filter) {
-		List result = new ArrayList();
-		CMNamedNodeMap attributes = getElementDeclaredAttributes(element);
-		if (attributes != null) {
-			for (int i = 0, n = attributes.getLength(); i < n; i++) {
-				String name = attributes.item(i).getNodeName();
-				if (Arrays.asList(filter).contains(name))
-					result.add(name);
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @param selection
-	 *            should be a normalized selection
-	 * @return node
-	 */
-	public static Node getCommonParent(ISelection selection) {
-		if (selection instanceof IStructuredSelection) {
-			Object obj = ((IStructuredSelection) selection).getFirstElement();
-			return (Node) obj;
-		} else if (selection instanceof DesignRange) {
-			DesignRange range = (DesignRange) selection;
-			Node node1 = range.getStartPosition().getContainerNode();
-			Node node2 = range.getEndPosition().getContainerNode();
-			return DOMUtil.findCommonAncester(node1, node2);
-		} else {
-			// should not happen
-			return null;
-		}
-	}
-
-	/**
-	 * The passed in selection should be normalized selection.
-	 * 
-	 * @param selectingPart
-	 * @param selection
-	 * @return element
-	 */
-	public static Element getElement(IWorkbenchPart selectingPart,
-			ISelection selection) {
-		Node node = getCommonParent(selection);
-		if (node instanceof Element) {
-			return (Element) node;
-		} else if (node != null) {
-			node = node.getParentNode();
-			if (node instanceof Element) {
-				return (Element) node;
-			}
-		}
-		return null;
-	}
-
-	// reserved for future native use.
-	// public static void dumpChildren(Element element)
-	// {
-	// // In this function we are using logger to dump message out.
-	// Logger logger = PDPlugin.getLogger(DesignerPropertyTool.class);
-	// if (element == null || !DEBUG)
-	// return;
-	// NodeList nl = element.getChildNodes();
-	// // It's our pattern for dumping message
-	// logger.debug("\n----------------------------"); //$NON-NLS-1$
-	// logger.debug("Element:" + element.getNodeName()); //$NON-NLS-1$
-	// for (int i = 0; i < nl.getLength(); i++)
-	// {
-	// Node node = nl.item(i);
-	// logger.debug("child[" + i + "]:" + node.getNodeName()); //$NON-NLS-1$
-	// //$NON-NLS-2$
-	// }
-	// logger.debug("----------------------------\n"); //$NON-NLS-1$
-	// }
-
-	/**
-	 * @param element
-	 * @return bool
-	 *  (unused)
-	 */
-	public static boolean isMultiSelection(Element element) {
-		if (element.getNodeName().equalsIgnoreCase(IHTMLConstants.TAG_OPTION)) {
-			return element.getAttribute(ICSSPropertyID.ATTR_MULTIPLE) != null;
-		}
-		return false;
-	}
-
-//	/**
-//	 * @param element
-//	 * @return if elementImpl, return source, else null
-//	 * (unused)
-//	 */
-//	public static String getElementTextSource(Element element) {
-//		if (element == null) {
-//			return null;
-//		}
-//		if (element instanceof ElementImpl) {
-//			return ((ElementImpl) element).getSource();
-//		}
-//		return null;
-//	}
-
-	/**
-	 * @param project
-	 * @return IJavaProject
-	 */
-	public static IJavaProject getJavaProject(Object project) {
-		if (project == null) {
-			return null;
-		}
-		if (project instanceof IJavaProject) {
-			return (IJavaProject) project;
-		} else if (project instanceof IProject) {
-			try {
-				IProjectNature nature = ((IProject) project)
-						.getNature(JavaCore.NATURE_ID);
-				if (nature == null) {
-					return null;
-				}
-                return (IJavaProject) nature;
-			} catch (Exception e) {
-				// Error.DesignerPropertyTool.NatureQuerying = Error in project
-				// java nature querying
-				PDPlugin.getLogger(DesignerPropertyTool.class).error(
-						"Error.DesignerPropertyTool.NatureQuerying", e); //$NON-NLS-1$
-				// Should be error tolerable?
-				return null;
-			}
-		}
-		return null;
-	}
-//
-//	/**
-//	 * @param project as Object
-//	 * @return IProject or null
-//	 */
-//	public static IProject getProject(Object project) {
-//		if (project instanceof IProject) {
-//			return (IProject) project;
-//		} else if (project instanceof IJavaProject) {
-//			return ((IJavaProject) project).getProject();
-//		}
-//		return null;
-//	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/ISectionFilter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/ISectionFilter.java
deleted file mode 100644
index 95591e8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/ISectionFilter.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties;
-
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- * @deprecated  unused
- */
-public interface ISectionFilter {
-
-	/**
-	 * @param node
-	 * @return true if node applies
-	 */
-	boolean appliesTo(Element node);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/ITabbedPropertiesConstants.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/ITabbedPropertiesConstants.java
deleted file mode 100644
index 233923a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/ITabbedPropertiesConstants.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public interface ITabbedPropertiesConstants {
-
-	// FIXME: when return null, will in fact using "Misc". This may not guarantee
-	// it be the
-	// last category, since is sorted by string order.
-	/**
-	 * the other category
-	 */
-	static final String OTHER_CATEGORY = Messages.ITabbedPropertiesConstants_other_category;
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/Messages.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/Messages.java
deleted file mode 100644
index a99a43c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/Messages.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Externalized Strings
- *
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.pagedesigner.properties.messages"; //$NON-NLS-1$
-	/**
-	 * 
-	 */
-	public static String ITabbedPropertiesConstants_other_category;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-		//
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/NavigationHiearchyAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/NavigationHiearchyAction.java
deleted file mode 100644
index 262b43b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/NavigationHiearchyAction.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuCreator;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.w3c.dom.Document;
-import org.w3c.dom.DocumentFragment;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class NavigationHiearchyAction extends Action {
-	private Menu _hiearchyMenu;
-
-	private Node _startNode;
-
-	private Node _currentNode;
-
-	private WPETabbedPropertySheetPage _propertyPage;
-
-	private class MenuCreator implements IMenuCreator {
-		public void dispose() {
-			if (_hiearchyMenu != null) {
-				for (int i = 0, n = _hiearchyMenu.getItemCount(); i < n; i++) {
-					MenuItem menuItem = _hiearchyMenu.getItem(i);
-					menuItem.setData(null);
-				}
-				_hiearchyMenu.dispose();
-				_hiearchyMenu = null;
-			}
-		}
-
-		public Menu getMenu(Menu parent) {
-			return null;
-		}
-
-		public Menu getMenu(Control parent) {
-			dispose();
-			_hiearchyMenu = new Menu(parent);
-
-			// next we need to add the list of parents node into the menu.
-			Node node = _startNode;
-			List list = new ArrayList();
-			while (node != null && !(node instanceof Document)
-					&& !(node instanceof DocumentFragment)) {
-				list.add(node);
-				node = node.getParentNode();
-			}
-
-			// adding ancesters reverse order.
-			for (int i = list.size() - 1; i >= 0; i--) {
-				Node thenode = (Node) list.get(i);
-				MenuItem item = new MenuItem(_hiearchyMenu, SWT.CHECK);
-				item.setSelection(thenode == _currentNode ? true : false);
-				String text = thenode.getNodeName();
-				item.setText(text);
-				item.setData(thenode);
-				item.addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						Node selectedNode = (Node) e.widget.getData();
-						_propertyPage.internalChangeSelection(selectedNode,
-								_startNode);
-					}
-				});
-			}
-
-			return _hiearchyMenu;
-		}
-	}
-
-	/**
-	 * @param propertyPage
-	 */
-	public NavigationHiearchyAction(WPETabbedPropertySheetPage propertyPage) {
-		super(""); //$NON-NLS-1$
-		setEnabled(true);
-		setMenuCreator(new MenuCreator());
-		this._propertyPage = propertyPage;
-	}
-
-	/**
-	 * @param selectedNode
-	 * @param startNode
-	 */
-	protected void changeSelection(Node selectedNode, Node startNode) {
-		this._propertyPage.internalChangeSelection(selectedNode, startNode);
-		this._currentNode = selectedNode;
-		this._startNode = startNode;
-		this.setText(this._currentNode.getNodeName());
-	}
-
-	/**
-	 * @param currentNode
-	 * @param startNode
-	 */
-	protected void refresh(Node currentNode, Node startNode) {
-		this._currentNode = currentNode;
-		this._startNode = startNode;
-		if (!(_currentNode instanceof Text)
-				&& !(_currentNode instanceof Element)) {
-			this.setText("---"); //$NON-NLS-1$
-			this.setEnabled(false);
-		} else {
-			this.setText(_currentNode.getNodeName());
-			this.setEnabled(true);
-		}
-	}
-
-	@Override
-	public void run() {
-		this._propertyPage.internalChangeSelection(_currentNode, _startNode);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/OLDAttributePropertyDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/OLDAttributePropertyDescriptor.java
deleted file mode 100644
index 75f7ec6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/OLDAttributePropertyDescriptor.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor;
-import org.eclipse.jst.pagedesigner.meta.XXXEditorCreator;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.Element;
-
-/**
- * This is the PropertyDescriptor for an attribute. Getting information from a
- * IAttributeDescriptor and an IPropertyDescriptor.
- * 
- * @author mengbo
- * @deprecated
- */
-public class OLDAttributePropertyDescriptor implements IPropertyDescriptor {
-	private IAttributeDescriptor _attr;
-
-	private IPropertyDescriptor _inner; // this could be null
-
-	private Element _element;
-
-	/**
-	 * @param element
-	 *            the owner of the attribute.
-	 * @param descriptor
-	 *            can't be null
-	 * @param desc
-	 *            could be null
-	 */
-	public OLDAttributePropertyDescriptor(Element element,
-			IAttributeDescriptor descriptor, IPropertyDescriptor desc) {
-		_element = element;
-		_attr = descriptor;
-		_inner = desc;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#createPropertyEditor(org.eclipse.swt.widgets.Composite)
-	 */
-	public CellEditor createPropertyEditor(Composite parent) {
-		CellEditor editor;
-		editor = XXXEditorCreator.getInstance().createCellEditorWithWrapper(
-				parent, _attr, (IDOMElement) _element, null);
-
-		if (editor != null) {
-			return editor;
-		}
-        XXXEditorCreator.CellEditorHolder holder = new XXXEditorCreator.CellEditorHolder() {
-        	/*
-        	 * (non-Javadoc)
-        	 * 
-        	 * @see org.eclipse.jst.pagedesigner.meta.EditorCreator.CellEditorHolder#createCellEditor(org.eclipse.swt.widgets.Composite)
-        	 */
-        	public CellEditor createCellEditor(Composite parent1) {
-        		if (_inner != null) {
-        			return _inner.createPropertyEditor(parent1);
-        		}
-                return new TextCellEditor(parent1);
-        	}
-        };
-        return XXXEditorCreator.getInstance().createCellEditorWithWrapper(
-        		parent, _attr, holder, (IDOMElement) _element, null);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#getCategory()
-	 */
-	public String getCategory() {
-		String cat = _attr.getCategory();
-		if (cat != null) {
-			return cat;
-		}
-        return ITabbedPropertiesConstants.OTHER_CATEGORY;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#getDescription()
-	 */
-	public String getDescription() {
-		String s = _attr.getDescription();
-		if (s == null && _inner != null) {
-			return _inner.getDescription();
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#getDisplayName()
-	 */
-	public String getDisplayName() {
-		return _attr.getAttributeName();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#getFilterFlags()
-	 */
-	public String[] getFilterFlags() {
-		if (_inner != null) {
-			return _inner.getFilterFlags();
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#getHelpContextIds()
-	 */
-	public Object getHelpContextIds() {
-		if (_inner != null) {
-			return _inner.getHelpContextIds();
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#getId()
-	 */
-	public Object getId() {
-		return _attr.getAttributeName();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#getLabelProvider()
-	 */
-	public ILabelProvider getLabelProvider() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#isCompatibleWith(org.eclipse.ui.views.properties.IPropertyDescriptor)
-	 */
-	public boolean isCompatibleWith(IPropertyDescriptor anotherProperty) {
-		return false;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/PropertyDescriptorWrapper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/PropertyDescriptorWrapper.java
deleted file mode 100644
index 6503bf1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/PropertyDescriptorWrapper.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties;
-
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ICellEditorListener;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jst.pagedesigner.meta.EditorCreator;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * This is a simple PropertyDescriptor wrapper. It simply changed the category
- * name. This is because the default category name is "Attributes", which will
- * make them appear before other things, and that is not what we want.
- * 
- * @author mengbo
- */
-public class PropertyDescriptorWrapper implements IPropertyDescriptor {
-
-	private IPropertyDescriptor _inner;
-
-	private IDOMElement _element;
-
-	private IStatusLineManager _statusLineManager;
-
-//	/**
-//	 * Constructor
-//	 * @param element 
-//	 * @param innerDescriptor 
-//	 * @param statusLineManager 
-//	 * 
-//	 */
-//	public PropertyDescriptorWrapper(IDOMElement element,
-//			IPropertyDescriptor innerDescriptor, IStatusLineManager statusLineManager) {
-//		this._element = element;
-//		this._inner = innerDescriptor;
-//		this._statusLineManager = statusLineManager;
-//	}
-
-	/**
-	 * Constructor
-	 * @param element
-	 * @param innerDescriptor
-	 */
-	public PropertyDescriptorWrapper(IDOMElement element,
-			IPropertyDescriptor innerDescriptor) {
-		this._element = element;
-		this._inner = innerDescriptor;
-	}
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#createPropertyEditor(org.eclipse.swt.widgets.Composite)
-	 */
-	public CellEditor createPropertyEditor(Composite parent) {
-		EditorCreator.CellEditorHolder holder = new EditorCreator.CellEditorHolder() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jst.pagedesigner.meta.EditorCreator.CellEditorHolder#createCellEditor(org.eclipse.swt.widgets.Composite)
-			 */
-			public CellEditor createCellEditor(Composite parent1) {
-				CellEditor ed = null;
-				if (_inner != null) 
-					ed = _inner.createPropertyEditor(parent1);
-				else
-					ed = new TextCellEditor(parent1);
-				
-				if (_statusLineManager != null)
-					ed.addListener(new StatusBarUpdater(ed));
-				return ed;
-			}
-		};
-		return EditorCreator.getInstance().createCellEditorWithWrapper(parent,
-				null, holder, _element, null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#getCategory()
-	 */
-	public String getCategory() {
-		String cat = _inner.getCategory();
-		return cat != null ? cat : ITabbedPropertiesConstants.OTHER_CATEGORY;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#getDescription()
-	 */
-	public String getDescription() {
-		return _inner.getDescription();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#getDisplayName()
-	 */
-	public String getDisplayName() {
-		return _inner.getDisplayName();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#getFilterFlags()
-	 */
-	public String[] getFilterFlags() {
-		return _inner.getFilterFlags();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#getHelpContextIds()
-	 */
-	public Object getHelpContextIds() {
-		return _inner.getHelpContextIds();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#getId()
-	 */
-	public Object getId() {
-		return _inner.getId();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#getLabelProvider()
-	 */
-	public ILabelProvider getLabelProvider() {
-		return _inner.getLabelProvider();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.views.properties.IPropertyDescriptor#isCompatibleWith(org.eclipse.ui.views.properties.IPropertyDescriptor)
-	 */
-	public boolean isCompatibleWith(IPropertyDescriptor anotherProperty) {
-		if (anotherProperty instanceof PropertyDescriptorWrapper) {
-			return _inner
-					.isCompatibleWith(((PropertyDescriptorWrapper) anotherProperty)
-							.getInner());
-		}
-		return _inner.isCompatibleWith(anotherProperty);
-	}
-
-	/**
-	 * @return IPropertyDescriptor
-	 */
-	public IPropertyDescriptor getInner() {
-		return _inner;
-	}
-
-	private class StatusBarUpdater implements ICellEditorListener {
-		private CellEditor ed;
-	
-		StatusBarUpdater(CellEditor ed) {
-			this.ed = ed;
-		}
-		public void applyEditorValue() {//
-		}
-		public void cancelEditor() {//
-		}
-
-		public void editorValueChanged(boolean oldValidState,
-				boolean newValidState) {
-			if (!newValidState)
-				_statusLineManager.setErrorMessage(ed.getErrorMessage());				
-			else
-				_statusLineManager.setErrorMessage(null);
-				
-		}
-		
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/WPETabbedPropertySheetPage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/WPETabbedPropertySheetPage.java
deleted file mode 100644
index 6883987..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/WPETabbedPropertySheetPage.java
+++ /dev/null
@@ -1,211 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties;
-
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.jst.pagedesigner.properties.internal.QuickEditTabManager;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.ISelectionListener;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.part.EditorPart;
-import org.eclipse.ui.part.IPageSite;
-import org.eclipse.ui.views.contentoutline.ContentOutline;
-import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class WPETabbedPropertySheetPage extends TabbedPropertySheetPage {
-
-	// TODO: when we want to extend this page, HTMLEditor would not be the sole
-	// type of editor part.
-	private HTMLEditor _htmlEditor;
-
-	private NavigationHiearchyAction _hiearchAction = new NavigationHiearchyAction(
-			this);
-	
-	private QuickEditTabManager manager;
-
-	private ISelectionListener _selListener;
-
-	/**
-	 * Constructor
-	 * @param tabbedPropertySheetPageContributor
-	 * @param editor 
-	 */
-	public WPETabbedPropertySheetPage(
-			ITabbedPropertySheetPageContributor tabbedPropertySheetPageContributor,
-			HTMLEditor editor) {
-		super(tabbedPropertySheetPageContributor);
-		_htmlEditor = editor;
-	}
-
-	public void selectionChanged(IWorkbenchPart part, ISelection selection) {
-		if (part == null) {
-			part = _htmlEditor;
-		}
-		if (part instanceof HTMLEditor || part instanceof ContentOutline) {
-			Node node = DesignerPropertyTool.normalizeSelectionToElement(part,
-					selection, _htmlEditor);
-			if (node != null) {
-				try {
-					_hiearchAction.refresh(node, node);
-					this.getSite().getActionBars().getToolBarManager().update(
-							true);
-					//setInput(part, node);
-					super.selectionChanged(part, new StructuredSelection(node));
-				} catch (Exception e) {
-					// Some synchronization would cause this, it does not damage
-					// the data.
-				}
-			}
-		}
-	}
-	
-	/**
-	 * This method should be called from internal of the property page. Normally
-	 * means user did some action inside the property sheet to change current
-	 * selection.
-	 * 
-	 * @param selectedNode
-	 * @param innerNode
-	 */
-	public void internalChangeSelection(Node selectedNode, Node innerNode) {
-		getEditor().setFocus();
-		_hiearchAction.refresh(selectedNode, innerNode);
-		this.getSite().getActionBars().getToolBarManager().update(true);
-		super.selectionChanged(null, new StructuredSelection(selectedNode));
-	}
-
-	/**
-	 * @return EditorPart instance that this property sheet is for.   Will return instance of WPE (htmlEditor)
-	 */
-	public EditorPart getEditor() {
-		return this._htmlEditor;
-	}
-
-	public void init(IPageSite pageSite) {
-		super.init(pageSite);
-		setSelectionProvider();
-		setSelectionListener();
-		IToolBarManager toolbar = pageSite.getActionBars().getToolBarManager();
-		toolbar.add(_hiearchAction);		
-		_hiearchAction.refresh(null, null);
-	}
-
-	private void setSelectionListener() {
-		this.getSite().getWorkbenchWindow().getSelectionService()
-				.addPostSelectionListener(getSelectionListener());
-	}
-
-	private ISelectionListener getSelectionListener() {
-		if (_selListener == null){
-			_selListener = new ISelectionListener() {
-				public void selectionChanged(IWorkbenchPart part,
-						ISelection selection) {
-					if (getEditor() == part)//only fire if the selection applies to this tabbed prop sheet instance
-						WPETabbedPropertySheetPage.this.selectionChanged(
-							part, selection);
-				}
-			};
-		}
-		return _selListener;
-	}
-
-	private void setSelectionProvider() {
-		this.getSite().setSelectionProvider(new ISelectionProvider() {
-			private ISelection _selection;
-
-			public void addSelectionChangedListener(
-					ISelectionChangedListener listener) {
-			    // do nothing
-			}
-
-			/**
-			 * Returns the current selection for this provider.
-			 * 
-			 * @return the current selection
-			 */
-			public ISelection getSelection() {
-				return _selection;
-			}
-
-			/**
-			 * Removes the given selection change listener from this selection
-			 * provider. Has no affect if an identical listener is not
-			 * registered.
-			 * 
-			 * @param listener
-			 *            a selection changed listener
-			 */
-			public void removeSelectionChangedListener(
-					ISelectionChangedListener listener) {
-				// do nothing
-			}
-
-			/**
-			 * Sets the current selection for this selection provider.
-			 * 
-			 * @param selection
-			 *            the new selection
-			 */
-			public void setSelection(ISelection selection) {
-				_selection = selection;
-			}
-		});
-
-	}
-
-	public void createControl(Composite parent) {
-		super.createControl(parent);
-		PlatformUI
-				.getWorkbench()
-				.getHelpSystem()
-				.setHelp(
-						getControl(),
-						PDPlugin
-								.getResourceString("WPETabbedPropertySheetPage.help.id")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @return acquires an instance of QuickEditTabManager
-	 */
-	public QuickEditTabManager getTabManager() {
-		if (manager == null) {
-			manager = QuickEditTabManager.acquireInstance(this);
-		}
-		return manager;
-	}
-
-	@Override
-	public void dispose() {
-		this.getSite().getWorkbenchWindow().getSelectionService().removePostSelectionListener(getSelectionListener());
-		this.getSite().setSelectionProvider(null);
-		manager.releaseInstance();
-		manager.dispose();
-		manager = null;
-		_selListener = null;
-		_htmlEditor = null;
-		super.dispose();
-	}
-	
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/AttributeGroupMessages.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/AttributeGroupMessages.java
deleted file mode 100644
index 2daa303..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/AttributeGroupMessages.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.attrgroup;
-
-import java.text.MessageFormat;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class AttributeGroupMessages {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.pagedesigner.properties.attrgroup.messages"; //$NON-NLS-1$
-
-	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
-			.getBundle(BUNDLE_NAME);
-
-	private AttributeGroupMessages() {
-        // no external instantiation
-	}
-
-	/**
-	 * @param key
-	 * @return the value for key or !!key!! if not found
-	 */
-	public static String getString(String key) {
-		try {
-			return RESOURCE_BUNDLE.getString(key);
-		} catch (MissingResourceException e) {
-			return '!' + key + '!';
-		}
-	}
-
-	/**
-	 * Build a formated string from the resource bundle.
-	 * 
-	 * @param key
-	 *            the key into the resource bundle that has the formated string.
-	 * @param arg0
-	 *            the first argument.
-	 * @return the formated string with the argument inline.
-	 */
-	public static String getString(String key, Object arg0) {
-		Object[] args = new Object[1];
-		args[0] = arg0;
-
-		MessageFormat formatter = new MessageFormat(getString(key));
-		return formatter.format(args);
-	}
-
-	/**
-	 * Build a formated string from the resource bundle.
-	 * 
-	 * @param key
-	 *            the key into the resource bundle that has the formated string.
-	 * @param arg0
-	 *            the first argument.
-	 * @param arg1
-	 *            the second argument.
-	 * @return the formated string with the argument inline.
-	 */
-	public static String getString(String key, Object arg0, Object arg1) {
-		Object[] args = new Object[2];
-		args[0] = arg0;
-		args[1] = arg1;
-
-		MessageFormat formatter = new MessageFormat(getString(key));
-		return formatter.format(args);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/DialogUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/DialogUtil.java
deleted file mode 100644
index 8288c89..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/DialogUtil.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.attrgroup;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jface.window.Window;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroupPage;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ISupportTextValue;
-import org.eclipse.jst.jsf.common.ui.internal.dialogs.CommonWizardDialog;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.commands.single.AddSubNodeCommand;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.jst.pagedesigner.properties.internal.AttributeGroup;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DialogUtil {
-	/**
-	 * Utility method, this method will popup a dialog for user to input
-	 * attributes for initialize a sub element. In this method will create a
-	 * command and execute it.
-	 * 
-	 * @param shell
-	 *            parent shell for dialog
-	 * @param parent
-	 *            the parent element
-	 * @param group
-	 *            the AttributeGroup
-	 * @return true if success, false if user canceled.
-	 */
-	public static boolean createSubElement(Shell shell,
-			final IDOMElement parent, final AttributeGroup group) {
-		group.setElementContext(parent, parent);//2ndParam seems to need to be parent most of the time... don't know why it WAS null... changed 12/19/07
-		
-		if (group.getDialogFields().length == 0){
-			//don't show dialog
-			createSubNode(group, parent, Collections.EMPTY_MAP);
-			return true;
-		}
-		
-		final DialogFieldGroupPage page = new DialogFieldGroupPage("", group); //$NON-NLS-1$
-		page.setTitle(AttributeGroupMessages.getString(
-				"DialogUtil.createTitle", group.getTagName())); //$NON-NLS-1$
-		page
-				.setDescription(AttributeGroupMessages
-						.getString(
-								"DialogUtil.createDescription", group.getTagName(), parent.getTagName())); //$NON-NLS-1$
-
-		Wizard wizard = new Wizard() {
-			public void addPages() {
-				super.addPage(page);
-			}
-
-			public boolean performFinish() {
-				DialogField[] fields = group.getDialogFields();
-				Map map = new HashMap();
-				for (int i = 0; i < fields.length; i++) {
-					IPropertyPageDescriptor desc = group
-							.getPropertyDescriptor(fields[i]);
-					if (desc != null && fields[i] instanceof ISupportTextValue) {
-						String value = ((ISupportTextValue) fields[i])
-								.getText();
-						if (value != null && value.length() > 0) {
-							map.put(desc.getAttributeName(), value);
-						}
-					}
-				}
-				createSubNode(group, parent, map);
-				return true;
-			}
-		};
-		wizard.setWindowTitle(AttributeGroupMessages.getString(
-				"DialogUtil.createTitle", group.getTagName())); //$NON-NLS-1$
-		wizard.setDefaultPageImageDescriptor(PDPlugin.getDefault()
-				.getImageDescriptor("newsuade_wiz.gif")); //$NON-NLS-1$
-		CommonWizardDialog dialog = new CommonWizardDialog(shell, wizard);
-
-		return dialog.open() == Window.OK;
-	}
-
-	private static void createSubNode(final AttributeGroup group, final IDOMElement parent, final Map mapOfAttributeValues) {
-		AddSubNodeCommand addSubCommand = new AddSubNodeCommand(
-				AttributeGroupMessages
-						.getString(
-								"DialogUtil.createCommandLabel", group.getTagName()), parent, group.getTagName(), group.getURI(), mapOfAttributeValues); //$NON-NLS-1$
-		addSubCommand.execute();
-		
-	}
-
-	/**
-	 * Utility method, this method will popup a dialog for user to input
-	 * attributes for initialize a sub element. In this method will create a
-	 * command and execute it.
-	 * 
-	 * @param shell
-	 *            parent shell for dialog
-	 * @param parent
-	 *            parent element
-	 * @param uri
-	 *            new ele's uri
-	 * @param tagName
-	 *            new ele's tag name
-	 * @param attributes
-	 *            an array of attribute names. The dialog will create a
-	 *            dialogfield for each of them to allow user to input initial
-	 *            value. If null, the system will try to use all attribute of
-	 *            the element.
-	 * @return true if success, false if user canceled.
-	 */
-	public static boolean createSubElement(Shell shell,
-			final IDOMElement parent, final String uri, final String tagName,
-			final String[] attributes) {
-		
-		final 	AttributeGroup group = new AttributeGroup(uri, tagName,
-				attributes);
-
-		return createSubElement(shell, parent, group);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/IElementContextable.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/IElementContextable.java
deleted file mode 100644
index bb90d80..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/IElementContextable.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.attrgroup;
-
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-
-/**
- * This is a special interface for those special dialog field that need context
- * information.
- * 
- * @author mengbo
- * @version 1.5
- */
-public interface IElementContextable {
-	/**
-	 * 
-	 * @param ancester
-	 *            an non null element, could be the element being edited, or an
-	 *            ancester element when we are creating new element.
-	 * @param element
-	 *            if not null, then is the element being edited, could be used
-	 *            to retrive initial data.
-	 * 
-	 */
-	public void setElementContext(IDOMNode ancester, IDOMElement element);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/OLDAttributeGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/OLDAttributeGroup.java
deleted file mode 100644
index 8322e1f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/OLDAttributeGroup.java
+++ /dev/null
@@ -1,359 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.attrgroup;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroup;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldChangeListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ISupportTextValue;
-import org.eclipse.jst.pagedesigner.meta.AttributeDescriptor;
-import org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor;
-import org.eclipse.jst.pagedesigner.meta.IElementDescriptor;
-import org.eclipse.jst.pagedesigner.meta.XXXEditorCreator;
-import org.eclipse.jst.pagedesigner.meta.internal.CMRegistry;
-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.widgets.FormToolkit;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-
-/**
- * @author mengbo
- * @version 1.5
- * 
- * TODO:   no longer used????
- * @deprecated
- * 
- */
-public class OLDAttributeGroup extends DialogFieldGroup {
-	private static final Object KEY_ATTR = "KEY_ATTR"; //$NON-NLS-1$
-
-	private String _uri;
-
-	private String _tagName;
-
-	private IAttributeDescriptor[] _attrs;
-
-	private String _helpContextId;
-
-	private List _dialogFields = null;
-
-	private IDOMElement _ownerElement;
-
-	/**
-	 * @param uri 
-	 * @param tagName 
-	 * @param attrNames 
-	 */
-	public OLDAttributeGroup(String uri, String tagName, String[] attrNames) {
-		this._uri = uri;
-		this._tagName = tagName;
-		this._attrs = prepareAttributeDescriptors(uri, tagName, attrNames);
-	}
-
-	/**
-	 * @return the tag name
-	 */
-	public String getTagName() {
-		return this._tagName;
-	}
-
-	/**
-	 * @return the uri
-	 */
-	public String getURI() {
-		return this._uri;
-	}
-
-	/**
-	 * @param uri
-	 * @param tagName
-	 * @param attrNames
-	 */
-	private IAttributeDescriptor[] prepareAttributeDescriptors(String uri,
-			String tagName, String[] attrNames) {
-		IAttributeDescriptor[] attrs;
-		IElementDescriptor eleDesc = CMRegistry.getInstance()
-				.getElementDescriptor(uri, tagName);
-		if (eleDesc != null) {
-			_helpContextId = eleDesc.getHelpContextID();
-			if (attrNames == null) {
-				attrs = eleDesc.getAttributeDescriptors();
-			} else {
-				attrs = new IAttributeDescriptor[attrNames.length];
-				for (int i = 0; i < attrs.length; i++) {
-					attrs[i] = eleDesc.getAttributeDescriptor(attrNames[i]);
-					if (attrs[i] == null) {
-						attrs[i] = new AttributeDescriptor(attrNames[i]);
-					}
-				}
-			}
-		} else {
-			if (attrNames == null) {
-				attrs = new IAttributeDescriptor[0];
-			} else {
-				attrs = new IAttributeDescriptor[attrNames.length];
-				for (int i = 0; i < attrs.length; i++) {
-					attrs[i] = new AttributeDescriptor(attrNames[i]);
-				}
-			}
-		}
-		return attrs;
-	}
-
-	/**
-	 * @param field
-	 * @return the descriptor
-	 */
-	public IAttributeDescriptor getAttributeDescriptor(DialogField field) {
-		Object obj = field.getAttachedData(KEY_ATTR);
-		if (obj instanceof IAttributeDescriptor) {
-			return (IAttributeDescriptor) obj;
-		}
-        return null;
-	}
-
-	/**
-	 * Child class could override this method to create customized dialogField.
-	 * Otherwise, system will use meta data to create default dailog field.
-	 * 
-	 * @param uri
-	 * @param tag
-	 * @param attr
-	 * @return if null, system will create default dialog field.
-	 */
-	protected DialogField createDialogField(String uri, String tag,
-			IAttributeDescriptor attr) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroup#initialize()
-	 */
-	public void initialize() {
-		if (_dialogFields == null) {
-			_dialogFields = new ArrayList();
-
-			IAttributeDescriptor[] descriptors = _attrs;
-
-			for (int i = 0; i < descriptors.length; i++) {
-				DialogField field;
-				field = createDialogField(this._uri, this._tagName,
-						descriptors[i]);
-				if (field == null) {
-					XXXEditorCreator creator = XXXEditorCreator.getInstance();
-					field = creator.createDialogFieldWithWrapper(this._uri,
-							this._tagName, descriptors[i], null);
-				}
-
-				field.putAttachedData(KEY_ATTR, descriptors[i]);
-
-				IDialogFieldApplyListener applyListener = getDialogFieldApplyListener(
-						this._uri, this._tagName, descriptors[i]);
-				if (applyListener == null) {
-					applyListener = getDefaultApplyListener();
-				}
-				field.setDialogFieldApplyListener(applyListener);
-
-				IDialogFieldChangeListener changeListener = getDialogFieldChangeListener(
-						this._uri, this._tagName, descriptors[i]);
-				if (changeListener == null) {
-					changeListener = getDefaultChangeListener();
-				}
-				field.setDialogFieldChangeListener(changeListener);
-				_dialogFields.add(field);
-			}
-		}
-	}
-
-	/**
-	 * Child class can override the method to provide listener implementation
-	 * 
-	 * @param uri
-	 * @param tag
-	 * @param attr
-	 * @return the listener
-	 */
-	public IDialogFieldApplyListener getDialogFieldApplyListener(String uri,
-			String tag, IAttributeDescriptor attr) {
-		return null;
-	}
-
-	/**
-	 * Child class can override the method to provide listener implementation
-	 * 
-	 * @param uri
-	 * @param tag
-	 * @param attr
-	 * @return the listener
-	 */
-	public IDialogFieldChangeListener getDialogFieldChangeListener(String uri,
-			String tag, IAttributeDescriptor attr) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroup#refreshData()
-	 */
-	public void refreshData() {
-		if (_ownerElement == null) {
-			return;
-		}
-		initialize();
-		for (int i = 0, size = _dialogFields.size(); i < size; i++) {
-			DialogField field = (DialogField) _dialogFields.get(i);
-
-			ISupportTextValue textValue = (ISupportTextValue) field;
-			IAttributeDescriptor attr = (IAttributeDescriptor) field
-					.getAttachedData(KEY_ATTR);
-			String attrName = attr.getAttributeName();
-			String attrValue = _ownerElement.getAttribute(attrName);
-			textValue.setTextWithoutUpdate(attrValue);
-		}
-	}
-
-	/**
-	 * @return the element
-	 */
-	public IDOMElement getElement() {
-		return _ownerElement;
-	}
-
-	/**
-	 * @param context
-	 * @param owner
-	 */
-	public void setElementContext(IDOMNode context, IDOMElement owner) {
-		initialize();
-		this._ownerElement = owner;
-		if (context != null) {
-			for (int i = 0, size = _dialogFields.size(); i < size; i++) {
-				DialogField field = (DialogField) _dialogFields.get(i);
-				if (field instanceof IElementContextable) {
-					((IElementContextable) field).setElementContext(context,
-							owner);
-				}
-			}
-		}
-		refreshData();
-	}
-
-	/*
-	 * (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) {
-		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);
-
-		if (this._helpContextId != null && this._helpContextId.length() > 0) {
-			PlatformUI.getWorkbench().getHelpSystem().setHelp(top,
-					_helpContextId);
-		}
-
-		GridLayout layout = new GridLayout();
-		int numColumns = getNumColumns();
-		layout.numColumns = numColumns;
-		top.setLayout(layout);
-
-		initialize();
-		for (int i = 0, size = _dialogFields.size(); i < size; i++) {
-			DialogField field = (DialogField) _dialogFields.get(i);
-			field.doFillIntoGrid(toolkit, top, numColumns);
-		}
-
-		DialogField maxColumnField = null;
-		int maxColumn = 0;
-		for (int i = 0, size = _dialogFields.size(); i < size; i++) {
-			DialogField field = (DialogField) _dialogFields.get(i);
-			int c = field.getNumberOfControls();
-			if (c > maxColumn) {
-				maxColumn = c;
-				maxColumnField = field;
-			}
-		}
-		if (maxColumnField != null) {
-			maxColumnField.handleGrabHorizontal();
-		}
-	}
-
-	/**
-	 * @return the number of columns
-	 */ 
-	public int getNumColumns() {
-		int columns = 1;
-		initialize();
-		for (int i = 0, size = _dialogFields.size(); i < size; i++) {
-			DialogField field = (DialogField) _dialogFields.get(i);
-			columns = Math.max(columns, field.getNumberOfControls());
-		}
-		return columns;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroup#validateDialogFields()
-	 */
-	public IStatus[] validateDialogFields() {
-		return null;
-	}
-
-	/**
-	 * @return the dialog fields
-	 */
-	public DialogField[] getDialogFields() {
-		initialize();
-		DialogField[] ret = new DialogField[_dialogFields.size()];
-		_dialogFields.toArray(ret);
-		return ret;
-	}
-
-	/**
-	 * get the dialogfield for the corresponding attribute.
-	 * 
-	 * @param attrName
-	 *            case sensitive attribute name.
-	 * @return null if fail to find.
-	 */
-	public DialogField getDialogField(String attrName) {
-		initialize();
-		for (int i = 0, size = _dialogFields.size(); i < size; i++) {
-			DialogField field = (DialogField) _dialogFields.get(i);
-			IAttributeDescriptor attr = this.getAttributeDescriptor(field);
-			if (attr != null && attr.getAttributeName().equals(attrName)) {
-				return field;
-			}
-		}
-		return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/OLDAttributeGroupSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/OLDAttributeGroupSection.java
deleted file mode 100644
index b41a1ed..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/OLDAttributeGroupSection.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.properties.attrgroup;
-
-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.ISupportTextValue;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeAttributeCommand;
-import org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor;
-import org.eclipse.jst.pagedesigner.properties.BaseCustomSection;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-
-/**
- * This is a section for a list of attribute dialog fields.
- * 
- * @author mengbo
- * @version 1.5
- * @deprecated
- * 
- */
-public class OLDAttributeGroupSection extends BaseCustomSection {
-	private static final Object KEY_ATTR = "KEY_ATTR"; //$NON-NLS-1$
-
-	private IDialogFieldApplyListener _fieldApplyListener = new IDialogFieldApplyListener() {
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener#dialogFieldApplied(org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField)
-		 */
-		public void dialogFieldApplied(DialogField field) {
-			Object attr = field.getAttachedData(KEY_ATTR);
-			if (attr instanceof IAttributeDescriptor && _element != null) {
-				ISupportTextValue textValue = (ISupportTextValue) field;
-				ChangeAttributeCommand c = new ChangeAttributeCommand(
-						AttributeGroupMessages
-								.getString("OLDAttributeGroupSection.changeAttribute"), _element, ((IAttributeDescriptor) attr).getAttributeName(), textValue.getText()); //$NON-NLS-1$
-				c.execute();
-			}
-		}
-	};
-
-	/**
-	 * the attribute group
-	 */
-	protected OLDAttributeGroup _group;
-
-	/**
-	 * create the section with a default AttributeGroup. In default
-	 * AttributeGroup, there is no relationship between fields.
-	 * 
-	 * @param uri
-	 * @param tagName
-	 * @param attrNames
-	 */
-	public OLDAttributeGroupSection(String uri, String tagName, String[] attrNames) {
-		this(new OLDAttributeGroup(uri, tagName, attrNames));
-	}
-
-	/**
-	 * In case the group is not a default group (e.g. you may add some
-	 * customized relationship between the fields).
-	 * 
-	 * @param group
-	 */
-	public OLDAttributeGroupSection(OLDAttributeGroup group) {
-		_group = group;
-		_group.setDefaultApplyListener(_fieldApplyListener);
-		_group.initialize();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.ui.properties.internal.provisional.AbstractPropertySection#setInput(org.eclipse.ui.IWorkbenchPart,
-	 *      org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setInput(IWorkbenchPart part, ISelection selection) {
-		super.setInput(part, selection);
-		_group.setElementContext(_element, _element);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.integration.properties.section.AbstractCustomSection#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();
-		_group.layoutDialogFields(factory, parent);
-	}
-
-	protected void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-		if (_group != null) {
-			_group.refreshData();
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/messages.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/messages.properties
deleted file mode 100644
index dd21120..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/attrgroup/messages.properties
+++ /dev/null
@@ -1,14 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-DialogUtil.createTitle=Create {0}
-DialogUtil.createDescription=Create subelement "{0}" under "{1}"
-DialogUtil.createCommandLabel=Create {0}
-AttributeGroupSection.changeAttribute=Change Attribute
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/CSSDialogCellEditor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/CSSDialogCellEditor.java
deleted file mode 100644
index b43bcc3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/CSSDialogCellEditor.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.celleditors;
-
-import org.eclipse.jface.preference.PreferenceManager;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeStyleCommand;
-import org.eclipse.jst.pagedesigner.ui.dialogs.StyleDialog;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSStyleDeclaration;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.w3c.dom.css.ElementCSSInlineStyle;
-
-/**
- * A css dialog cell editor
- *
- */
-public class CSSDialogCellEditor extends EditableDialogCellEditor {
-	private IDOMElement _element;
-
-	/**
-	 * @param parent
-	 * @param element 
-	 */
-	public CSSDialogCellEditor(Composite parent, IDOMElement element) {
-		super(parent);
-		_element = element;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.DialogCellEditor#openDialogBox(org.eclipse.swt.widgets.Control)
-	 */
-	protected Object openDialogBox(Control cellEditorWindow) {
-		ICSSStyleDeclaration styleDeclaration = (ICSSStyleDeclaration) ((ElementCSSInlineStyle) _element)
-				.getStyle();
-
-		PreferenceManager manager = new PreferenceManager();
-		Shell shell = cellEditorWindow.getShell();
-
-		final CSSPropertyContext context = new CSSPropertyContext(styleDeclaration);
-		StyleDialog dialog = new StyleDialog(shell, manager, _element, context);
-		if (dialog.open() == Window.OK) {
-			if (context.isModified()) {			
-				PlatformUI.getWorkbench().getDisplay().asyncExec(
-	                    new Runnable()
-	                    {
-	                        public void run()
-	                        {
-	            				ChangeStyleCommand c = new ChangeStyleCommand(_element, context);
-	                        	c.execute();
-	                        }
-	            });
-			}
-		}
-
-		String style = (_element == null ? null : _element
-				.getAttribute(IJSFConstants.ATTR_STYLE));
-		return style == null ? "" : style; //$NON-NLS-1$
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/CellEditorFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/CellEditorFactory.java
deleted file mode 100644
index de79670..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/CellEditorFactory.java
+++ /dev/null
@@ -1,248 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *    
- ********************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.celleditors;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.internal.TraitValueHelper;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.metadataprocessors.features.IDefaultValue;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.jst.pagedesigner.jsp.core.IJSPCoreConstants;
-import org.eclipse.jst.pagedesigner.meta.ITagAttributeCellEditorFactory;
-import org.eclipse.jst.pagedesigner.meta.IAttributeRuntimeValueType;
-import org.eclipse.jst.pagedesigner.properties.dialogfields.MDEnabledComboDialogField;
-import org.eclipse.jst.pagedesigner.ui.dialogfields.ClasspathResourceButtonDialogField;
-import org.eclipse.jst.pagedesigner.ui.dialogfields.ContextableResourceButtonDialogField;
-import org.eclipse.jst.pagedesigner.ui.dialogfields.StyleButtonDialogField;
-import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Element;
-
-/**
- * 
- * @author mengbo
- */
-public class CellEditorFactory implements ITagAttributeCellEditorFactory {
-	public CellEditor createCellEditor(Composite parent,
-			IPropertyPageDescriptor attr, Element element) {
-		
-		String type = attr.getValueType();
-		
-		IPossibleValues pvs = (IPossibleValues)attr.getAdapter(IPossibleValues.class);
-		IDefaultValue defaultValue = (IDefaultValue)attr.getAdapter(IDefaultValue.class);
-//		ICellEditorValidator validator = (ICellEditorValidator)attr.getAdapter(ICellEditorValidator.class);
-		CellEditor ed = null;
-		if (IAttributeRuntimeValueType.RELATIVEPATH.equalsIgnoreCase(type)|| IAttributeRuntimeValueType.WEBPATH.equalsIgnoreCase(type)) {
-			IProject project = getProject(element);
-			if (project != null) {
-//				String typeParam = TraitValueHelper.getValueAsString(TaglibDomainMetaDataQueryHelper.getTrait(attr.getMetaDataContext().getEntity(),"type-param"));
-				ResourceDialogCellEditor cellEditor = new ResourceDialogCellEditor(
-						parent);
-				Trait fileExt = TaglibDomainMetaDataQueryHelper.getTrait(attr.getMetaDataContext().getEntity(), "file-extensions"); //$NON-NLS-1$
-				Trait separator = TaglibDomainMetaDataQueryHelper.getTrait(attr.getMetaDataContext().getEntity(), "separator"); //$NON-NLS-1$
-				String[] fileExts = null;
-				if (fileExt != null){
-					List exts = TraitValueHelper.getValueAsListOfStrings(fileExt);
-					fileExts = (String[])exts.toArray(new String[exts.size()]);
-				} 
-				
-				String sep = null;
-				if (separator != null)
-					sep = TraitValueHelper.getValueAsString(separator);
-				
-				if (fileExts != null)
-					cellEditor.setSuffixs(fileExts);
-				if (sep != null)
-					cellEditor.setSeparator(sep);
-
-				cellEditor.setProject(project);
-				cellEditor.setReferredFile(getFile(element));
-
-				if (IAttributeRuntimeValueType.WEBPATH.equalsIgnoreCase(type)) {
-					cellEditor.setWebPath(true);
-				}
-
-				if (IJSPCoreConstants.TAG_DIRECTIVE_INCLUDE.equals(element
-						.getLocalName())
-						|| IJSPCoreConstants.TAG_INCLUDE.equals(element
-								.getLocalName())) {
-					cellEditor.setTransformJSPURL(false);
-				}
-				ed = cellEditor;
-			}
-		} 
-		else if (IAttributeRuntimeValueType.RESOURCEBUNDLE.equals(type)) {
-			ed = new LoadbundleSelectionCellEditor(parent,
-					getProject(element));
-		}
-		else if (IAttributeRuntimeValueType.CSSSTYLE.equalsIgnoreCase(type)) {
-//				String param = getParamterValue(attr, "style");
-////							.getParameterByName(IAttributeDescriptor.PARAMETER_STYLE);
-//				if (!param.equalsIgnoreCase("STYLE")) {
-//					return null;
-//				}
-				CSSDialogCellEditor cellEditor = new CSSDialogCellEditor(parent,
-						(IDOMElement) element);
-				ed = cellEditor;
-		}
-		else if (pvs != null && pvs.getPossibleValues().size() > 0) {
-//			if (validator != null) 
-//				ed = LabeledStyleComboCellEditor.newInstance(parent, pvs,
-//	            		defaultValue, SWT.DROP_DOWN | SWT.READ_ONLY);
-//			else 
-				ed = LabeledStyleComboCellEditor.newInstance(parent, pvs,
-            		defaultValue, SWT.NONE);
-	
-		}
-		
-//		} else if (IAttributeRuntimeValueType.CSSID.equalsIgnoreCase(type)) {
-//		    // TODO: missing case?
-
-		else {
-			ed = new TextCellEditor(parent);
-		}
-//		if (validator != null){
-//			ed.setValidator(validator);
-//		}
-		
-		return ed;
-	}
-
-
-//	private String getParamterValue(IPropertyPageDescriptor attr, String traitKey) {
-//		Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(attr.getMetaDataContext().getEntity(), traitKey);
-//		if (trait != null){
-//			return TraitValueHelper.getValueAsString(trait);
-//		}
-//		return null;
-//	}
-
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.meta.NEWMDIAttributeCellEditorFactory#createDialogField(org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor,
-	 *      org.w3c.dom.Element, org.w3c.dom.Element)
-	 */
-	public DialogField createDialogField(IPropertyPageDescriptor attr) {
-
-		String type = attr.getValueType();
-		
-		IPossibleValues pvs = (IPossibleValues)attr.getAdapter(IPossibleValues.class);
-//		IDefaultValue defaultValue = (IDefaultValue)attr.getAdapter(IDefaultValue.class);
-//		ICellEditorValidator validator = (ICellEditorValidator)attr.getAdapter(ICellEditorValidator.class);
-		
-		
-
-		if (IAttributeRuntimeValueType.RELATIVEPATH.equals(type) ||
-				IAttributeRuntimeValueType.WEBPATH.equals(type)) {
-			Trait fileExt = TaglibDomainMetaDataQueryHelper.getTrait(attr.getMetaDataContext().getEntity(), "file-extensions"); //$NON-NLS-1$
-			Trait seperator = TaglibDomainMetaDataQueryHelper.getTrait(attr.getMetaDataContext().getEntity(), "separator"); //$NON-NLS-1$
-			
-			String[] fileExts = null;
-			if (fileExt != null){
-				List exts = TraitValueHelper.getValueAsListOfStrings(fileExt);
-				fileExts = (String[])exts.toArray(new String[exts.size()]);
-			} 
-			
-			String sep = null;
-			if (seperator != null)
-				sep = TraitValueHelper.getValueAsString(seperator);
-		
-			ContextableResourceButtonDialogField field = new ContextableResourceButtonDialogField();
-			field.setLabelText(attr.getLabel());
-			if (fileExts != null) {
-				field.setSuffixs(fileExts);
-			}
-			
-			if (sep != null) {
-				field.setSeparator(sep);
-			}
-			
-			if ("".equalsIgnoreCase(field.getSeparator())) { //$NON-NLS-1$
-				field.setResourceDescription(ResourceBoundle
-						.getString("FileCellEditor.Msg")); //$NON-NLS-1$
-			} else {
-				field.setResourceDescription(ResourceBoundle
-						.getString("FileCellEditor.Msg1")); //$NON-NLS-1$
-			}
-			field.setWebPath(IAttributeRuntimeValueType.WEBPATH.equals(type));
-			field.setRequired(attr.isRequired());
-			field.setToolTip(attr.getDescription());
-			return field;
-
-		} else if (IAttributeRuntimeValueType.CLASSPATH_RESOURCE.equals(type) ||
-				IAttributeRuntimeValueType.RESOURCEBUNDLE.equals(type)) {
-			ClasspathResourceButtonDialogField field = new ClasspathResourceButtonDialogField();
-			field.setRequired(attr.isRequired());
-			field.setToolTip(attr.getDescription());
-			field.setLabelText(attr.getLabel());
-			return field;
-		} else if (IAttributeRuntimeValueType.CSSSTYLE.equalsIgnoreCase(type)) {
-//			String param = getParamterValue(attr, "style");
-//			if (!"STYLE".equalsIgnoreCase(param)) {
-//				return null;
-//			}
-			StyleButtonDialogField field = new StyleButtonDialogField();
-			field.setRequired(attr.isRequired());
-			field.setToolTip(attr.getDescription());
-			field.setLabelText(attr.getLabel());
-			return field;
-		
-//		// if there is no type or type unknown, then we just return null. and
-//		// system will
-//		// create default (text cell editor).
-		} else if (pvs != null && pvs.getPossibleValues().size() > 0) {
-			MDEnabledComboDialogField field = new MDEnabledComboDialogField(SWT.None);
-			field.setLabelText(attr.getLabel());
-			field.setToolTip(attr.getDescription());
-			field.setRequired(attr.isRequired());
-			return field;
-		}
-		return null;
-	}
-
-	private IProject getProject(Element element) {
-		if (element instanceof IDOMElement) {
-			IDOMModel model = ((IDOMElement) element).getModel();
-			IFile file = StructuredModelUtil.getFileFor(model);
-			if (file != null) {
-				return file.getProject();
-			}
-		}
-		return null;
-	}
-
-	public String[] getSupportedValueTypes() {
-		return null;//default - all!
-	}
-
-	private IFile getFile(Element element) {
-		if (element instanceof IDOMElement) {
-			IDOMModel model = ((IDOMElement) element).getModel();
-			IFile file = StructuredModelUtil.getFileFor(model);
-			return file;
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/CellEditorWrapper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/CellEditorWrapper.java
deleted file mode 100644
index 011ff99..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/CellEditorWrapper.java
+++ /dev/null
@@ -1,359 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.celleditors;
-
-import java.text.MessageFormat;
-
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ICellEditorListener;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.KeyAdapter;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Layout;
-import org.eclipse.swt.widgets.Listener;
-
-/**
- * CellEditorWrapper is a special cell editor, that wraps an existing cell
- * editor by adding a small clickable button to end of it.
- * 
- * Due to limitation of the CellEditor framework, this wrapping technology may
- * resulting in some small inconvenience when change focus from the "wrapped"
- * cell editor to the "added" button.
- * 
- * This is an abstract class. Child class need override some methods.
- * 
- * @author mengbo
- */
-public abstract class CellEditorWrapper extends CellEditor {
-	/**
-	 * The editor control.
-	 */
-	private Composite _editor;
-
-	/**
-	 * the wrapped cell editor
-	 */
-	private CellEditor _wrapped;
-
-	/**
-	 * The button.
-	 */
-	private Button _button;
-
-	/**
-	 * Internal class for laying out the dialog.
-	 */
-	private class DialogCellLayout extends Layout {
-		public void layout(Composite editor, boolean force) {
-			Rectangle bounds = editor.getClientArea();
-			Point size = _button.computeSize(SWT.DEFAULT, SWT.DEFAULT, force);
-			// if (_wrapped != null)
-			_wrapped.getControl().setBounds(0, 0, bounds.width - size.x,
-					bounds.height);
-			_button.setBounds(bounds.width - size.x, 0, size.x, bounds.height);
-		}
-
-		public Point computeSize(Composite editor, int wHint, int hHint,
-				boolean force) {
-			if (wHint != SWT.DEFAULT && hHint != SWT.DEFAULT)
-				return new Point(wHint, hHint);
-			Point contentsSize = _wrapped.getControl().computeSize(SWT.DEFAULT,
-					SWT.DEFAULT, force);
-			Point buttonSize = _button.computeSize(SWT.DEFAULT, SWT.DEFAULT,
-					force);
-			// Just return the button width to ensure the button is not clipped
-			// if the label is long.
-			// The label will just use whatever extra width there is
-			Point result = new Point(buttonSize.x, Math.max(contentsSize.y,
-					buttonSize.y));
-			return result;
-		}
-	}
-
-	/**
-	 * Default DialogCellEditor style
-	 */
-	private static final int defaultStyle = SWT.NONE;
-
-	/**
-	 * Creates a new dialog cell editor with no control
-	 * 
-	 * @since 2.1
-	 */
-	public CellEditorWrapper() {
-		setStyle(defaultStyle);
-	}
-
-	/**
-	 * Creates a new dialog cell editor parented under the given control. The
-	 * cell editor value is <code>null</code> initially, and has no validator.
-	 * 
-	 * @param parent
-	 *            the parent control
-	 */
-	protected CellEditorWrapper(Composite parent) {
-		this(parent, defaultStyle);
-	}
-
-	/**
-	 * Creates a new dialog cell editor parented under the given control. The
-	 * cell editor value is <code>null</code> initially, and has no validator.
-	 * 
-	 * @param parent
-	 *            the parent control
-	 * @param style
-	 *            the style bits
-	 * @since 2.1
-	 */
-	protected CellEditorWrapper(Composite parent, int style) {
-		super(parent, style);
-	}
-
-	/**
-	 * Creates the button for this cell editor under the given parent control.
-	 * <p>
-	 * The default implementation of this framework method creates the button
-	 * display on the right hand side of the dialog cell editor. Subclasses may
-	 * extend or reimplement.
-	 * </p>
-	 * 
-	 * @param parent
-	 *            the parent control
-	 * @return the new button control
-	 */
-	protected Button createButton(Composite parent) {
-		Button result = new Button(parent, SWT.DOWN);
-		result.setImage(getBindingImage());
-		// result.setText("..."); //$NON-NLS-1$
-		return result;
-	}
-
-	/**
-	 * Since createButton is called from constructor, so we could only let child
-	 * class override this method to provide image. Rather than setting as
-	 * property.
-	 * 
-	 * @return image
-	 */
-	protected abstract Image getBindingImage();
-
-	/**
-	 * Creates the controls used to show the value of this cell editor.
-	 * <p>
-	 * The default implementation of this framework method creates a label
-	 * widget, using the same font and background color as the parent control.
-	 * </p>
-	 * <p>
-	 * Subclasses may re-implement. If you re-implement this method, you should
-	 * also re-implement <code>updateContents</code>.
-	 * </p>
-	 * 
-	 * @param cell
-	 *            the control for this cell editor
-	 * @return control
-	 */
-	protected Control createContents(Composite cell) {
-		_wrapped = createWrappedCellEditor(cell);
-		if (_wrapped == null) {
-			_wrapped = new TextCellEditor(cell);
-		}
-		_wrapped.addListener(new ICellEditorListener() {
-			public void applyEditorValue() {
-				fireApplyEditorValue();
-			}
-
-			public void cancelEditor() {
-				fireCancelEditor();
-			}
-
-			public void editorValueChanged(boolean oldValidState,
-					boolean newValidState) {
-				fireEditorValueChanged(oldValidState, newValidState);
-			}
-		});
-		_wrapped.addPropertyChangeListener(new IPropertyChangeListener() {
-			public void propertyChange(PropertyChangeEvent event) {
-				// FIXME:
-			}
-		});
-
-		_wrapped.getControl().setVisible(true);
-		_wrapped.getControl().addListener(SWT.Hide, new Listener() {
-			public void handleEvent(Event event) {
-				Display.getCurrent().asyncExec(new Runnable() {
-					public void run() {
-						if (_wrapped != null && _wrapped.getControl() != null
-								&& !_wrapped.getControl().isDisposed()) {
-							_wrapped.getControl().setVisible(true);
-						} else {
-							deactivate();
-						}
-					}
-				});
-
-			}
-		});
-		return _wrapped.getControl();
-	}
-
-	/**
-	 * @param cell
-	 * @return CellEditor
-	 */
-	protected abstract CellEditor createWrappedCellEditor(Composite cell);
-
-	/*
-	 * (non-Javadoc) Method declared on CellEditor.
-	 */
-	protected Control createControl(Composite parent) {
-		Font font = parent.getFont();
-		Color bg = parent.getBackground();
-
-		_editor = new Composite(parent, getStyle());
-		_editor.setFont(font);
-		_editor.setBackground(bg);
-		_editor.setLayout(new DialogCellLayout());
-
-		createContents(_editor);
-		// updateContents(value);
-
-		_button = createButton(_editor);
-		_button.setFont(font);
-
-		_button.addKeyListener(new KeyAdapter() {
-			public void keyReleased(KeyEvent e) {
-				if (e.character == '\u001b') { // Escape
-					fireCancelEditor();
-				}
-			}
-		});
-
-		_button.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent event) {
-				Object newValue = openDialogBox(_editor);
-				if (newValue != null) {
-					boolean newValidState = isCorrect(newValue);
-					if (newValidState) {
-						markDirty();
-						doSetValue(newValue);
-					} else {
-						// try to insert the current value into the error
-						// message.
-						setErrorMessage(MessageFormat.format(getErrorMessage(),
-								new Object[] { newValue.toString() }));
-					}
-					fireApplyEditorValue();
-				}
-			}
-		});
-
-		setValueValid(true);
-
-		return _editor;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on CellEditor. The focus is set to the cell
-	 * editor's button.
-	 */
-	protected void doSetFocus() {
-		if (_wrapped != null && _wrapped.getControl() != null
-				&& !_wrapped.getControl().isDisposed()) {
-			_wrapped.setFocus();
-		} else {
-			_button.setFocus();
-		}
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on CellEditor.
-	 */
-	protected Object doGetValue() {
-		return _wrapped.getValue();
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on CellEditor.
-	 */
-	protected void doSetValue(Object value) {
-		if (_wrapped != null) {
-			_wrapped.setValue(value);
-		}
-	}
-
-	/**
-	 * Opens a dialog box under the given parent control and returns the
-	 * dialog's value when it closes, or <code>null</code> if the dialog was
-	 * cancelled or no selection was made in the dialog.
-	 * <p>
-	 * This framework method must be implemented by concrete subclasses. It is
-	 * called when the user has pressed the button and the dialog box must pop
-	 * up.
-	 * </p>
-	 * 
-	 * @param cellEditorWindow
-	 *            the parent control cell editor's window so that a subclass can
-	 *            adjust the dialog box accordingly
-	 * @return the selected value, or <code>null</code> if the dialog was
-	 *         cancelled or no selection was made in the dialog
-	 */
-	protected abstract Object openDialogBox(Control cellEditorWindow);
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.CellEditor#activate()
-	 */
-	public void activate() {
-		super.activate();
-		_wrapped.activate();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.CellEditor#deactivate()
-	 */
-	public void deactivate() {
-		super.deactivate();
-		// if (_wrapped != null)
-		// {
-		// _wrapped.deactivate();
-		// }
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.CellEditor#dispose()
-	 */
-	public void dispose() {
-		_wrapped.dispose();
-		super.dispose();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/EditableDialogCellEditor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/EditableDialogCellEditor.java
deleted file mode 100644
index 9a9c385..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/EditableDialogCellEditor.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.celleditors;
-
-import java.text.MessageFormat;
-
-import org.eclipse.jface.viewers.DialogCellEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.KeyAdapter;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * @author mengbo
- */
-public abstract class EditableDialogCellEditor extends DialogCellEditor {
-	private Text _text;
-
-	/**
-	 * 
-	 */
-	public EditableDialogCellEditor() {
-		super();
-	}
-
-	/**
-	 * @param parent
-	 */
-	public EditableDialogCellEditor(Composite parent) {
-		super(parent);
-	}
-
-	/**
-	 * @param parent
-	 * @param style
-	 */
-	public EditableDialogCellEditor(Composite parent, int style) {
-		super(parent, style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.DialogCellEditor#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createContents(Composite cell) {
-		_text = new Text(cell, SWT.LEFT);
-		_text.setFont(cell.getFont());
-		_text.setBackground(cell.getBackground());
-		_text.addKeyListener(new KeyAdapter() {
-			// hook key pressed - see PR 14201
-			public void keyPressed(KeyEvent e) {
-				keyReleaseOccured(e);
-				// disposed this cell editor
-				if ((getControl() == null) || getControl().isDisposed()) {
-					return;
-				}
-			}
-		});
-		// when the text control has focus, the cellEditor will deactive even
-		// when you press the button.
-		// Add the follow codes enable switch to the button control.
-		_text.addFocusListener(new FocusAdapter() {
-			public void focusLost(FocusEvent e) {
-				boolean newValidState = isCorrect(_text.getText());
-				if (newValidState) {
-					markDirty();
-					doSetValue(_text.getText());
-				} else {
-					// try to insert the current value into the error message.
-					setErrorMessage(MessageFormat.format(getErrorMessage(),
-							new Object[] { _text.getText().toString() }));
-				}
-			}
-		});
-
-		return _text;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.CellEditor#doSetFocus()
-	 */
-	protected void doSetFocus() {
-		_text.setFocus();
-		_text.selectAll();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.DialogCellEditor#updateContents(java.lang.Object)
-	 */
-	protected void updateContents(Object value) {
-		if (_text == null || _text.isDisposed()) {
-			return;
-		}
-
-		String text = "";//$NON-NLS-1$
-		if (value != null) {
-			text = value.toString();
-		}
-		_text.setText(text);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.CellEditor#keyReleaseOccured(org.eclipse.swt.events.KeyEvent)
-	 */
-	protected void keyReleaseOccured(KeyEvent keyEvent) {
-		if (keyEvent.character == '\r') {
-			boolean newValidState = isCorrect(_text.getText());
-			if (newValidState) {
-				markDirty();
-				doSetValue(_text.getText());
-			} else {
-				// try to insert the current value into the error message.
-				setErrorMessage(MessageFormat.format(getErrorMessage(),
-						new Object[] { _text.getText().toString() }));
-			}
-			fireApplyEditorValue();
-		}
-		super.keyReleaseOccured(keyEvent);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/LabeledComboBoxCellEditor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/LabeledComboBoxCellEditor.java
deleted file mode 100644
index efd1df0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/LabeledComboBoxCellEditor.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.celleditors;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jface.viewers.ComboBoxCellEditor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CCombo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.wst.sse.ui.internal.Logger;
-
-/**
- * A simple ComboBoxCellEditor, which allow value and display string to be
- * different.
- * 
- * @author mengbo
- */
-public class LabeledComboBoxCellEditor extends ComboBoxCellEditor {
-	private boolean _fSettingValue = false;
-
-	private Object[] _values;
-
-	/**
-	 * Create LabeledComboBoxCellEditor
-	 * @param parent
-	 * @param valueLabelMap
-	 * @param style
-	 * @return LabeledComboBoxCellEditor
-	 */
-	public static LabeledComboBoxCellEditor newInstance(Composite parent,
-			Map valueLabelMap, int style) {
-		// we'll sort according to label. since that is what being show to user.
-		List list = new ArrayList();
-		for (Iterator iter = valueLabelMap.keySet().iterator(); iter.hasNext();) {
-			Object key = iter.next();
-			String label = (String) valueLabelMap.get(key);
-			list.add(new Object[] { key, label });
-		}
-		// sort by label
-		Collections.sort(list, new Comparator() {
-			public int compare(Object o1, Object o2) {
-				String label1 = (String) ((Object[]) o1)[1];
-				String label2 = (String) ((Object[]) o2)[1];
-				return label1.compareTo(label2);
-			}
-		});
-		Object[] values = new Object[list.size()];
-		String[] labels = new String[list.size()];
-		for (int i = 0, n = list.size(); i < n; i++) {
-			values[i] = ((Object[]) list.get(i))[0];
-			labels[i] = (String) ((Object[]) list.get(i))[1];
-		}
-		return new LabeledComboBoxCellEditor(parent, values, labels, style);
-	}
-
-	/**
-	 * Constructor
-	 * 
-	 * @param parent
-	 * @param values
-	 * @param labels
-	 */
-	public LabeledComboBoxCellEditor(Composite parent, Object[] values,
-			String[] labels) {
-		this(parent, values, labels, SWT.NONE);
-	}
-
-	/**
-	 * Constructor
-	 * 
-	 * @param parent
-	 * @param values
-	 * @param labels
-	 * @param style
-	 */
-	public LabeledComboBoxCellEditor(Composite parent, Object[] values,
-			String[] labels, int style) {
-		super(parent, labels, style);
-		_values = values;
-	}
-
-	protected Object doGetValue() {
-		// otherwise limits to set of valid values
-		Object index = super.doGetValue();
-		int selection = -1;
-		if (index instanceof Integer) {
-			selection = ((Integer) index).intValue();
-		}
-		if (selection >= 0) {
-			return _values[selection];
-		} else if (getControl() instanceof CCombo) {
-			// retrieve the actual text as the list of valid items doesn't
-			// contain the value
-			return ((CCombo) getControl()).getText();
-		}
-		return null;
-	}
-
-	protected void doSetValue(Object value) {
-		if (_fSettingValue) {
-			return;
-		}
-		_fSettingValue = true;
-		if (value instanceof Integer) {
-			super.doSetValue(value);
-		} else {
-			String stringValue = value.toString();
-			int selection = -1;
-			for (int i = 0; i < _values.length; i++) {
-				if (_values[i].equals(stringValue)) {
-					selection = i;
-				}
-			}
-			if (selection >= 0) {
-				super.doSetValue(new Integer(selection));
-			} else {
-				super.doSetValue(new Integer(-1));
-				if (getControl() instanceof CCombo
-						&& !stringValue.equals(((CCombo) getControl())
-								.getText())) {
-					// update the Text widget
-					((CCombo) getControl()).setText(stringValue);
-				}
-			}
-		}
-		_fSettingValue = false;
-	}
-
-	public void setItems(String[] newItems) {
-		if (getControl() == null || getControl().isDisposed()) {
-			Logger.log(Logger.ERROR,
-					"Attempted to update item list for disposed cell editor"); //$NON-NLS-1$
-			return;
-		}
-
-		// keep selection if possible
-		Object previousSelectedValue = getValue();
-		super.setItems(newItems);
-		if (previousSelectedValue != null && getControl() instanceof CCombo) {
-			for (int i = 0; i < newItems.length; i++) {
-				if (newItems[i].equals(previousSelectedValue)) {
-					setValue(previousSelectedValue);
-				}
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/LabeledStyleComboCellEditor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/LabeledStyleComboCellEditor.java
deleted file mode 100644
index e8a47d5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/LabeledStyleComboCellEditor.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.celleditors;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jst.jsf.common.ui.internal.utils.StyleCombo;
-import org.eclipse.jst.jsf.metadataprocessors.features.IDefaultValue;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValue;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.wst.sse.ui.internal.Logger;
-
-/**
- * A combo cell editor
- *
- */
-public class LabeledStyleComboCellEditor extends StyleComboCellEditor {
-	private boolean _fSettingValue = false;
-
-	private Object[] _values;
-
-	/**
-	 * @param parent
-	 * @param valueLabelMap
-	 * @param defaultValue
-	 * @param style
-	 * @return the new instance
-	 */
-	public static LabeledStyleComboCellEditor newInstance(Composite parent,
-			Map valueLabelMap, String defaultValue, int style) {
-		// we'll sort according to label. since that is what being show to user.
-		List list = new ArrayList();
-		for (Iterator iter = valueLabelMap.keySet().iterator(); iter.hasNext();) {
-			Object key = iter.next();
-			String label = (String) valueLabelMap.get(key);
-			list.add(new Object[] { key, label });
-		}
-		// sort by label
-		Collections.sort(list, new Comparator() {
-			public int compare(Object o1, Object o2) {
-				String label1 = (String) ((Object[]) o1)[1];
-				String label2 = (String) ((Object[]) o2)[1];
-				return label1.compareTo(label2);
-			}
-		});
-		Object[] values = new Object[list.size()];
-		String[] labels = new String[list.size()];
-		for (int i = 0, n = list.size(); i < n; i++) {
-			values[i] = ((Object[]) list.get(i))[0];
-			labels[i] = (String) ((Object[]) list.get(i))[1];
-		}
-		return new LabeledStyleComboCellEditor(parent, values, labels,
-				defaultValue, style);
-	}
-
-	/**
-	 * Constructor
-	 * 
-	 * @param parent
-	 * @param values
-	 * @param labels
-	 * @param defaultValue 
-	 * @param style
-	 */
-	public LabeledStyleComboCellEditor(Composite parent, Object[] values,
-			String[] labels, String defaultValue, int style) {
-		super(parent, labels, style);
-		StyleCombo combo = (StyleCombo) getControl();
-		if (defaultValue != null)
-			combo.setDefaultValue(defaultValue);
-		_values = values;
-	}
-
-	protected Object doGetValue() {
-		// otherwise limits to set of valid values
-		Object index = super.doGetValue();
-		int selection1 = -1;
-		if (index instanceof Integer) {
-			selection1 = ((Integer) index).intValue();
-		}
-		if (selection1 >= 0) {
-			return _values[selection1];
-		} else if (getControl() instanceof StyleCombo) {
-			// retrieve the actual text as the list of valid items doesn't
-			// contain the value
-			return ((StyleCombo) getControl()).getText();
-		}
-		return null;
-	}
-
-	protected void doSetValue(Object value) {
-		if (_fSettingValue) {
-			return;
-		}
-		_fSettingValue = true;
-		if (value instanceof Integer) {
-			super.doSetValue(value);
-		} else {
-			String stringValue = value.toString();
-			int selection1 = -1;
-			for (int i = 0; i < _values.length; i++) {
-				if (_values[i].equals(stringValue)) {
-					selection1 = i;
-				}
-			}
-			if (selection1 >= 0) {
-				super.doSetValue(new Integer(selection1));
-			} else {
-				super.doSetValue(new Integer(-1));
-				if (getControl() instanceof StyleCombo
-						&& !stringValue.equals(((StyleCombo) getControl())
-								.getText())) {
-					// update the Text widget
-					((StyleCombo) getControl()).setText(stringValue);
-				}
-			}
-		}
-		_fSettingValue = false;
-	}
-
-	public void setItems(String[] newItems) {
-		if (getControl() == null || getControl().isDisposed()) {
-			Logger.log(Logger.ERROR,
-					"Attempted to update item list for disposed cell editor"); //$NON-NLS-1$
-			return;
-		}
-
-		// keep selection if possible
-		Object previousSelectedValue = getValue();
-		super.setItems(newItems);
-		if (previousSelectedValue != null && getControl() instanceof StyleCombo) {
-			for (int i = 0; i < newItems.length; i++) {
-				if (newItems[i].equals(previousSelectedValue)) {
-					setValue(previousSelectedValue);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Create CellEditor
-	 * @param parent
-	 * @param pvs
-	 * @param defaultValue
-	 * @param style
-	 * @return CellEditor
-	 */
-	public static CellEditor newInstance(Composite parent, IPossibleValues pvs,
-			IDefaultValue defaultValue, int style) {
-	
-		CellEditor ed = null;
-		if (pvs != null) {
-			Map map = getPossibleValueMap(pvs);
-			ed = newInstance(parent, map, defaultValue != null ? defaultValue.getDefaultValue() : null, style);
-		}
-		
-		return ed;
-	}
-
-	private static Map getPossibleValueMap(IPossibleValues pvs) {
-		Map<String, String> map = new HashMap<String, String>(pvs.getPossibleValues().size());
-		for (Iterator it = pvs.getPossibleValues().iterator();it.hasNext();){
-			IPossibleValue pv = (IPossibleValue)it.next();
-			map.put(pv.getValue(), pv.getDisplayValue());
-		}
-		return map;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/LoadbundleSelectionCellEditor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/LoadbundleSelectionCellEditor.java
deleted file mode 100644
index 1465478..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/LoadbundleSelectionCellEditor.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.celleditors;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.jsf.common.ui.internal.dialogs.ResourceOnClasspathDialog;
-import org.eclipse.jst.pagedesigner.properties.DesignerPropertyTool;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * @author mengbo
- */
-public class LoadbundleSelectionCellEditor extends EditableDialogCellEditor {
-	private static final String[] PROPERTIES_FILES_SUFFIXS = new String[] { IFileFolderConstants.EXT_PROPERTIES };
-
-	private String _value;
-
-	private IProject _project;
-
-	/**
-	 * @param parent
-	 * @param project 
-	 */
-	public LoadbundleSelectionCellEditor(Composite parent, IProject project) {
-		super(parent);
-		_project = project;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.DialogCellEditor#openDialogBox(org.eclipse.swt.widgets.Control)
-	 */
-	protected Object openDialogBox(Control cellEditorWindow) {
-		ResourceOnClasspathDialog dialog = new ResourceOnClasspathDialog(
-				cellEditorWindow.getShell(), DesignerPropertyTool
-						.getJavaProject(_project));
-		dialog.setTitle(ResourceBoundle.getString("FileCellEditor.Title")); //$NON-NLS-1$
-		dialog.setSuffixs(PROPERTIES_FILES_SUFFIXS);
-		dialog.open();
-		if (dialog.getResult() != null) {
-			_value = (String) dialog.getResult()[0];
-		}
-		return _value;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/NamedBooleanCellEditor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/NamedBooleanCellEditor.java
deleted file mode 100644
index 929fe36..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/NamedBooleanCellEditor.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.properties.celleditors;
-
-import org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- * Unused???
- */
-public class NamedBooleanCellEditor extends LabeledComboBoxCellEditor {
-	/**
-	 * @param parent
-	 * @param items
-	 * @param style
-	 */
-	private NamedBooleanCellEditor(Composite parent, Object[] values,
-			String[] labels, int style) {
-		super(parent, values, labels, style);
-	}
-
-	/**
-	 * @param parent
-	 * @param style
-	 * @param element
-	 * @param attribute
-	 * @return the new instance
-	 */
-	public static NamedBooleanCellEditor newInstance(Composite parent,
-			int style, IDOMElement element, IAttributeDescriptor attribute) {
-		String[] values = new String[] { "", attribute.getAttributeName() }; //$NON-NLS-1$
-		return new NamedBooleanCellEditor(parent, values, values, style);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/OLDCellEditorFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/OLDCellEditorFactory.java
deleted file mode 100644
index bc74e9c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/OLDCellEditorFactory.java
+++ /dev/null
@@ -1,483 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.celleditors;
-
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-import java.util.TimeZone;
-import java.util.TreeMap;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.viewers.CellEditor;
-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.StyleComboDialogField;
-import org.eclipse.jst.pagedesigner.css2.CSSUtil;
-import org.eclipse.jst.pagedesigner.jsp.core.IJSPCoreConstants;
-import org.eclipse.jst.pagedesigner.meta.IAttributeCellEditorFactory;
-import org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor;
-import org.eclipse.jst.pagedesigner.meta.OLDIValueType;
-import org.eclipse.jst.pagedesigner.ui.dialogfields.ClasspathResourceButtonDialogField;
-import org.eclipse.jst.pagedesigner.ui.dialogfields.ContextableResourceButtonDialogField;
-import org.eclipse.jst.pagedesigner.ui.dialogfields.StyleButtonDialogField;
-import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Element;
-
-/**
- * 
- * @author mengbo
- * @deprecated
- */
-public class OLDCellEditorFactory implements IAttributeCellEditorFactory {
-	private static String[] CURRENCYCODES = { "AED", // United Arab Emirates, //$NON-NLS-1$
-			// Dirhams //$NON-NLS-1$
-			"AFA", // Afghanistan, Afghanis //$NON-NLS-1$
-			"ALL", // Albania, Leke //$NON-NLS-1$
-			"AMD", // Armenia, Drams //$NON-NLS-1$
-			"ANG", // Netherlands Antilles, Guilders (also called Florins)//$NON-NLS-1$
-			"AOA", // Angola, Kwanza //$NON-NLS-1$
-			"ARS", // Argentina, Pesos //$NON-NLS-1$
-			"AUD", // Australia, Dollars //$NON-NLS-1$
-			"AWG", // Aruba, Guilders (also called Florins) //$NON-NLS-1$
-			"AZM", // Azerbaijan, Manats //$NON-NLS-1$
-			"BAM", // Bosnia and Herzegovina, Convertible Marka //$NON-NLS-1$
-			"BBD", // Barbados, Dollars //$NON-NLS-1$
-			"BDT", // Bangladesh, Taka //$NON-NLS-1$
-			"BGN", // Bulgaria, Leva //$NON-NLS-1$
-			"BHD", // Bahrain, Dinars //$NON-NLS-1$
-			"BIF", // Burundi, Francs //$NON-NLS-1$
-			"BMD", // Bermuda, Dollars //$NON-NLS-1$
-			"BND", // Brunei Darussalam, Dollars //$NON-NLS-1$
-			"BOB", // Bolivia, Bolivianos //$NON-NLS-1$
-			"BRL", // Brazil, Brazil Real //$NON-NLS-1$
-			"BSD", // Bahamas, Dollars //$NON-NLS-1$
-			"BTN", // Bhutan, Ngultrum //$NON-NLS-1$
-			"BWP", // Botswana, Pulas //$NON-NLS-1$
-			"BYR", // Belarus, Rubles //$NON-NLS-1$
-			"BZD", // Belize, Dollars //$NON-NLS-1$
-			"CAD", // Canada, Dollars //$NON-NLS-1$
-			"CDF", // Congo/Kinshasa, Congolese Francs //$NON-NLS-1$
-			"CHF", // Switzerland, Francs //$NON-NLS-1$
-			"CLP", // Chile, Pesos //$NON-NLS-1$
-			"CNY", // China, Yuan Renminbi //$NON-NLS-1$
-			"COP", // Colombia, Pesos //$NON-NLS-1$
-			"CRC", // Costa Rica, Colones //$NON-NLS-1$
-			"CSD", // Serbia, Dinars //$NON-NLS-1$
-			"CUP", // Cuba, Pesos //$NON-NLS-1$
-			"CVE", // Cape Verde, Escudos //$NON-NLS-1$
-			"CYP", // Cyprus, Pounds //$NON-NLS-1$
-			"CZK", // Czech Republic, Koruny //$NON-NLS-1$
-			"DJF", // Djibouti, Francs //$NON-NLS-1$
-			"DKK", // Denmark, Kroner //$NON-NLS-1$
-			"DOP", // Dominican Republic, Pesos //$NON-NLS-1$
-			"DZD", // Algeria, Algeria Dinars //$NON-NLS-1$
-			"EEK", // Estonia, Krooni //$NON-NLS-1$
-			"EGP", // Egypt, Pounds //$NON-NLS-1$
-			"ERN", // Eritrea, Nakfa //$NON-NLS-1$
-			"ETB", // Ethiopia, Birr //$NON-NLS-1$
-			"EUR", // Euro Member Countries, Euro //$NON-NLS-1$
-			"FJD", // Fiji, Dollars //$NON-NLS-1$
-			"FKP", // Falkland Islands (Malvinas), Pounds //$NON-NLS-1$
-			"GBP", // United Kingdom, Pounds //$NON-NLS-1$
-			"GEL", // Georgia, Lari //$NON-NLS-1$
-			"GGP", // Guernsey, Pounds //$NON-NLS-1$
-			"GHC", // Ghana, Cedis //$NON-NLS-1$
-			"GIP", // Gibraltar, Pounds //$NON-NLS-1$
-			"GMD", // Gambia, Dalasi //$NON-NLS-1$
-			"GNF", // Guinea, Francs //$NON-NLS-1$
-			"GTQ", // Guatemala, Quetzales //$NON-NLS-1$
-			"GYD", // Guyana, Dollars //$NON-NLS-1$
-			"HKD", // Hong Kong, Dollars //$NON-NLS-1$
-			"HNL", // Honduras, Lempiras //$NON-NLS-1$
-			"HRK", // Croatia, Kuna //$NON-NLS-1$
-			"HTG", // Haiti, Gourdes //$NON-NLS-1$
-			"HUF", // Hungary, Forint //$NON-NLS-1$
-			"IDR", // Indonesia, Rupiahs //$NON-NLS-1$
-			"ILS", // Israel, New Shekels //$NON-NLS-1$
-			"IMP", // Isle of Man, Pounds //$NON-NLS-1$
-			"INR", // India, Rupees //$NON-NLS-1$
-			"IQD", // Iraq, Dinars //$NON-NLS-1$
-			"IRR", // Iran, Rials //$NON-NLS-1$
-			"ISK", // Iceland, Kronur //$NON-NLS-1$
-			"JEP", // Jersey, Pounds //$NON-NLS-1$
-			"JMD", // Jamaica, Dollars //$NON-NLS-1$
-			"JOD", // Jordan, Dinars //$NON-NLS-1$
-			"JPY", // Japan, Yen //$NON-NLS-1$
-			"KES", // Kenya, Shillings //$NON-NLS-1$
-			"KGS", // Kyrgyzstan, Soms //$NON-NLS-1$
-			"KHR", // Cambodia, Riels //$NON-NLS-1$
-			"KMF", // Comoros, Francs //$NON-NLS-1$
-			"KPW", // Korea (North), Won //$NON-NLS-1$
-			"KRW", // Korea (South), Won //$NON-NLS-1$
-			"KWD", // Kuwait, Dinars //$NON-NLS-1$
-			"KYD", // Cayman Islands, Dollars //$NON-NLS-1$
-			"KZT", // Kazakhstan, Tenge //$NON-NLS-1$
-			"LAK", // Laos, Kips //$NON-NLS-1$
-			"LBP", // Lebanon, Pounds //$NON-NLS-1$
-			"LKR", // Sri Lanka, Rupees //$NON-NLS-1$
-			"LRD", // Liberia, Dollars //$NON-NLS-1$
-			"LSL", // Lesotho, Maloti //$NON-NLS-1$
-			"LTL", // Lithuania, Litai //$NON-NLS-1$
-			"LVL", // Latvia, Lati //$NON-NLS-1$
-			"LYD", // Libya, Dinars //$NON-NLS-1$
-			"MAD", // Morocco, Dirhams //$NON-NLS-1$
-			"MDL", // Moldova, Lei //$NON-NLS-1$
-			"MGA", // Madagascar, Ariary //$NON-NLS-1$
-			"MKD", // Macedonia, Denars //$NON-NLS-1$
-			"MMK", // Myanmar (Burma), Kyats //$NON-NLS-1$
-			"MNT", // Mongolia, Tugriks //$NON-NLS-1$
-			"MOP", // Macau, Patacas //$NON-NLS-1$
-			"MRO", // Mauritania, Ouguiyas //$NON-NLS-1$
-			"MTL", // Malta, Liri //$NON-NLS-1$
-			"MUR", // Mauritius, Rupees //$NON-NLS-1$
-			"MVR", // Maldives (Maldive Islands), Rufiyaa //$NON-NLS-1$
-			"MWK", // Malawi, Kwachas //$NON-NLS-1$
-			"MXN", // Mexico, Pesos //$NON-NLS-1$
-			"MYR", // Malaysia, Ringgits //$NON-NLS-1$
-			"MZM", // Mozambique, Meticais //$NON-NLS-1$
-			"NAD", // Namibia, Dollars //$NON-NLS-1$
-			"NGN", // Nigeria, Nairas //$NON-NLS-1$
-			"NIO", // Nicaragua, Cordobas //$NON-NLS-1$
-			"NOK", // Norway, Krone //$NON-NLS-1$
-			"NPR", // Nepal, Nepal Rupees //$NON-NLS-1$
-			"NZD", // New Zealand, Dollars //$NON-NLS-1$
-			"OMR", // Oman, Rials //$NON-NLS-1$
-			"PAB", // Panama, Balboa //$NON-NLS-1$
-			"PEN", // Peru, Nuevos Soles //$NON-NLS-1$
-			"PGK", // Papua New Guinea, Kina //$NON-NLS-1$
-			"PHP", // Philippines, Pesos //$NON-NLS-1$
-			"PKR", // Pakistan, Rupees //$NON-NLS-1$
-			"PLN", // Poland, Zlotych //$NON-NLS-1$
-			"PYG", // Paraguay, Guarani //$NON-NLS-1$
-			"QAR", // Qatar, Rials //$NON-NLS-1$
-			"ROL", // Romania, Lei //$NON-NLS-1$
-			"RUB", // Russia, Rubles //$NON-NLS-1$
-			"RWF", // Rwanda, Rwanda Francs //$NON-NLS-1$
-			"SAR", // Saudi Arabia, Riyals //$NON-NLS-1$
-			"SBD", // Solomon Islands, Dollars //$NON-NLS-1$
-			"SCR", // Seychelles, Rupees //$NON-NLS-1$
-			"SDD", // Sudan, Dinars //$NON-NLS-1$
-			"SEK", // Sweden, Kronor //$NON-NLS-1$
-			"SGD", // Singapore, Dollars //$NON-NLS-1$
-			"SHP", // Saint Helena, Pounds //$NON-NLS-1$
-			"SIT", // Slovenia, Tolars //$NON-NLS-1$
-			"SKK", // Slovakia, Koruny //$NON-NLS-1$
-			"SLL", // Sierra Leone, Leones //$NON-NLS-1$
-			"SOS", // Somalia, Shillings //$NON-NLS-1$
-			"SPL", // Seborga, Luigini //$NON-NLS-1$
-			"SRD", // Suriname, Dollars //$NON-NLS-1$
-			"STD", // S?o Tome and Principe, Dobras //$NON-NLS-1$
-			"SVC", // El Salvador, Colones //$NON-NLS-1$
-			"SYP", // Syria, Pounds //$NON-NLS-1$
-			"SZL", // Swaziland, Emalangeni //$NON-NLS-1$
-			"THB", // Thailand, Baht //$NON-NLS-1$
-			"TJS", // Tajikistan, Somoni //$NON-NLS-1$
-			"TMM", // Turkmenistan, Manats //$NON-NLS-1$
-			"TND", // Tunisia, Dinars //$NON-NLS-1$
-			"TOP", // Tonga, Pa'anga //$NON-NLS-1$
-			"TRL", // Turkey, Liras [being phased out] //$NON-NLS-1$
-			"TRY", // Turkey, New Lira //$NON-NLS-1$
-			"TTD", // Trinidad and Tobago, Dollars //$NON-NLS-1$
-			"TVD", // Tuvalu, Tuvalu Dollars //$NON-NLS-1$
-			"TWD", // Taiwan, New Dollars //$NON-NLS-1$
-			"TZS", // Tanzania, Shillings //$NON-NLS-1$
-			"UAH", // Ukraine, Hryvnia //$NON-NLS-1$
-			"UGX", // Uganda, Shillings //$NON-NLS-1$
-			"USD", // United States of America, Dollars //$NON-NLS-1$
-			"UYU", // Uruguay, Pesos //$NON-NLS-1$
-			"UZS", // Uzbekistan, Sums //$NON-NLS-1$
-			"VEB", // Venezuela, Bolivares //$NON-NLS-1$
-			"VND", // Viet Nam, Dong //$NON-NLS-1$
-			"VUV", // Vanuatu, Vatu //$NON-NLS-1$
-			"WST", // Samoa, Tala //$NON-NLS-1$
-			"XAF", // Communaut�� Financi��re Africaine BEAC, Francs //$NON-NLS-1$
-			// //$NON-NLS-1$
-			"XAG", // Silver, Ounces //$NON-NLS-1$
-			"XAU", // Gold, Ounces //$NON-NLS-1$
-			"XCD", // East Caribbean Dollars //$NON-NLS-1$
-			"XDR", // International Monetary Fund (IMF) Special Drawing Rights //$NON-NLS-1$
-			// //$NON-NLS-1$
-			"XOF", // Communaut�� Financi��re Africaine BCEAO, Francs //$NON-NLS-1$
-			// //$NON-NLS-1$
-			"XPD", // Palladium Ounces //$NON-NLS-1$
-			"XPF", // Comptoirs Fran?ais du Pacifique Francs //$NON-NLS-1$
-			"XPT", // Platinum, Ounces //$NON-NLS-1$
-			"YER", // Yemen, Rials //$NON-NLS-1$
-			"ZAR", // South Africa, Rand //$NON-NLS-1$
-			"ZMK", // Zambia, Kwacha //$NON-NLS-1$
-			"ZWD" // Zimbabwe, Zimbabwe Dollars //$NON-NLS-1$
-	};
-
-	public CellEditor createCellEditor(Composite parent,
-			IAttributeDescriptor attr, Element element) {
-		String type = attr.getValueType();
-
-		if (OLDIValueType.ENUMERATED.equalsIgnoreCase(type)) {
-			Map map = new HashMap(attr.getOptions());
-			String defaultValue = attr.getDefaultValue();
-			if (defaultValue == null) {
-				return LabeledComboBoxCellEditor.newInstance(parent, map,
-						SWT.NONE);
-			}
-            return LabeledStyleComboCellEditor.newInstance(parent, map,
-            		defaultValue, SWT.NONE);
-		} else if (OLDIValueType.LOCALE.equalsIgnoreCase(type)) {
-			Map map = new HashMap();
-			Locale[] locales = Locale.getAvailableLocales();
-			for (int i = 0, size = locales.length; i < size; i++) {
-				map.put(locales[i].toString(), locales[i].toString());
-			}
-			return LabeledComboBoxCellEditor.newInstance(parent, map, SWT.NONE);
-		} else if (OLDIValueType.TIMEZONE.equalsIgnoreCase(type)) {
-			Map map = new HashMap();
-			String[] ids = TimeZone.getAvailableIDs();
-			for (int i = 0, size = ids.length; i < size; i++) {
-				map.put(ids[i], ids[i]);
-			}
-			return LabeledComboBoxCellEditor.newInstance(parent, map, SWT.NONE);
-		} else if (OLDIValueType.RELATIVEPATH.equalsIgnoreCase(type)
-				|| OLDIValueType.WEBPATH.equalsIgnoreCase(type)) {
-			IProject project = getProject(element);
-			if (project != null) {
-				ResourceDialogCellEditor cellEditor = new ResourceDialogCellEditor(
-						parent);
-				cellEditor.setSuffixs(attr.getParameterByName(
-						IAttributeDescriptor.PARAMETER_SUFFIX).split(";")); //$NON-NLS-1$
-				cellEditor
-						.setSeparator(attr
-								.getParameterByName(IAttributeDescriptor.PARAMETER_SEPARATOR));
-				cellEditor.setProject(project);
-				cellEditor.setReferredFile(getFile(element));
-				if ("".equalsIgnoreCase(cellEditor.getSeparator())) { //$NON-NLS-1$
-					cellEditor.setResourceDescription(ResourceBoundle
-							.getString("FileCellEditor.Msg")); //$NON-NLS-1$
-				} else {
-					cellEditor.setResourceDescription(ResourceBoundle
-							.getString("FileCellEditor.Msg1")); //$NON-NLS-1$
-				}
-				if (OLDIValueType.WEBPATH.equalsIgnoreCase(type)) {
-					cellEditor.setWebPath(true);
-				}
-
-				if (IJSPCoreConstants.TAG_DIRECTIVE_INCLUDE.equals(element
-						.getLocalName())
-						|| IJSPCoreConstants.TAG_INCLUDE.equals(element
-								.getLocalName())) {
-					cellEditor.setTransformJSPURL(false);
-				}
-				return cellEditor;
-			}
-		} else if (OLDIValueType.CLASSPATH_RESOURCE.equalsIgnoreCase(type)) {
-			return new LoadbundleSelectionCellEditor(parent,
-					getProject(element));
-		} else if (OLDIValueType.CSSID.equalsIgnoreCase(type)) {
-		    // TODO: missing case?
-		} else if (OLDIValueType.CSSCLASS.equalsIgnoreCase(type)) {
-			String cssclasses[] = CSSUtil.getCSSClasses(element
-					.getOwnerDocument());
-			Map map = new HashMap();
-			if (cssclasses != null) {
-				for (int i = 0; i < cssclasses.length; i++) {
-					map.put(cssclasses[i], cssclasses[i]);
-				}
-			}
-			return LabeledComboBoxCellEditor.newInstance(parent, map, SWT.NONE);
-		} else if (OLDIValueType.BOOLEAN.equalsIgnoreCase(type)) {
-			String defaultValue = attr
-					.getParameterByName(IAttributeDescriptor.PARAMETER_DEFAULT);
-			Map booleanMap = new HashMap();
-			booleanMap.put(Boolean.TRUE.toString(), Boolean.TRUE.toString());
-			booleanMap.put(Boolean.FALSE.toString(), Boolean.FALSE.toString());
-			if (defaultValue == null) {
-				return LabeledComboBoxCellEditor.newInstance(parent,
-						booleanMap, SWT.NONE);
-			}
-            return LabeledStyleComboCellEditor.newInstance(parent,
-            		booleanMap, defaultValue, SWT.NONE);
-		} else if (OLDIValueType.CSSSTYLE.equalsIgnoreCase(type)) {
-			String param = attr
-					.getParameterByName(IAttributeDescriptor.PARAMETER_STYLE);
-			if (!param.equalsIgnoreCase("STYLE")) { //$NON-NLS-1$
-				return null;
-			}
-			CSSDialogCellEditor cellEditor = new CSSDialogCellEditor(parent,
-					(IDOMElement) element);
-			return cellEditor;
-		} else if (OLDIValueType.NAMED_BOOLEAN.equalsIgnoreCase(type)) {
-			return NamedBooleanCellEditor.newInstance(parent, SWT.NONE,
-					(IDOMElement) element, attr);
-		} else if (OLDIValueType.CURRENCYCODE.equalsIgnoreCase(type)) {
-			Map map = new HashMap();
-			for (int i = 0, n = CURRENCYCODES.length; i < n; i++) {
-				map.put(CURRENCYCODES[i], CURRENCYCODES[i]);
-			}
-
-			return LabeledComboBoxCellEditor.newInstance(parent, map, SWT.NONE);
-		}
-
-		// if there is no type or type unknonw, then we just return null. and
-		// system will
-		// create default (text cell editor).
-		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 (OLDIValueType.ENUMERATED.equalsIgnoreCase(type)
-				|| OLDIValueType.LOCALE.equalsIgnoreCase(type)
-				|| OLDIValueType.TIMEZONE.equalsIgnoreCase(type)) {
-			Map map = new HashMap();
-			if (OLDIValueType.ENUMERATED.equalsIgnoreCase(type)) {
-				map = attr.getOptions();
-			} else if (OLDIValueType.LOCALE.equalsIgnoreCase(type)) {
-				Locale[] locales = Locale.getAvailableLocales();
-				for (int i = 0, size = locales.length; i < size; i++) {
-					map.put(locales[i].toString(), locales[i].toString());
-				}
-			} else {
-				String[] ids = TimeZone.getAvailableIDs();
-				for (int i = 0, size = ids.length; i < size; i++) {
-					map.put(ids[i], ids[i]);
-				}
-			}
-			if (map != null && !map.isEmpty()) {
-				String defaultValue = attr.getDefaultValue();
-				if (defaultValue == null || "".equals(defaultValue)) { //$NON-NLS-1$
-					attr
-							.getParameterByName(IAttributeDescriptor.PARAMETER_DEFAULT);
-				}
-				StyleComboDialogField field = new StyleComboDialogField(
-						SWT.NONE);
-				field.setDefaultValue(defaultValue);
-				field.setLabelText(attr.getLabelString());
-				field.setEntryMap(new TreeMap(map));
-				field.setRequired(attr.isRequired());
-				field.setToolTip(attr.getDescription());
-				return field;
-			}
-			// eles the config is incorrect. fall through, will return null.
-		} else if (OLDIValueType.RELATIVEPATH.equalsIgnoreCase(type)) {
-			String param = attr.getTypeParameter();
-			ContextableResourceButtonDialogField field = new ContextableResourceButtonDialogField();
-			field.setLabelText(attr.getLabelString());
-			if (param != null) {
-				field.setSuffixs(attr.getParameterByName(
-						IAttributeDescriptor.PARAMETER_SUFFIX).split(";")); //$NON-NLS-1$
-			}
-			field.setResourceDescription(ResourceBoundle
-					.getString("FileCellEditor.Msg")); //$NON-NLS-1$
-			field.setRequired(attr.isRequired());
-			field.setToolTip(attr.getDescription());
-			return field;
-		} else if (OLDIValueType.WEBPATH.equalsIgnoreCase(type)) {
-			String param = attr.getTypeParameter();
-			ContextableResourceButtonDialogField field = new ContextableResourceButtonDialogField();
-			field.setLabelText(attr.getLabelString());
-			if (param != null) {
-				field.setSuffixs(attr.getParameterByName(
-						IAttributeDescriptor.PARAMETER_SUFFIX).split(";")); //$NON-NLS-1$
-				field
-						.setSeparator(attr
-								.getParameterByName(IAttributeDescriptor.PARAMETER_SEPARATOR));
-			}
-			if ("".equalsIgnoreCase(field.getSeparator())) { //$NON-NLS-1$
-				field.setResourceDescription(ResourceBoundle
-						.getString("FileCellEditor.Msg")); //$NON-NLS-1$
-			} else {
-				field.setResourceDescription(ResourceBoundle
-						.getString("FileCellEditor.Msg1")); //$NON-NLS-1$
-			}
-			field.setWebPath(true);
-			field.setRequired(attr.isRequired());
-			field.setToolTip(attr.getDescription());
-			return field;
-		} else if (OLDIValueType.CLASSPATH_RESOURCE.equals(type)) {
-			ClasspathResourceButtonDialogField field = new ClasspathResourceButtonDialogField();
-			field.setRequired(attr.isRequired());
-			field.setToolTip(attr.getDescription());
-			return field;
-		} else if (OLDIValueType.BOOLEAN.equalsIgnoreCase(type)) {
-			String defaultValue = attr
-					.getParameterByName(IAttributeDescriptor.PARAMETER_DEFAULT);
-			StyleComboDialogField field = new StyleComboDialogField(SWT.NONE);
-			TreeMap map = new TreeMap();
-			map.put("", ""); //$NON-NLS-1$ //$NON-NLS-2$
-			map.put(Boolean.FALSE.toString(), Boolean.FALSE.toString());
-			map.put(Boolean.TRUE.toString(), Boolean.TRUE.toString());
-			field.setEntryMap(map);
-			field.setDefaultValue(defaultValue);
-			field.setLabelText(attr.getLabelString());
-			field.setRequired(attr.isRequired());
-			field.setToolTip(attr.getDescription());
-			return field;
-		} else if (OLDIValueType.CSSSTYLE.equalsIgnoreCase(type)) {
-			String param = attr
-					.getParameterByName(IAttributeDescriptor.PARAMETER_STYLE);
-			if (!"STYLE".equalsIgnoreCase(param)) { //$NON-NLS-1$
-				return null;
-			}
-			StyleButtonDialogField field = new StyleButtonDialogField();
-			field.setRequired(attr.isRequired());
-			field.setToolTip(attr.getDescription());
-			return field;
-		} else if (OLDIValueType.CURRENCYCODE.equalsIgnoreCase(type)) {
-			ComboDialogField field = new ComboDialogField(SWT.NONE);
-			field.setLabelText(attr.getLabelString());
-			field.setItems(CURRENCYCODES);
-			field.setRequired(attr.isRequired());
-			field.setToolTip(attr.getDescription());
-			return field;
-		}
-
-		// if there is no type or type unknonw, then we just return null. and
-		// system will
-		// create default (text cell editor).
-		return null;
-	}
-
-	private IProject getProject(Element element) {
-		if (element instanceof IDOMElement) {
-			IDOMModel model = ((IDOMElement) element).getModel();
-			IFile file = StructuredModelUtil.getFileFor(model);
-			if (file != null) {
-				return file.getProject();
-			}
-		}
-		return null;
-	}
-
-	public String[] getSupportedValueTypes() {
-		return null;
-	}
-
-	private IFile getFile(Element element) {
-		if (element instanceof IDOMElement) {
-			IDOMModel model = ((IDOMElement) element).getModel();
-			IFile file = StructuredModelUtil.getFileFor(model);
-			return file;
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/ResourceBoundle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/ResourceBoundle.java
deleted file mode 100644
index b3eeac5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/ResourceBoundle.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.celleditors;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ResourceBoundle {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.pagedesigner.properties.celleditors.messages"; //$NON-NLS-1$
-
-	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
-			.getBundle(BUNDLE_NAME);
-
-	private ResourceBoundle() {
-        // no external instantiation
-	}
-
-	/**
-	 * @param key
-	 * @return the value for the key or !!key!!
-	 */
-	public static String getString(String key) {
-		try {
-			return RESOURCE_BUNDLE.getString(key);
-		} catch (MissingResourceException e) {
-			return '!' + key + '!';
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/ResourceDialogCellEditor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/ResourceDialogCellEditor.java
deleted file mode 100644
index 0eced33..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/ResourceDialogCellEditor.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.celleditors;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jst.jsf.common.ui.internal.dialogs.CommonResourceDialog;
-import org.eclipse.jst.jsf.common.ui.internal.utils.PathUtil;
-import org.eclipse.jst.jsf.common.ui.internal.utils.WebrootUtil;
-import org.eclipse.jst.pagedesigner.utils.WebAppUtil;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * @author mengbo
- */
-public class ResourceDialogCellEditor extends EditableDialogCellEditor {
-	private IProject _project;
-
-	private String[] _suffixs;
-
-	private String _resourceDescription;
-
-	private IFile _referredFile;
-
-	private boolean _isWebPath = false;
-
-	private boolean _needTransformJSPURL = true;
-
-	private String _separator = ""; //$NON-NLS-1$
-
-
-	/**
-	 * Constructor
-	 */
-	public ResourceDialogCellEditor() {
-		super();
-	}
-	
-	/**
-	 * Constructor
-	 * @param parent 
-	 */
-	public ResourceDialogCellEditor(Composite parent) {
-		super(parent);
-	}
-	
-	/**
-	 * Constructor
-	 * @param parent 
-	 * @param style 
-	 */
-	public ResourceDialogCellEditor(Composite parent, int style) {
-		super(parent, style);
-	}
-
-	protected Object openDialogBox(Control cellEditorWindow) {
-		Shell shell = cellEditorWindow.getShell();
-		int style = "".equals(_separator) ? SWT.NONE : SWT.MULTI | SWT.H_SCROLL //$NON-NLS-1$
-				| SWT.V_SCROLL;
-		CommonResourceDialog dialog = new CommonResourceDialog(shell, _project,
-				style);
-		dialog.setTitle(ResourceBoundle.getString("FileCellEditor.Title")); //$NON-NLS-1$
-		dialog.setSuffixs(_suffixs);
-		dialog.setResourceDescription(_resourceDescription);
-		if (dialog.open() == Window.OK) {
-			Object[] result = dialog.getResult();
-			StringBuffer buffer = new StringBuffer();
-			for (int i = 0; i < result.length; i++) {
-				IPath path = ((IFile) result[i]).getLocation();
-
-				IPath referredPath = null;
-				if (_referredFile != null) {
-					referredPath = _referredFile.getLocation();
-				} else {
-					referredPath = _project.getLocation();
-				}
-
-				String newValue = null;
-				if (this._isWebPath) {
-					IFile selectedFile = ((IFile) result[i]);
-					newValue = WebrootUtil.getWebPath(selectedFile
-							.getFullPath());
-				} else {
-					newValue = PathUtil.convertToRelativePath(path.toString(),
-							referredPath.toString());
-				}
-				if (this._needTransformJSPURL) {
-					newValue = WebAppUtil.transformJSPURL(newValue,
-							this._referredFile);
-				}
-				buffer.append(newValue);
-				buffer.append(_separator);
-			}
-			if (buffer.length() > 0) {
-				return buffer.substring(0, buffer.length()
-						- _separator.length());
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param project
-	 */
-	public void setProject(IProject project) {
-		this._project = project;
-	}
-
-	/**
-	 * @return Returns the project.
-	 */
-	public IProject getProject() {
-		return _project;
-	}
-
-	/**
-	 * @return Returns the referredFile.
-	 */
-	public IFile getReferredFile() {
-		return _referredFile;
-	}
-
-	/**
-	 * @param referredFile
-	 *            The referredFile to set.
-	 */
-	public void setReferredFile(IFile referredFile) {
-		this._referredFile = referredFile;
-	}
-
-	/**
-	 * @return Returns the resourceDescription.
-	 */
-	public String getResourceDescription() {
-		if (_resourceDescription == null) {
-			if ("".equalsIgnoreCase(getSeparator())) { //$NON-NLS-1$
-				_resourceDescription = ResourceBoundle
-						.getString("FileCellEditor.Msg"); //$NON-NLS-1$
-			} else {
-				_resourceDescription = ResourceBoundle
-						.getString("FileCellEditor.Msg1"); //$NON-NLS-1$
-			}			
-		}
-		return _resourceDescription;
-	}
-
-	/**
-	 * @param resourceDescription
-	 *            The resourceDescription to set.
-	 */
-	public void setResourceDescription(String resourceDescription) {
-		this._resourceDescription = resourceDescription;
-	}
-
-	/**
-	 * @return Returns the suffixes.
-	 */
-	public String[] getSuffixs() {
-		return _suffixs;
-	}
-
-	/**
-	 * @param suffixs
-	 *            The suffixes to set.
-	 */
-	public void setSuffixs(String[] suffixs) {
-		this._suffixs = suffixs;
-	}
-
-	/**
-	 * set some special path to web path instead of relative path
-	 * 
-	 * @param isWebPath
-	 */
-	public void setWebPath(boolean isWebPath) {
-		this._isWebPath = isWebPath;
-	}
-
-	/**
-	 * @param needTransform
-	 */
-	public void setTransformJSPURL(boolean needTransform) {
-		this._needTransformJSPURL = needTransform;
-	}
-
-	/**
-	 * @return separator to use for between values
-	 */
-	public String getSeparator() {
-		return _separator;
-	}
-
-	/**
-	 * @param separator to use for between values
-	 */
-	public void setSeparator(String separator) {
-		this._separator = separator;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/StyleComboCellEditor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/StyleComboCellEditor.java
deleted file mode 100644
index dba336d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/StyleComboCellEditor.java
+++ /dev/null
@@ -1,257 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.celleditors;
-
-import java.text.MessageFormat;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jst.jsf.common.ui.internal.utils.StyleCombo;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.FocusAdapter;
-import org.eclipse.swt.events.FocusEvent;
-import org.eclipse.swt.events.KeyAdapter;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.TraverseEvent;
-import org.eclipse.swt.events.TraverseListener;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * Combo cell editor
- *
- */
-public class StyleComboCellEditor extends CellEditor {
-	/**
-	 * The list of items to present in the combo box.
-	 */
-	private String[] items;
-
-	/**
-	 * The zero-based index of the selected item.
-	 */
-	int selection;
-
-	/**
-	 * The custom combo box control.
-	 */
-	StyleCombo comboBox;
-
-	/**
-	 * Default ComboBoxCellEditor style
-	 */
-	private static final int defaultStyle = SWT.NONE;
-
-	/**
-	 * Default constructor
-	 */
-	public StyleComboCellEditor() {
-		setStyle(defaultStyle);
-	}
-
-	/**
-	 * @param parent
-	 * @param items
-	 */
-	public StyleComboCellEditor(Composite parent, String[] items) {
-		this(parent, items, defaultStyle);
-	}
-
-	/**
-	 * @param parent
-	 * @param items
-	 * @param style
-	 */
-	public StyleComboCellEditor(Composite parent, String[] items, int style) {
-		super(parent, style);
-		setItems(items);
-	}
-
-	/**
-	 * Returns the list of choices for the combo box
-	 * 
-	 * @return the list of choices for the combo box
-	 */
-	public String[] getItems() {
-		return this.items;
-	}
-
-	/**
-	 * Sets the list of choices for the combo box
-	 * 
-	 * @param items
-	 *            the list of choices for the combo box
-	 */
-	public void setItems(String[] items) {
-		Assert.isNotNull(items);
-		this.items = items;
-		populateComboBoxItems();
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on CellEditor.
-	 */
-	protected Control createControl(Composite parent) {
-
-		comboBox = new StyleCombo(parent, getStyle());
-		comboBox.setFont(parent.getFont());
-
-		comboBox.addKeyListener(new KeyAdapter() {
-			// hook key pressed - see PR 14201
-			public void keyPressed(KeyEvent e) {
-				keyReleaseOccured(e);
-			}
-		});
-
-		comboBox.addSelectionListener(new SelectionAdapter() {
-			public void widgetDefaultSelected(SelectionEvent event) {
-				applyEditorValueAndDeactivate();
-			}
-
-			public void widgetSelected(SelectionEvent event) {
-				selection = comboBox.getSelectionIndex();
-			}
-		});
-
-		comboBox.addTraverseListener(new TraverseListener() {
-			public void keyTraversed(TraverseEvent e) {
-				if (e.detail == SWT.TRAVERSE_ESCAPE
-						|| e.detail == SWT.TRAVERSE_RETURN) {
-					e.doit = false;
-				}
-			}
-		});
-
-		comboBox.addFocusListener(new FocusAdapter() {
-			public void focusLost(FocusEvent e) {
-				StyleComboCellEditor.this.focusLost();
-			}
-		});
-		return comboBox;
-	}
-
-	/**
-	 * The <code>ComboBoxCellEditor</code> implementation of this
-	 * <code>CellEditor</code> framework method returns the zero-based index
-	 * of the current selection.
-	 * 
-	 * @return the zero-based index of the current selection wrapped as an
-	 *         <code>Integer</code>
-	 */
-	protected Object doGetValue() {
-		return new Integer(selection);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on CellEditor.
-	 */
-	protected void doSetFocus() {
-		comboBox.setFocus();
-	}
-
-	/**
-	 * The <code>ComboBoxCellEditor</code> implementation of this
-	 * <code>CellEditor</code> framework method sets the minimum width of the
-	 * cell. The minimum width is 10 characters if <code>comboBox</code> is
-	 * not <code>null</code> or <code>disposed</code> eles it is 60 pixels
-	 * to make sure the arrow button and some text is visible. The list of
-	 * CCombo will be wide enough to show its longest item.
-	 */
-	public LayoutData getLayoutData() {
-		LayoutData layoutData = super.getLayoutData();
-		if ((comboBox == null) || comboBox.isDisposed())
-			layoutData.minimumWidth = 60;
-		else {
-			// make the comboBox 10 characters wide
-			GC gc = new GC(comboBox);
-			layoutData.minimumWidth = (gc.getFontMetrics()
-					.getAverageCharWidth() * 10) + 10;
-			gc.dispose();
-		}
-		return layoutData;
-	}
-
-	/**
-	 * The <code>ComboBoxCellEditor</code> implementation of this
-	 * <code>CellEditor</code> framework method accepts a zero-based index of
-	 * a selection.
-	 * 
-	 * @param value
-	 *            the zero-based index of the selection wrapped as an
-	 *            <code>Integer</code>
-	 */
-	protected void doSetValue(Object value) {
-		Assert.isTrue(comboBox != null && (value instanceof Integer));
-		selection = ((Integer) value).intValue();
-		comboBox.select(selection);
-	}
-
-	/**
-	 * Updates the list of choices for the combo box for the current control.
-	 */
-	private void populateComboBoxItems() {
-		if (comboBox != null && items != null) {
-			comboBox.removeAll();
-			for (int i = 0; i < items.length; i++)
-				comboBox.add(items[i], i);
-
-			setValueValid(true);
-			selection = 0;
-		}
-	}
-
-	/**
-	 * Applies the currently selected value and deactiavates the cell editor
-	 */
-	void applyEditorValueAndDeactivate() {
-		// must set the selection before getting value
-		selection = comboBox.getSelectionIndex();
-		Object newValue = doGetValue();
-		markDirty();
-		boolean isValid = isCorrect(newValue);
-		setValueValid(isValid);
-		if (!isValid) {
-			// try to insert the current value into the error message.
-			setErrorMessage(MessageFormat.format(getErrorMessage(),
-					new Object[] { items[selection] }));
-		}
-		fireApplyEditorValue();
-		deactivate();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.CellEditor#focusLost()
-	 */
-	protected void focusLost() {
-		if (isActivated()) {
-			applyEditorValueAndDeactivate();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.CellEditor#keyReleaseOccured(org.eclipse.swt.events.KeyEvent)
-	 */
-	protected void keyReleaseOccured(KeyEvent keyEvent) {
-		if (keyEvent.character == '\u001b') { // Escape character
-			fireCancelEditor();
-		} else if (keyEvent.character == '\t') { // tab key
-			applyEditorValueAndDeactivate();
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/messages.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/messages.properties
deleted file mode 100644
index aa55e43..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/celleditors/messages.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-FileCellEditor.Title=Select File
-FileCellEditor.Msg=Select a file
-FileCellEditor.Msg1=Select one or more files
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/dialogfields/MDEnabledComboDialogField.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/dialogfields/MDEnabledComboDialogField.java
deleted file mode 100644
index e63245f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/dialogfields/MDEnabledComboDialogField.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Oracle - initial API and implementation
- *
- ********************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.dialogfields;
-
-import java.util.Iterator;
-import java.util.Map;
-import java.util.TreeMap;
-
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StyleComboDialogField;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.jsf.metadataprocessors.features.IDefaultValue;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValue;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.IElementContextable;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-
-/**
- * This combo dialog field defers loading the combos until the element context has been set
- *
- */
-public class MDEnabledComboDialogField extends StyleComboDialogField implements IElementContextable {
-
-	/**
-	 * Constructor
-	 * @param flags
-	 */
-	public MDEnabledComboDialogField(int flags) {
-		super(flags);
-	}
-
-	public void setElementContext(IDOMNode ancester, IDOMElement element) {
-		IStructuredDocumentContext sdContext =IStructuredDocumentContextFactory.INSTANCE.getContext(element.getStructuredDocument(), element);
-		IPropertyPageDescriptor ppd = (IPropertyPageDescriptor)getAttachedData("KEY_ATTR");//FIXME use constant //$NON-NLS-1$
-		ppd.setStructuredDocumentContext(sdContext);
-		IPossibleValues pvs = (IPossibleValues)ppd.getAdapter(IPossibleValues.class);
-		IDefaultValue def = (IDefaultValue)ppd.getAdapter(IDefaultValue.class);
-		if (def != null)
-			setDefaultValue(def.getDefaultValue());
-		if (pvs.getPossibleValues() != null)
-			setEntryMap(getMapOfPossibleValues(pvs));
-	}
-
-	private Map getMapOfPossibleValues(IPossibleValues pvs) {
-		Map map = new TreeMap<String, String>();
-		for (Iterator<IPossibleValue> it=pvs.getPossibleValues().iterator();it.hasNext();){
-			IPossibleValue pv = it.next();
-			map.put(pv.getValue(), pv.getDisplayValue());
-		}
-		return map;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/AllPropertySectionDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/AllPropertySectionDescriptor.java
deleted file mode 100644
index 8c5de9b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/AllPropertySectionDescriptor.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import org.eclipse.jst.pagedesigner.properties.AllPropertySection;
-import org.eclipse.ui.views.properties.tabbed.AbstractSectionDescriptor;
-import org.eclipse.ui.views.properties.tabbed.ISection;
-
-/**
- * SectionDescriptor for the WPE Attributes tab
- */
-public class AllPropertySectionDescriptor extends AbstractSectionDescriptor {
-	/**
-	 * Id for the WPE AllPropertySectionDescriptor
-	 */
-	public static final String ID = "AllPropertySectionDescriptor"; //$NON-NLS-1$
-
-	private ISection section;
-
-	public String getId() {
-		return ID;
-	}
-
-	public ISection getSectionClass() {
-		if (section == null){
-			section = new AllPropertySection();
-		}
-		return section;
-	}
-
-	public String getTargetTab() {
-		return AttributesTabDescriptor.TAB_ID;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/AttributeGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/AttributeGroup.java
deleted file mode 100644
index 585cd4e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/AttributeGroup.java
+++ /dev/null
@@ -1,441 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroup;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldChangeListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ISupportTextValue;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.jsf.metadataprocessors.MetaDataEnabledProcessingFactory;
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.IElementContextable;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-
-/**
- * @author mengbo
- * @version 1.5
- * 
- * TODO: cleanup up constructors
- */
-public class AttributeGroup extends DialogFieldGroup {
-	private static final Object KEY_ATTR = "KEY_ATTR"; //$NON-NLS-1$
-
-//	private String _helpContextId;
-
-	private List<DialogField> _dialogFields = null;  //consider using Map
-	private IDOMElement _ownerElement;
-	private Entity _tagEntity;
-	private List<String> _attrNames;
-	private List<IPropertyPageDescriptor> _attrPDs;
-	private IStructuredDocumentContext _sdContext;
-
-	private String _uri;
-	private String _tagName;
-	
-	/**
-	 * Constructor
-	 * @param tagEntity - may not be null
-	 * @param attrNames - may not be null.  Attribute names must be valid for the tag, and have attribute-value-runtime-type trait info
-	 */
-	public AttributeGroup(Entity tagEntity, List<String> attrNames) {
-		_tagEntity = tagEntity;
-		_attrNames = attrNames;		
-	}
-	
-	/**
-	 * Constructor where tagEntity is determined later or set later
-	 * @param uri - may be null
-	 * @param tagName - may be null
-	 * @param attributeNames - may not be null.  Attribute names must be valid for the tag, and have attribute-value-runtime-type trait info
-	 */
-	public AttributeGroup(String uri,
-			String tagName, String[] attributeNames) {
-		_uri = uri;
-		_tagName = tagName;
-		if (attributeNames != null)
-			_attrNames = Arrays.asList(attributeNames);
-		else 
-			_attrNames = new ArrayList();
-	}
-	
-	private List<IPropertyPageDescriptor> prepareDescriptors(Entity tagEntity,
-			List<String> names) {
-		
-		List pds = new ArrayList();
-		for (String attrName : names) {
-			IPropertyPageDescriptor pd = getPD(tagEntity, attrName);
-			if (pd != null)
-				pds.add(pd);
-		}
-		return pds;
-	}
-
-	private IPropertyPageDescriptor getPD(Entity tagEntity, String attrName) {		
-		IPropertyPageDescriptor pd = null;
-		Entity attrEntity = TaglibDomainMetaDataQueryHelper.getEntity(tagEntity, attrName);
-		if (attrEntity != null){
-			List pds = MetaDataEnabledProcessingFactory.getInstance().getAttributeValueRuntimeTypeFeatureProcessors(
-							IPropertyPageDescriptor.class, getStructuredDocumentContext(), attrEntity);					
-			if (pds != null && !pds.isEmpty())
-				pd = (IPropertyPageDescriptor)pds.get(0);
-			else 
-				pd = new DefaultPropertyPageDescriptor(tagEntity, attrEntity);
-		}
-		return pd;
-	}
-
-
-	private void resetStructuredDocumentContext() {
-		_sdContext = null;
-		getStructuredDocumentContext();		
-	}
-
-	private IStructuredDocumentContext getStructuredDocumentContext() {
-		if (_sdContext == null) {
-			if (_ownerElement != null) {
-				_sdContext = IStructuredDocumentContextFactory.INSTANCE.getContext(_ownerElement.getStructuredDocument(), _ownerElement);				
-				
-			} else {
-				IEditorPart edPart = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
-				if (edPart != null && edPart instanceof HTMLEditor) {//edPart will always be the WPE, but checking just to be safe
-					_sdContext = IStructuredDocumentContextFactory.INSTANCE.getContext(((HTMLEditor)edPart).getDocument(), 0);
-				}
-			} 
-		}
-		return _sdContext;
-	}
-
-	/**
-	 * @return tag entity for this attribute group
-	 */
-	protected Entity getTagEntity() {
-		if (_tagEntity == null) {
-			if (_ownerElement != null){
-				IStructuredDocumentContext context = IStructuredDocumentContextFactory.INSTANCE.getContext(_ownerElement.getStructuredDocument(), 0);
-				if (context != null){
-					String uri = _uri != null ? _uri : IStructuredDocumentContextResolverFactory.INSTANCE.getDOMContextResolver(context).getNode().getBaseURI();
-					String tagName = _tagName != null ? _tagName :  IStructuredDocumentContextResolverFactory.INSTANCE.getDOMContextResolver(context).getNode().getNodeName();
-					if (uri != null){
-						IProject project = IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(context).getProject();
-						_tagEntity = TaglibDomainMetaDataQueryHelper.getEntity(TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(project, uri), tagName);
-					}
-				}
-			}
-		}
-		return _tagEntity;
-	}
-	/**
-	 * @return tag name
-	 */
-	public String getTagName() {
-		if (getTagEntity() == null)
-			return _tagName;
-		return getTagEntity().getId();
-	}
-
-	/**
-	 * @return tag URI
-	 */
-	public String getURI() {
-		if (getTagEntity() == null)
-			return _uri;
-		return getTagEntity().getModel().getCurrentModelContext().getUri();
-	}
-
-
-	/**
-	 * Empty implementation. Subclasses should override to override default dialogField creation
-	 * @param ppd
-	 * @return DialogField
-	 */
-	protected DialogField createDialogField(IPropertyPageDescriptor ppd) {
-		return null;
-	}
-	
-//	protected DialogField createDialogField(String uri, String tag,
-//			String attr) {
-//		
-//		return null;
-//	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroup#initialize()
-	 */
-	public void initialize() {
-		if (_dialogFields == null) {
-			_dialogFields = new ArrayList();
-
-			for (IPropertyPageDescriptor pd : getAttributePDs()) {
-				DialogField field;			
-				field = createDialogField(pd);
-				
-				if (field == null) {
-					field = pd.getDialogFieldEditor();
-				}
-
-				field.putAttachedData(KEY_ATTR, pd);//descriptors[i]);
-
-				IDialogFieldApplyListener applyListener = getDialogFieldApplyListener(pd);
-//						getURI(), getTagName(), pd.getAttributeName());//descriptors[i]);
-				if (applyListener == null) {
-					applyListener = getDefaultApplyListener();
-				}
-				field.setDialogFieldApplyListener(applyListener);
-
-				IDialogFieldChangeListener changeListener = getDialogFieldChangeListener(pd);
-//						getURI(), getTagName(), pd.getAttributeName());//descriptors[i]);
-				if (changeListener == null) {
-					changeListener = getDefaultChangeListener();
-				}
-				field.setDialogFieldChangeListener(changeListener);
-				_dialogFields.add(field);
-			}
-		}
-	}
-
-	private List<IPropertyPageDescriptor> getAttributePDs() {
-		if (_attrPDs == null){
-			_attrPDs = prepareDescriptors(getTagEntity(), _attrNames);
-		}
-		return _attrPDs;
-	}
-
-	/**
-	 * Child class can override the method to provide listener implementation
-	 * 
-	 * @param ppd
-	 * @return IDialogFieldApplyListener
-	 */
-	protected IDialogFieldApplyListener getDialogFieldApplyListener(IPropertyPageDescriptor ppd) {
-		return null;
-	}
-
-	/**
-	 * Child class can override the method to provide listener implementation
-	 * 
-	 * @param ppd
-	 * @return IDialogFieldChangeListener
-	 */
-	protected IDialogFieldChangeListener getDialogFieldChangeListener(IPropertyPageDescriptor ppd){
-			return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogFieldGroup#refreshData()
-	 */
-	public void refreshData() {
-		if (_ownerElement == null) {
-			return;
-		}
-		initialize();
-		for (int i = 0, size = _dialogFields.size(); i < size; i++) {
-			DialogField field = _dialogFields.get(i);
-
-			ISupportTextValue textValue = (ISupportTextValue) field;
-			IPropertyPageDescriptor attr = (IPropertyPageDescriptor) field
-					.getAttachedData(KEY_ATTR);
-			String attrName = attr.getAttributeName();
-			String attrValue = _ownerElement.getAttribute(attrName);
-			textValue.setTextWithoutUpdate(attrValue);
-		}
-	}
-
-	/**
-	 * @return IDOMElement
-	 */
-	public IDOMElement getElement() {
-		return _ownerElement;
-	}
-
-	/**
-	 * Sets the context in each of the dialogFields in the Group
-	 * @param context
-	 * @param owner
-	 */
-	public void setElementContext(IDOMNode context, IDOMElement owner) {
-		this._ownerElement = owner;
-		resetStructuredDocumentContext();
-		initialize();
-		if (context != null) {
-			for (int i = 0, size = _dialogFields.size(); i < size; i++) {
-				DialogField field = _dialogFields.get(i);
-				if (field instanceof IElementContextable) {
-					((IElementContextable) field).setElementContext(context,
-							owner);
-				}
-			}
-		}
-		refreshData();
-	}
-
-	public void layoutDialogFields(FormToolkit toolkit, Composite parent) {
-		Composite top;
-		if (toolkit == null) {//when being displayed by DialogFieldGroupPage  (wizard)
-			top = new Composite(parent, SWT.NONE);
-			FillLayout fillLayout = new FillLayout(SWT.VERTICAL);
-			parent.setLayout(fillLayout);
-		} else {
-			top = toolkit.createComposite(parent, SWT.NONE);
-		}
-//		FillLayout fillLayout = new FillLayout(SWT.VERTICAL);
-//		parent.setLayout(fillLayout);
-
-//		if (this._helpContextId != null && this._helpContextId.length() > 0) {
-//			PlatformUI.getWorkbench().getHelpSystem().setHelp(top,
-//					_helpContextId);
-//		}
-
-		GridLayout layout = new GridLayout();
-		int numColumns = getNumColumns();
-		layout.numColumns = numColumns;
-		top.setLayout(layout);
-//		top.setLayoutData(new RowData());
-		
-		initialize();
-		for (int i = 0, size = _dialogFields.size(); i < size; i++) {
-			DialogField field = _dialogFields.get(i);
-			field.doFillIntoGrid(toolkit, top, numColumns);
-		}
-
-		DialogField maxColumnField = null;
-		int maxColumn = 0;
-		for (int i = 0, size = _dialogFields.size(); i < size; i++) {
-			DialogField field = _dialogFields.get(i);
-			int c = field.getNumberOfControls();
-			if (c > maxColumn) {
-				maxColumn = c;
-				maxColumnField = field;
-			}
-		}
-		if (maxColumnField != null) {
-			maxColumnField.handleGrabHorizontal();
-		}
-	}
-
-	/**
-	 * @return number of columns in for composite grid layout
-	 */
-	public int getNumColumns() {
-		int columns = 1;
-		initialize();
-		for (int i = 0, size = _dialogFields.size(); i < size; i++) {
-			DialogField field = _dialogFields.get(i);
-			columns = Math.max(columns, field.getNumberOfControls());
-		}
-		return columns;
-	}
-	
-	@Override
-	public IStatus[] validateDialogFields() {
-		return null;
-	}
-
-	/**
-	 * @return DialogField[]
-	 */
-	public DialogField[] getDialogFields() {
-		initialize();
-		DialogField[] ret = new DialogField[_dialogFields.size()];
-		_dialogFields.toArray(ret);
-		return ret;
-	}
-
-	/**
-	 * get the dialogfield for the corresponding attribute.
-	 * 
-	 * @param attrName
-	 *            case sensitive attribute name.
-	 * @return null if fail to find.
-	 */
-	public DialogField getDialogField(String attrName) {
-		initialize();
-		for (int i = 0, size = _dialogFields.size(); i < size; i++) {
-			DialogField field = _dialogFields.get(i);
-			IPropertyPageDescriptor attr = this.getPropertyDescriptor(field);
-			if (attr != null && attr.getAttributeName().equals(attrName)) {
-				return field;
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * @param field
-	 * @return IPropertyPageDescriptor
-	 */
-	public IPropertyPageDescriptor getPropertyDescriptor(DialogField field) {
-		Object obj = field.getAttachedData(KEY_ATTR);
-		if (obj instanceof IPropertyPageDescriptor) {
-			return (IPropertyPageDescriptor) obj;
-		}
-	    return null;
-	}
-	
-	@Override
-	public void reset(){
-		if (_dialogFields != null){
-			for (DialogField field : _dialogFields){
-				field.setDialogFieldApplyListener(null);
-				field.setDialogFieldChangeListener(null);
-			}
-			_dialogFields = null;
-		}
-	}
-
-	/**
-	 * Set the tag entity
-	 * @param tagEntity
-	 */
-	/*package*/ void setTagEntity(Entity tagEntity) {
-		_tagEntity = tagEntity;		
-	}
-
-	public String toString(){
-		StringBuffer buf = new StringBuffer("AttributeGroup: uri="); //$NON-NLS-1$
-		buf.append("\r\r").append(getURI()).append("\r\rtag=").append(getTagName()); //$NON-NLS-1$ //$NON-NLS-2$
-		buf.append("\r\rAttrs: "); //$NON-NLS-1$
-		for (int i=0;i<_attrNames.size();i++) {
-			String attr = _attrNames.get(i);
-			buf.append(attr);
-			if (i<_attrNames.size())
-				buf.append(", "); //$NON-NLS-1$
-		}
-		return buf.toString();
-	}
-	
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/AttributeGroupSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/AttributeGroupSection.java
deleted file mode 100644
index 49a49e4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/AttributeGroupSection.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import java.util.List;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ISupportTextValue;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeAttributeCommand;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.jst.pagedesigner.properties.BaseCustomSection;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.AttributeGroupMessages;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-
-/**
- * This is a section for a list of attribute dialog fields.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class AttributeGroupSection extends BaseCustomSection {
-	private static final Object KEY_ATTR = "KEY_ATTR"; //$NON-NLS-1$
-	private IDialogFieldApplyListener _fieldApplyListener = new IDialogFieldApplyListener() {
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener#dialogFieldApplied(org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField)
-		 */
-		public void dialogFieldApplied(DialogField field) {
-			Object attr = field.getAttachedData(KEY_ATTR);
-			if (attr instanceof IPropertyPageDescriptor && _element != null) {
-				ISupportTextValue textValue = (ISupportTextValue) field;
-				ChangeAttributeCommand c = new ChangeAttributeCommand(
-						AttributeGroupMessages
-								.getString("AttributeGroupSection.changeAttribute"), _element, ((IPropertyPageDescriptor) attr).getAttributeName(), textValue.getText()); //$NON-NLS-1$
-				c.execute();
-			}
-		}
-	};
-
-	private AttributeGroup _group;
-
-	/**
-	 * Constructor.  Create the section with a default AttributeGroup. In default
-	 * AttributeGroup, there is no relationship between fields.
-	 * 
-	 * @param tagEntity
-	 * @param attrNames
-	 */
-	public AttributeGroupSection(Entity tagEntity, List<String> attrNames) {
-		this(new AttributeGroup(tagEntity, attrNames));
-	}
-
-	/**
-	 * Constructor.  In case the group is not a default group (e.g. you may add some
-	 * customized relationship between the fields).
-	 * 
-	 * @param group
-	 */
-	public AttributeGroupSection(AttributeGroup group) {
-		_group = group;
-		_group.setDefaultApplyListener(_fieldApplyListener);
-//		_group.initialize();
-	}
-
-	public void setInput(IWorkbenchPart part, ISelection selection) {
-		super.setInput(part, selection);
-		_group.setElementContext(_element, _element);
-	}
-
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage aTabbedPropertySheetPage) {
-		super.createControls(parent, aTabbedPropertySheetPage);
-		TabbedPropertySheetWidgetFactory factory = aTabbedPropertySheetPage
-				.getWidgetFactory();
-		_group.layoutDialogFields(factory, parent);
-	}
-
-	protected void notifyChanged(INodeNotifier notifier, int eventType,
-			Object changedFeature, Object oldValue, Object newValue, int pos) {
-		if (_group != null) {
-			_group.refreshData();
-		}
-	}
-
-	@Override
-	public void dispose() {
-		super.dispose();
-		_group.reset();
-	}
-	
-	/**
-	 * NOT API - for JUnit testing only
-	 * @return @link{AttributeGroup}
-	 */
-	public AttributeGroup getAttributeGroup() {		
-		return _group;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/AttributesTabDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/AttributesTabDescriptor.java
deleted file mode 100644
index 4c00440..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/AttributesTabDescriptor.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import java.util.List;
-import java.util.Vector;
-
-import org.eclipse.ui.views.properties.tabbed.AbstractTabDescriptor;
-import org.eclipse.ui.views.properties.tabbed.ISectionDescriptor;
-
-/**
- * Attributes tab descriptor
- *
- */
-public class AttributesTabDescriptor extends AbstractTabDescriptor {
-	
-	/**
-	 * Attributes tab id 
-	 */
-	public static final String TAB_ID = "jst.pagedesigner.tabbed.properties.attributes"; //$NON-NLS-1$
-
-	private Vector<ISectionDescriptor> descriptors;
-	
-	/**
-	 * Constructor
-	 */
-	public AttributesTabDescriptor(){
-		super();
-		descriptors = new Vector<ISectionDescriptor>(1);
-		descriptors.add(new AllPropertySectionDescriptor());
-	}
-	
-	@Override
-	public List getSectionDescriptors() {		
-		return descriptors;
-	}
-
-	public String getCategory() {
-		return "attributes"; //$NON-NLS-1$
-	}
-
-	public String getId() {
-		return TAB_ID;
-	}
-
-	public String getLabel() {
-		return Messages.AttributesTabDescriptor_label;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/DefaultPropertyPageDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/DefaultPropertyPageDescriptor.java
deleted file mode 100644
index e22bf2e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/DefaultPropertyPageDescriptor.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.metadataprocessors.MetaDataContext;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.jst.pagedesigner.meta.EditorCreator;
-import org.eclipse.jst.pagedesigner.meta.IAttributeRuntimeValueType;
-import org.eclipse.jst.pagedesigner.meta.internal.CellEditorFactoryRegistry;
-import org.eclipse.jst.pagedesigner.properties.ITabbedPropertiesConstants;
-import org.eclipse.swt.widgets.Composite;
-import org.w3c.dom.Element;
-
-/**
- * Property descriptor implementation for when meta data is available, but the
- * meta data type is not adaptable to a {@link IPropertyPageDescriptor}.
- * 
- * It is assumed that the value type is
- * {@link org.eclipse.jst.jsf.taglibprocessing.attributevalues.StringType}.
- */
-public class DefaultPropertyPageDescriptor implements IPropertyPageDescriptor
-{
-    private Entity _tagEntity;
-    private Entity _attrEntity;
-
-    private IStructuredDocumentContext _sdContext;
-    private MetaDataContext _mdContext;
-
-    /**
-     * Constructor
-     * 
-     * @param tagEntity
-     * @param attrEntity
-     */
-    public DefaultPropertyPageDescriptor(Entity tagEntity, Entity attrEntity)
-    {
-        _tagEntity = tagEntity;
-        _attrEntity = attrEntity;
-    }
-
-    public String getAttributeName()
-    {
-        return _attrEntity.getId();
-    }
-
-    public String getCategory()
-    {
-        return ITabbedPropertiesConstants.OTHER_CATEGORY;
-    }
-
-    public CellEditor getCellEditor(Composite parent)
-    {
-        Element element = (Element) IStructuredDocumentContextResolverFactory.INSTANCE
-                .getDOMContextResolver(getStructuredDocumentContext())
-                .getNode();
-        return CellEditorFactoryRegistry.getInstance().createCellEditor(parent,
-                this, element);
-    }
-
-    public String getDescription()
-    {
-        return null;
-    }
-
-    public DialogField getDialogFieldEditor()
-    {
-        EditorCreator creator = EditorCreator.getInstance();
-        return creator.createDialogFieldWithWrapper(getUri(), getTagName(),
-                this, null);
-    }
-
-    public String getLabel()
-    {
-        return getAttributeName() + ":";
-    }
-
-    public String getTagName()
-    {
-        return _tagEntity.getId();
-    }
-
-    public String getUri()
-    {
-        return _tagEntity.getModel().getCurrentModelContext().getUri();
-    }
-
-    public String getValueType()
-    {
-        return IAttributeRuntimeValueType.STRING;
-    }
-
-    public boolean isRequired()
-    {
-        return false;
-    }
-
-    public MetaDataContext getMetaDataContext()
-    {
-        return _mdContext;
-    }
-
-    public IStructuredDocumentContext getStructuredDocumentContext()
-    {
-        return _sdContext;
-    }
-
-    public void setMetaDataContext(MetaDataContext context)
-    {
-        _mdContext = context;
-    }
-
-    public void setStructuredDocumentContext(IStructuredDocumentContext context)
-    {
-        _sdContext = context;
-    }
-
-    public Object getAdapter(Class adapter)
-    {
-        return null;
-    }
-
-    public String toString()
-    {
-        return getUri()
-                + "/" + getTagName() + "/" + getAttributeName() + " (Default Descriptor)"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/MDQuickEditTabSectionDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/MDQuickEditTabSectionDescriptor.java
deleted file mode 100644
index e1628d4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/MDQuickEditTabSectionDescriptor.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.AbstractSectionDescriptor;
-import org.eclipse.ui.views.properties.tabbed.ISection;
-
-/**
- * Quick Edit section descriptor that uses the quickEditSection trait meta data for the tag entity of the selection
- * to determine the sections to display
- *
- */
-public class MDQuickEditTabSectionDescriptor extends AbstractSectionDescriptor {
-	
-	/**
-	 * Default constructor
-	 */
-	public MDQuickEditTabSectionDescriptor() {
-		super();
-	}
-	
-	@Override
-	public boolean appliesTo(IWorkbenchPart part, ISelection selection) {
-		return true;// we will always display tab, but will show text that no quick edit properties are available when they aren't
-	}
-	
-	public ISection getSectionClass() {
-		return new  QuickEditTabSection();
-	}
-
-	public String getTargetTab() {
-		return QuickEditTabDescriptor.TAB_ID;
-	}
-
-	public String getId() {
-		return "mdQuickEditTabSections"; //$NON-NLS-1$
-	}
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/Messages.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/Messages.java
deleted file mode 100644
index 275a500..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/Messages.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Externalized strings
- *
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.pagedesigner.properties.internal.messages"; //$NON-NLS-1$
-	/**
-	 * 
-	 */
-	public static String AttributesTabDescriptor_label;
-	/**
-	 * 
-	 */
-	public static String QuickEditTabDescriptor_label;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-		//
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/NullQuickEditTabGroupDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/NullQuickEditTabGroupDescriptor.java
deleted file mode 100644
index 893b6ab..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/NullQuickEditTabGroupDescriptor.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.ui.views.properties.tabbed.ISection;
-
-/**
- * QuickEdit Tab section when quick edit section info is not available.
- * 
- * Ideally we should not be displaying the tab in the absence of MD, but due to current 
- * issues with the tabbed-properties framework, it is easier to simply display a "null"
- * section. 
- *
- */
-public class NullQuickEditTabGroupDescriptor extends
-		QuickEditTabSectionsDescriptor {
-
-	private List<ISection> nullQuickEditSection;
-	
-	/**
-	 * Constructor
-	 */
-	public NullQuickEditTabGroupDescriptor() {
-		super();
-	}
-
-	@Override
-	public List<ISection> getSections() {
-		return nullQuickEditSection;
-	}
-	
-	@Override
-	public void calculateSections() {
-		nullQuickEditSection = new ArrayList<ISection>(1);
-		nullQuickEditSection.add(new NullQuickEditTabSection());
-	}
-	
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/NullQuickEditTabSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/NullQuickEditTabSection.java
deleted file mode 100644
index 11712bf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/NullQuickEditTabSection.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.views.properties.tabbed.AbstractPropertySection;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
-
-/**
- * Section that displays text that no quick edit properties are available for the input
- */
-public class NullQuickEditTabSection extends AbstractPropertySection {
-
-	@Override
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage tabbedPropertySheetPage) {
-		super.createControls(parent, tabbedPropertySheetPage);
-		TabbedPropertySheetWidgetFactory factory = tabbedPropertySheetPage.getWidgetFactory();
-		
-		Composite cont = factory.createComposite(parent, SWT.NO_FOCUS);
-		GridLayout layout = new GridLayout(1, false);
-		cont.setLayout(layout);
-
-		CLabel lbl = 
-			factory.createCLabel(cont, PDPlugin.getResourceString("QuickEditTab.no_quick_edit_md"));//$NON-NLS-1$
-		lbl.setLayoutData(new GridData());		
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabDescriptor.java
deleted file mode 100644
index 5917065..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabDescriptor.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import org.eclipse.ui.views.properties.tabbed.AbstractTabDescriptor;
-
-/**
- * Quick Edit Tab Descriptor
- */
-public class QuickEditTabDescriptor extends AbstractTabDescriptor {
-
-	/**
-	 * Quick Edit tab id
-	 */
-	public static final String TAB_ID = "jst.pagedesigner.tabbed.properties.quickedit"; //$NON-NLS-1$
-	
-	/**
-	 * Constructor
-	 */
-	public QuickEditTabDescriptor(){
-		super();
-		getSectionDescriptors().add(new MDQuickEditTabSectionDescriptor());
-	}
-	
-	public String getCategory() {
-		return "quickedit"; //$NON-NLS-1$
-	}
-
-	public String getId() {
-		return TAB_ID;
-	}
-
-	public String getLabel() {
-		return Messages.QuickEditTabDescriptor_label;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabManager.java
deleted file mode 100644
index f14058a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabManager.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import javax.xml.namespace.QName;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.jsf.common.metadata.Trait;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.ITaglibContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSections;
-import org.eclipse.jst.pagedesigner.properties.DesignerPropertyTool;
-import org.eclipse.jst.pagedesigner.properties.WPETabbedPropertySheetPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.part.FileEditorInput;
-import org.w3c.dom.Element;
-
-/**
- * One-to-one with {@link WPETabbedPropertySheetPage} that manages the current sections for the current selection.
- * <p>
- * The QuickEditTabManager has a shared instance of a {@link QuickEditTabSectionsManager} for the project.
- * <p>
- * When a WPETabbedPropertySheetPage is created, it must acquire a QuickEditTabManager using the static acquireInstance method,
- * and then release the instance when it is disposed.  This ensures that the QuickEditTabSectionsManager shared instance (per project) is released appropriately.
- * <p>
- * selectionChanged method must be called prior to calling createControls on the sections for this tab group call.
- */
-public class QuickEditTabManager {
-	private QuickEditTabSectionsManager _groupsManager;
-	private QuickEditTabSections _quickEditTabSections;
-	private Entity _tagEntity;
-	private QName _lastTagID;
-	private QuickEditTabSectionsDescriptor _lastQuickEditTabGroup;
-	private QuickEditTabSectionsDescriptor _nullQuickEditTabGroup;
-	private Element _lastElement;
-	
-	private QuickEditTabSectionsManager getRegistry() {
-		return _groupsManager;
-	}
-
-	/**
-	 * Must only be called once per tabbed property sheet as ref count is kept.  
-	 * Callers must call releaseInstance when the page is disposed
-	 * @param page 
-	 * @return instance for this property sheet
-	 */
-	public static synchronized QuickEditTabManager acquireInstance(WPETabbedPropertySheetPage page) {
-		IProject project = getProject(page);	
-		QuickEditTabManager instance = new QuickEditTabManager();
-		instance._groupsManager = QuickEditTabSectionsManager.acquireInstance(project);
-		return instance;		
-	}
-
-	/**
-	 * Releases this instance, but does not dispose.  Ensures that the {@link QuickEditTabSectionsManager} is released.
-	 */
-	public synchronized void releaseInstance() {
-		this._groupsManager.releaseInstance();			
-	}
-	
-	/**
-	 * Private constructor
-	 */
-	private QuickEditTabManager(){
-		//
-	}
-	
-	private static IProject getProject(WPETabbedPropertySheetPage page) {
-		IProject proj = null;
-		IDocument doc = ((HTMLEditor)page.getEditor()).getDocument();
-		IStructuredDocumentContext context = IStructuredDocumentContextFactory.INSTANCE.getContext(doc, 0);
-		if (context != null){
-			proj = IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(context).getProject();
-		}
-		return proj;
-		 
-	}
-	/**
-	 * Must be called so that the sections for the input can be calculated. 
-	 * 
-	 * @param part
-	 * @param selection
-	 * @return true if current selection is different than during the last call
-	 */
-	public boolean selectionChanged(IWorkbenchPart part, ISelection selection) {
-		boolean hasChanged = false;
-		QuickEditTabSections qets = getQuickTabSectionsMetaData(part, selection); 
-		if (qets == null) {//use null quick edit tab			
-			hasChanged = (_quickEditTabSections != null);
-			_quickEditTabSections = qets;
-			_lastQuickEditTabGroup = getNullQuickEditTab();
-			_lastTagID = null;
-		}
-		else {
-			QName tagId = getTagId();
-			if (_lastTagID == null || !_lastTagID.equals(tagId)){
-				_quickEditTabSections = qets;
-				QuickEditTabSectionsDescriptor group = getRegistry().getQuickEditTabSectionsFor(tagId);
-				if (group == null){
-					group = createQuickEditTabGroup(tagId, _quickEditTabSections);
-					if (group != null){					
-						group.calculateSections();
-						getRegistry().addQuickEditTabGroupDescriptor(group);
-					}
-				}
-				_lastQuickEditTabGroup = group;
-				_lastTagID = tagId;
-			}
-		} 
-
-		return hasChanged;
-	}
-	
-	/**
-	 * @return current QuickEditTabSectionsDescriptor
-	 */
-	public QuickEditTabSectionsDescriptor getCurrentTabGroupDescriptor() {
-		return _lastQuickEditTabGroup;
-	}
-	
-	private QuickEditTabSections getQuickTabSectionsMetaData(IWorkbenchPart part,
-			ISelection selection) {
-
-		Element node = DesignerPropertyTool.getElement(part, selection);
-		if (node == null) {
-			return null;
-		}
-		if (_lastElement != node){
-			_lastElement = node;
-			_quickEditTabSections = null;
-			_tagEntity = getTagEntity(part, selection, node);
-			if (_tagEntity != null) {
-				Trait pds = TaglibDomainMetaDataQueryHelper.getTrait(_tagEntity, QuickEditTabSections.TRAIT_ID);
-				if (pds != null){
-					_quickEditTabSections = (QuickEditTabSections)pds.getValue();
-				}		
-			}			
-		}
-		return _quickEditTabSections;
-	}
-
-	private QuickEditTabSectionsDescriptor createQuickEditTabGroup(QName tagId,
-			QuickEditTabSections tabSections) {
-		return new QuickEditTabSectionsDescriptor(_tagEntity, tagId, tabSections);
-	}
-
-	private QName getTagId() {
-		return TaglibDomainMetaDataQueryHelper.getQNameForTagEntity(_tagEntity);
-	}
-
-	/**
-	 * Dispose
-	 */
-	public void dispose() {		
-		_lastQuickEditTabGroup= null;
-		_lastElement = null;
-		_lastTagID = null;		
-		_nullQuickEditTabGroup = null;
-		_quickEditTabSections = null;
-		_groupsManager = null;
-	}
-	
-	private Entity getTagEntity(IWorkbenchPart part, ISelection selection, Element node){
-		HTMLEditor ed = null;
-		if (part instanceof HTMLEditor)
-			ed = (HTMLEditor)part;
-		if (ed == null)
-			return null;
-		
-		FileEditorInput input = (FileEditorInput)ed.getEditorInput();
-		IStructuredDocumentContext context = IStructuredDocumentContextFactory.INSTANCE.getContext(ed.getDocument(), node);
-		if (context != null){
-			ITaglibContextResolver resolver = IStructuredDocumentContextResolverFactory.INSTANCE.getTaglibContextResolver(context);
-			if (resolver != null){
-				ITaglibDomainMetaDataModelContext mdContext = TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(input.getFile().getProject(),resolver.getTagURIForNodeName(node));
-				return TaglibDomainMetaDataQueryHelper.getEntity(mdContext, node.getLocalName());
-			}
-		}
-		return null;		
-	}
-	
-	private QuickEditTabSectionsDescriptor getNullQuickEditTab() {
-		if (_nullQuickEditTabGroup == null) {
-			_nullQuickEditTabGroup = new NullQuickEditTabGroupDescriptor();
-			_nullQuickEditTabGroup.calculateSections();
-		}
-		return _nullQuickEditTabGroup;
-	}
-
-	/**
-	 * NOT API - for JUnit testing only
-	 * @return {@link QuickEditTabSectionsManager} 
-	 */	
-	public QuickEditTabSectionsManager getQuickEditTabSectionsManager() {
-		return _groupsManager;
-	}
-
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabSection.java
deleted file mode 100644
index 172626c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabSection.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.pagedesigner.properties.WPETabbedPropertySheetPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Layout;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.AbstractPropertySection;
-import org.eclipse.ui.views.properties.tabbed.ISection;
-import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
-
-/**
- * Using the tag entity's QuickEditTabSections meta-data, this section reacts to changes in selection,
- * and will dynamically create a QuickEditTabGroup.   The QuickEditTabGroup is cached and reused.
- * <br><br>
- * This section delegates construction to the sections discovered thru meta data.   
- * Because this section is not disposed of until the tab is disposed, this section will enforce the expected section lifecycle
- * on the sections loaded from meta data.   This occurs during setInput.  But will pass on all section lifecycle events as 
- * this section receives them.
- * <br><br>
- * The lifecycle that this section enforces on it's child sections in the setInput call on this section are (in order):
- * 	<li>createControls
- * 	<li>setInput
- *  <li>aboutToBeShown
- *  <li>refresh
- *  
- * When tab section lifecycle events occur to this section, they are passed on to all child sections also. 
- * 	
- */
-public class QuickEditTabSection extends AbstractPropertySection {
-	
-	private QuickEditTabManager manager;
-	private Composite _composite;
-	private Composite _qeGroupComposite;
-	private WPETabbedPropertySheetPage _tabbedPropertySheetPage;
-
-	private QuickEditTabManager getTabManager() {
-		if (manager == null) {
-			manager = _tabbedPropertySheetPage.getTabManager();
-		}
-		return manager;
-	}
-
-	@Override
-	public void createControls(Composite parent,
-			TabbedPropertySheetPage tabbedPropertySheetPage) {
-		super.createControls(parent, tabbedPropertySheetPage);
-		_composite = parent;
-		_tabbedPropertySheetPage = (WPETabbedPropertySheetPage)tabbedPropertySheetPage;
-	}
-
-	@Override
-	public void setInput(IWorkbenchPart part, ISelection selection) {
-		super.setInput(part, selection);
-		if (getTabManager() != null){
-			aboutToBeHidden();
-			createOrResetQuickEditGroupComposite();//disposes of old and recreates new topComp
-			getTabManager().selectionChanged(part, selection);
-			for (ISection section : getSections()){
-				section.createControls(_qeGroupComposite, _tabbedPropertySheetPage);
-				section.setInput(part, selection);
-			}
-			_composite.getParent().layout(true, true);
-			
-			aboutToBeShown();
-			refresh();
-		}			
-	}
-
-	@Override
-	public void aboutToBeHidden() {
-		super.aboutToBeHidden();
-		for (ISection section : getSections()){
-			section.aboutToBeHidden();
-		}
-	}
-
-	@Override
-	public void aboutToBeShown() {
-		super.aboutToBeShown();
-		for (ISection section : getSections()){
-			section.aboutToBeShown();
-		}
-	}
-	
-	@Override
-	public void refresh() {
-		super.refresh();
-		for (ISection section : getSections()){
-			section.refresh();
-		}
-	}
-
-	private void createOrResetQuickEditGroupComposite() {
-		if (_qeGroupComposite != null && !_qeGroupComposite.isDisposed()){
-			//dispose of current sections
-			disposeCurrentQuickEditTabSections();
-			_qeGroupComposite.dispose();
-		}			
-		
-		_qeGroupComposite = _tabbedPropertySheetPage.getWidgetFactory().createComposite(_composite, SWT.NO_FOCUS);
-		QuickEditTabLayout layout = new QuickEditTabLayout();
-		_qeGroupComposite.setLayout(layout);
-		
-	}
-
-	private void disposeCurrentQuickEditTabSections() {		
-		for (ISection section : getSections()){
-			section.dispose();
-		}
-	}
-
-	private List<ISection> getSections(){
-		if (getTabManager().getCurrentTabGroupDescriptor() != null)
-			return getTabManager().getCurrentTabGroupDescriptor().getSections();
-		
-		return Collections.EMPTY_LIST;
-	}
-	
-	public void dispose() {
-		super.dispose();
-		disposeCurrentQuickEditTabSections();
-		manager.dispose();
-		manager = null;
-		_composite = null;
-		_qeGroupComposite = null;
-		_tabbedPropertySheetPage = null;
-	}	
-
-	public boolean shouldUseExtraSpace() {
-		return false;
-	}
-
-	private class QuickEditTabLayout extends Layout {
-
-		// allow for adjustments
-		private static final int MARGIN = 0;
-		private static final int SPACING = 0;
-
-		// cache
-		Point[] sizes;
-		int maxWidth, totalHeight;
-
-		protected Point computeSize(Composite composite, int wHint, int hHint,
-				boolean flushCache) {
-
-			Control children[] = composite.getChildren();
-			if (flushCache || sizes == null || sizes.length != children.length) {
-				initialize(children);
-			}
-
-			int width = wHint, height = hHint;
-			if (wHint == SWT.DEFAULT)
-				width = maxWidth;
-
-			if (hHint == SWT.DEFAULT)
-				height = totalHeight;
-
-			return new Point(width + 2 * MARGIN, height + 2 * MARGIN);
-		}
-
-		protected void layout(Composite composite, boolean flushCache) {
-			Control children[] = composite.getChildren();
-			if (flushCache || sizes == null || sizes.length != children.length) {
-				initialize(children);
-			}
-			Rectangle rect = composite.getClientArea();
-			int x = MARGIN, y = MARGIN;
-			int width = Math.max(rect.width - 2 * MARGIN, maxWidth);
-//			System.out.println("--- Comp id: "+composite.toString()+ "[#Children: "+ composite.getChildren().length +"] -------");
-			for (int i = 0; i < children.length; i++) {
-				int height = sizes[i].y;
-				children[i].setBounds(x, y, width, height);
-				y += height + SPACING;
-//				System.out.println("h="+height+", y="+y);
-			}
-		    composite.setRedraw(true);
-		}
-
-		void initialize(Control children[]) {
-			maxWidth = 0;
-			totalHeight = 0;
-			sizes = new Point[children.length];
-			for (int i = 0; i < children.length; i++) {
-				sizes[i] = children[i].computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
-				maxWidth = Math.max(maxWidth, sizes[i].x);
-				totalHeight += sizes[i].y;
-			}
-			totalHeight += (children.length - 1) * SPACING;
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabSectionDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabSectionDescriptor.java
deleted file mode 100644
index 18fddd4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabSectionDescriptor.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.properties.DesignerPropertyTool;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.internal.views.properties.tabbed.view.SectionDescriptor;
-import org.eclipse.ui.views.properties.tabbed.ISection;
-import org.eclipse.ui.views.properties.tabbed.ITypeMapper;
-import org.w3c.dom.Element;
-
-/**
- * A SectionDescriptor from org.eclipse.ui.views.properties.tabbed.propertySections extension-point 
- * for use by the QuickEdit tab in the Web Page Editor.
- */
-public class QuickEditTabSectionDescriptor extends SectionDescriptor {
-
-	private static final String ATT_CLASS = "class"; //$NON-NLS-1$ 
-	private IConfigurationElement _configurationElement;
-	private Entity _tagEntity;
-
-	/**
-	 * Constructor for the section descriptor.
-	 * 
-	 * @param configurationElement
-	 *            the configuration element for the section descriptor.
-	 * @param typeMapper 
-	 */
-	public QuickEditTabSectionDescriptor(IConfigurationElement configurationElement, ITypeMapper typeMapper) {
-		super(configurationElement, typeMapper);
-		_configurationElement = configurationElement;
-	}
-
-	@Override
-	public boolean appliesTo(IWorkbenchPart part, ISelection selection) {
-		Element node = DesignerPropertyTool.getElement(part, selection);
-		if (node == null) {
-			return false;
-		}
-		return true;
-	}
-
-	@Override
-	public ISection getSectionClass() {
-		ISection section = null;
-		try {
-			Object secOrGroup = _configurationElement
-					.createExecutableExtension(ATT_CLASS);
-			if (secOrGroup instanceof ISection) {
-				section = (ISection) secOrGroup;
-			} else if (secOrGroup instanceof AttributeGroup) {
-				((AttributeGroup) secOrGroup).setTagEntity(_tagEntity);
-				section = new AttributeGroupSection((AttributeGroup) secOrGroup);		
-			}
-		} catch (CoreException exception) {
-			handleSectionError(exception);
-		}
-		return section;
-	}
-	
-	/**
-	 * Handle the section error when an issue is found loading from the
-	 * configuration element.
-	 * 
-	 * @param _configurationElement
-	 *            the configuration element
-	 * @param exception
-	 *            an optional CoreException
-	 */
-	private void handleSectionError(CoreException exception) {
-		PDPlugin.getLogger(QuickEditTabSectionDescriptor.class).error("error", //$NON-NLS-1$
-				exception);
-		exception.printStackTrace();
-	}
-
-	/**
-	 * @param tagEntity
-	 * @return ISection for the tagEntity
-	 */
-	/*package*/ ISection getSectionClass(Entity tagEntity) {
-		_tagEntity = tagEntity;
-		return getSectionClass();
-	}
-		
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabSectionsDescriptor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabSectionsDescriptor.java
deleted file mode 100644
index afba392..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabSectionsDescriptor.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.namespace.QName;
-
-import org.eclipse.jst.jsf.common.metadata.Entity;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.QuickEditTabSections;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SECTION_TYPE;
-import org.eclipse.jst.pagedesigner.editors.properties.quickedittabsections.SectionInfo;
-import org.eclipse.ui.views.properties.tabbed.ISection;
-
-/**
- * Represents all of the section classes that make up the Quick Edit tab for a given tag input.   
- * Uses QuickEditTabSections meta data from tag entity
- */
-public class QuickEditTabSectionsDescriptor {
-
-	private QuickEditTabSections _sections;
-	private QName _tagId;
-	private List<ISection> _sectionClasses;
-	private Entity _tagEntity;
-	private WPETabPropertySectionDescriptorProvider sectionProvider;
-
-	/**
-	 * Constructor
-	 * @param tagEntity
-	 * @param tagId
-	 * @param sections
-	 */
-	public QuickEditTabSectionsDescriptor (Entity tagEntity, QName tagId, QuickEditTabSections sections) {
-		_tagEntity = tagEntity;
-		_tagId = tagId;
-		_sections = sections;
-	}	
-
-	/*package*/ QuickEditTabSectionsDescriptor () {
-		_tagEntity = null;
-		_tagId = null;
-		_sections = null;
-	}
-	
-	/**
-	 * Determines section classes for the group from the available meta data
-	 */
-	public void calculateSections() {
-		if (_sectionClasses == null || _sectionClasses.isEmpty()) {
-			_sectionClasses = new ArrayList();
-			List<String> attrIds = new ArrayList();
-			for (SectionInfo secInfo : _sections.getSections()) {
-				if (secInfo.getType() == SECTION_TYPE.ATTRIBUTE){
-					//collect attrSecs and process as a group so that layout will be best
-					if (secInfo.getId() != null) 
-						attrIds.add(secInfo.getId());
-				}
-				else if (secInfo.getType() == SECTION_TYPE.SECTION) {
-					//if there are any attribute sections not processed, do that now
-					if (attrIds.size() > 0){
-						createAttributeGroup(attrIds);
-						attrIds = new ArrayList();
-					}
-					createSectionGroup(secInfo);
-				}
-			}
-			if (attrIds.size() > 0){
-				createAttributeGroup(attrIds);
-			}
-		}		
-	}
-
-	private void createSectionGroup(SectionInfo secInfo) {
-		QuickEditTabSectionDescriptor sd = getSectionProvider().getNamedSectionDescriptor(secInfo.getId());
-		if (sd != null) {
-			ISection section = sd.getSectionClass(_tagEntity);
-			if (section != null){
-				_sectionClasses.add(section);
-			}
-		}
-		
-	}
-
-	private void createAttributeGroup(List<String> attrNames) {
-		ISection section = new AttributeGroupSection(_tagEntity, attrNames);
-		if (section != null){		
-			_sectionClasses.add(section);
-		}
-	}
-
-	/**
-	 * @return QName of tag that this tab descriptor is for
-	 */
-	public QName getTagId() {
-		return _tagId;
-	}
-
-	/**
-	 * @return List of current ISection classes set after calculateSections() has been called
-	 */
-	public List<ISection> getSections() {
-		return _sectionClasses;
-	}
-
-	private WPETabPropertySectionDescriptorProvider getSectionProvider() {
-		if (sectionProvider == null){
-			sectionProvider = new WPETabPropertySectionDescriptorProvider();
-		}
-		return sectionProvider;
-	}
-	
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabSectionsManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabSectionsManager.java
deleted file mode 100644
index 17bbc45..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/QuickEditTabSectionsManager.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.xml.namespace.QName;
-
-import org.eclipse.core.resources.IProject;
-
-/**
- * Cache of quickEditTabGroupDescriptors keyed by tagID as QName.  
- */
-public class QuickEditTabSectionsManager {
-	
-	private static QuickEditTabSectionsManagerMgr _mgrInstance = new QuickEditTabSectionsManagerMgr();
-	private Map<QName, QuickEditTabSectionsDescriptor> map = new HashMap<QName, QuickEditTabSectionsDescriptor>(5);
-	private IProject _project;
-	private int clientCount = 0;
-	
-	/**
-	 * Returns instance of QuickEditTabSectionsManager for the given project.   Caller must release the instance when caller is being disposed.
-	 * @param project
-	 * @return instance of QuickEditTabSectionsManager
-	 */
-	public static synchronized QuickEditTabSectionsManager acquireInstance(IProject project){
-		QuickEditTabSectionsManager instance = _mgrInstance.getSectionsManager(project);
-		instance.clientCount++;
-		return instance;	
-	}
-	
-	/**
-	 * Releases instance of QuickEditTabSectionsManager and removes from the QuickEditSectionGroupsManagerMgr if it is the last reference
-	 */
-	public synchronized void releaseInstance(){
-		int refCount = --clientCount;
-		if (refCount == 0){
-			_mgrInstance.removeSectionsManager(_project);
-		}	
-	}
-
-	/**
-	 * private constructor
-	 */
-	private QuickEditTabSectionsManager(){
-		//
-	}
-	
-	/**
-	 * @return IProject that this section manager applies to
-	 */
-	public IProject getProject(){
-		return _project;
-	}
-	
-	/**
-	 * Get QuickEditTabSectionsDescriptor for passed tag
-	 * 
-	 * @param tagId
-	 * @return QuickEditTabSectionsDescriptor
-	 */
-	public QuickEditTabSectionsDescriptor getQuickEditTabSectionsFor(QName tagId) {
-		return map.get(tagId);
-	}
-
-	/**
-	 * Adds QuickEditTabSectionsDescriptor to managed registry keyed by the tagId
-	 * QName
-	 * 
-	 * @param group
-	 */
-	public void addQuickEditTabGroupDescriptor(QuickEditTabSectionsDescriptor group) {
-		map.put(group.getTagId(), group);
-	}
-
-	/**
-	 * Removes and disposes a cached {@link QuickEditTabSectionsDescriptor}
-	 * 
-	 * @param tagId
-	 */
-	public void removeQuickEditTabGroup(QName tagId) {
-		QuickEditTabSectionsDescriptor grp = map.get(tagId);
-		if (grp != null) {
-			map.remove(tagId);
-		}
-	}
-
-	/**
-	 * Manages the QuickEditTabSectionsManager instances.  Ensures one per project.	 
-	 */
-	private static class QuickEditTabSectionsManagerMgr {		
-		private Map <IProject,QuickEditTabSectionsManager>_map = new HashMap<IProject,QuickEditTabSectionsManager>();
-		/**
-		 * @param project - may be null
-		 * @return QuickEditTabManager for project
-		 */
-		public QuickEditTabSectionsManager getSectionsManager(IProject project){
-			if (_map.containsKey(project))
-				return _map.get(project);
-
-			QuickEditTabSectionsManager instance = new QuickEditTabSectionsManager();
-			instance._project = project;
-			_map.put(project, instance);
-			return instance;
-		}
-		
-		/**
-		 * Removes QuickEditTabManager from mgr for given project
-		 * @param project
-		 */
-		public void removeSectionsManager(IProject project){
-			if (_map.containsKey(project))
-				_map.remove(project);
-		}
-		
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/WPETabDescriptorProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/WPETabDescriptorProvider.java
deleted file mode 100644
index 5003d40..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/WPETabDescriptorProvider.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.views.properties.tabbed.ITabDescriptor;
-import org.eclipse.ui.views.properties.tabbed.ITabDescriptorProvider;
-
-/**
- * Class that provides the default tabs for the Web Page Editor
- */
-public class WPETabDescriptorProvider implements ITabDescriptorProvider {
-
-	private AttributesTabDescriptor _attributesTabDescriptor;
-	private QuickEditTabDescriptor _quickTabDescriptor;
-
-	/**
-	 * Constructor
-	 */
-	public WPETabDescriptorProvider() {
-		_quickTabDescriptor = new QuickEditTabDescriptor();
-		_attributesTabDescriptor = new AttributesTabDescriptor();
-	}
-	
-	/**
-	 * Provides a QuickTabDescriptor and the AttributesTabDescriptor
-	 */
-	public ITabDescriptor[] getTabDescriptors(IWorkbenchPart part,
-			ISelection selection) {
-
-		return new ITabDescriptor[]{_quickTabDescriptor, 
-									_attributesTabDescriptor};
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/WPETabPropertySectionDescriptorProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/WPETabPropertySectionDescriptorProvider.java
deleted file mode 100644
index 4e2530d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/WPETabPropertySectionDescriptorProvider.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.properties.internal;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.ui.views.properties.tabbed.ISectionDescriptor;
-import org.eclipse.ui.views.properties.tabbed.ISectionDescriptorProvider;
-
-/**
- * Provides sections registered for the Web Page Editor whose contributor ID is,
- * "org.eclipse.jst.pagedesigner.tabPropertyContributor" using the
- * org.eclipse.ui.views.properties.tabbed.propertyTabs extension-points.  
- * 
- * The sections declared using the org.eclipse.ui.views.properties.tabbed.propertySections extension-point 
- * for the WPE will only be displayed by the Quick Edit tab is the selected tag has metadata to choose 
- * the section.  TypeMappers/filters, etc. are ignored by this sectionDescriptorProvider.
- * 
- * See jsf_html.xml in the org.eclipse.jst.jsf.standard.tagsupport plugin for examples on how to use.  
- */
-public class WPETabPropertySectionDescriptorProvider implements
-		ISectionDescriptorProvider {
-	
-	private static final String EXTPT_SECTIONS = "propertySections"; //$NON-NLS-1$
-	private static final String ELEMENT_SECTION = "propertySection"; //$NON-NLS-1$
-	private ISectionDescriptor[] _descriptors = null;
-
-	/**
-	 * Constructor
-	 */
-	public WPETabPropertySectionDescriptorProvider() {
-		super();
-	}
-
-	public ISectionDescriptor[] getSectionDescriptors() {
-		if (_descriptors == null) {
-			List result = new ArrayList();
-			List contributedSections = readSectionDescriptors();
-			result.addAll(contributedSections);
-
-//			if (1 == 0){ //disabled for now... do we want to allow other mechanisms to add sections?
-//				List providers = readAdditionalSectionDescriptorProviders();
-//				for (int i = 0, size = providers.size(); i < size; i++) {
-//					try {
-//						ISectionDescriptorProvider provider = (ISectionDescriptorProvider) providers
-//								.get(i);
-//						ISectionDescriptor[] sections = provider
-//								.getSectionDescriptors();
-//						if (sections != null) {
-//							result.addAll(Arrays.asList(sections));
-//						}
-//					} catch (Exception ex) {
-//						// ignore
-//						ex.printStackTrace();
-//					}
-//				}
-//			}
-			_descriptors = new ISectionDescriptor[result.size()];
-			result.toArray(_descriptors);
-		}
-		return _descriptors;
-	}
-
-	/**
-	 * @return registered section descriptors for the WPE QuickEdit tab
-	 */
-	protected List<QuickEditTabSectionDescriptor> readSectionDescriptors() {
-		List result = new ArrayList();
-			
-		IConfigurationElement[] extensions = getConfigurationElements(EXTPT_SECTIONS);
-		for (int i = 0; i < extensions.length; i++) {
-			IConfigurationElement extension = extensions[i];
-			if (extension.getAttribute("contributorId").equals(HTMLEditor.TABBED_PROPERTIES_CONTRIBUTOR_ID)){ //$NON-NLS-1$
-				IConfigurationElement[] sections = extension
-						.getChildren(ELEMENT_SECTION);
-				for (int j = 0; j < sections.length; j++) {
-					IConfigurationElement section = sections[j];
-					ISectionDescriptor descriptor = new QuickEditTabSectionDescriptor(
-							section, null);//ITypeMapper set to null
-					result.add(descriptor);
-				}
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @param extensionPointId
-	 * @return IConfigurationElement[] 
-	 */
-	private static IConfigurationElement[] getConfigurationElements(
-			String extensionPointId) {
-		IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
-				.getExtensionPoint("org.eclipse.ui.views.properties.tabbed", extensionPointId); //$NON-NLS-1$
-		if (extensionPoint == null) {
-			return null;
-		}
-		return extensionPoint.getConfigurationElements();
-	}
-	
-	/**
-	 * @param name of section
-	 * @return {@link QuickEditTabSectionDescriptor} or null if not located
-	 */
-	public QuickEditTabSectionDescriptor getNamedSectionDescriptor(String name) {
-		for (int i=0;i<getSectionDescriptors().length;i++){
-			QuickEditTabSectionDescriptor sd = (QuickEditTabSectionDescriptor)getSectionDescriptors()[i];
-			if (name.equals(sd.getId()))
-				return sd;
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/messages.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/messages.properties
deleted file mode 100644
index 57b015f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/internal/messages.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-AttributesTabDescriptor_label=Attributes
-QuickEditTabDescriptor_label=Quick Edit
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/messages.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/messages.properties
deleted file mode 100644
index b0d48c1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/properties/messages.properties
+++ /dev/null
@@ -1,11 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-ITabbedPropertiesConstants_other_category=Attributes
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/range/RangeUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/range/RangeUtil.java
deleted file mode 100644
index 1d85654..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/range/RangeUtil.java
+++ /dev/null
@@ -1,378 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.range;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.parts.DocumentEditPart;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-
-/**
- * @author mengbo
- */
-public class RangeUtil {
-	/**
-	 * append the child after the reference node as next sibling.
-	 * 
-	 * @param child
-	 *            can't be null
-	 * @param reference
-	 *            can't be null
-	 * @return ??
-	 */
-    //TODO: dead
-//	private static Node appendAfter(Node child, Node reference) {
-//		Node next = reference.getNextSibling();
-//		if (next == null)
-//        {
-//			return reference.getParentNode().appendChild(child);
-//        }
-//        return reference.getParentNode().insertBefore(child, next);
-//	}
-
-	/**
-	 * @param child
-	 * @param reference
-	 * @return ??
-	 */
-    // TODO: dead
-//	private static Node insertBefore(Node child, Node reference) {
-//		return reference.getParentNode().insertBefore(child, reference);
-//	}
-
-	/**
-	 * Insert a node into the specified position. The node can be an element or
-	 * DocumentFragment.
-	 * 
-	 * @param node
-	 * @param position
-	 */
-	// TODO: dead
-//	private static Node insertElement(DesignPosition position, Element node) {
-//		EditPart containerEditPart = position.getContainerPart();
-//		int offset = position.getOffset();
-//
-//		if (containerEditPart instanceof TextEditPart) {
-//			TextEditPart textPart = (TextEditPart) containerEditPart;
-//			String textData = textPart.getTextData();
-//			Node textNode = (Node) textPart.getModel();
-//			if (offset == 0)
-//				return insertBefore(node, textNode);
-//			else if (offset == textData.length())
-//				return appendAfter(node, textNode);
-//			else {
-//				// inserting the element in the middle of text.
-//				String before = textData.substring(0, offset);
-//				String after = textData.substring(offset);
-//
-//				// XXX: don't know whether setNodeValue() will do all those
-//				// escape or not.
-//				textNode.setNodeValue(after);
-//				Node newnode = insertBefore(node, textNode);
-//
-//				// XXX: don't know whether createTextNode() will do all those
-//				// escape or not
-//				Text t = textNode.getOwnerDocument().createTextNode(before);
-//
-//				insertBefore(t, newnode);
-//				return newnode;
-//			}
-//		}
-//        return insertIntoEditPart(containerEditPart, node, offset);
-//	}
-
-	/**
-	 * @param containerEditPart
-	 * @param node
-	 * @param offset
-	 * @return
-	 */
-	// TODO: dead
-//	private static Node insertIntoEditPart(EditPart containerEditPart,
-//			Node node, int offset) {
-//		Node parent = (Node) containerEditPart.getModel();
-//		List childParts = containerEditPart.getChildren();
-//		if (offset >= childParts.size()) {
-//			// to the end of parent
-//			return parent.appendChild(node);
-//		}
-//        Node child = (Node) ((EditPart) childParts.get(offset)).getModel();
-//        return insertBefore(node, child);
-//	}
-
-	// TODO: dead
-//	private static TextPosition insertText(DesignPosition position, String data) {
-//		// TODO: never read EditPart containerEditPart = position.getContainerPart();
-//
-//		position = moveIntoText(position);
-//		int offset = position.getOffset();
-//
-//		if (position.getContainerPart() instanceof TextEditPart) {
-//			// it is guaranteeed that now the containing edit part is text node.
-//			TextEditPart textPart = (TextEditPart) position.getContainerPart();
-//			String textData = textPart.getTextData();
-//			String before = textData.substring(0, offset);
-//			String after = textData.substring(offset);
-//			if (data.startsWith(" ") && before.endsWith(" ")) {
-//				before = before.substring(0, before.length() - 1) + "&nbsp;";
-//			}
-//			if (after.startsWith(" ") && data.endsWith(" ")) {
-//				data = data.substring(0, data.length() - 1) + (char) 160;
-//			}
-//			String nextData = before + data + after;
-//			IDOMText text = (IDOMText) textPart.getModel();
-//			text.setData(nextData);
-//			return new TextPosition(text, offset + data.length());
-//		}
-//        // can't merge into a neighboring text node. So create a text node
-//        // of it's own
-//        EditPart part = position.getContainerPart();
-//        Node parent = (Node) part.getModel();
-//        Text text = parent.getOwnerDocument().createTextNode(data);
-//        insertIntoEditPart(part, text, offset);
-//        return new TextPosition((IDOMText) text, offset);
-//	}
-
-	/**
-	 * Try to make the position move into a text node.
-	 * 
-	 * @param position
-	 * @return
-	 */
-    // TODO: dead
-//	private static DesignPosition moveIntoText(DesignPosition position) {
-//		EditPart container = position.getContainerPart();
-//		if (container instanceof TextEditPart)
-//			return position;
-//		if (position.getOffset() > 0) {
-//			EditPart pre = (EditPart) container.getChildren().get(
-//					position.getOffset() - 1);
-//			if (pre instanceof TextEditPart) {
-//				return new DesignPosition(pre, ((TextEditPart) pre)
-//						.getTextData().length());
-//			}
-//		}
-//		if (position.getOffset() < container.getChildren().size()) {
-//			EditPart next = (EditPart) container.getChildren().get(
-//					position.getOffset());
-//			if (next instanceof TextEditPart) {
-//				return new DesignPosition(next, 0);
-//			}
-//		}
-//		return position;
-//	}
-
-	/**
-	 * try to move the position up to not inside a text. if the position is at 0
-	 * index or last index of a text node, then try to move it up.
-	 * 
-	 * @param position
-	 * @return
-	 */
-    // TODO: dead
-//	private static DesignPosition moveOutFromText(DesignPosition position) {
-//		EditPart container = position.getContainerPart();
-//		if (container instanceof TextEditPart) {
-//			int offset = position.getOffset();
-//			String text = ((TextEditPart) container).getTextData();
-//			if (offset == 0) {
-//				return new DesignPosition(container.getParent(), container
-//						.getParent().getChildren().indexOf(container));
-//			} else if (offset == text.length()) {
-//				return new DesignPosition(container.getParent(), container
-//						.getParent().getChildren().indexOf(container) + 1);
-//			}
-//		}
-//		return position;
-//	}
-
-//	private static void insertDocumentFragment(DesignPosition position,
-//			DocumentFragment fragment) {
-//		// FIXME: NOT DONE.
-//	}
-
-	/**
-	 * Test whether the range intersect with the part.
-	 * 
-	 * @param range
-	 * @param part
-	 * @return true if thereis an intersection
-	 */
-	public static boolean intersect(DesignRange range, EditPart part) {
-		if (range == null || !range.isValid())
-			return false;
-		range = normalize(range);
-		if (part instanceof DocumentEditPart)
-			return true;
-		EditPart parent = part.getParent();
-		int index = parent.getChildren().indexOf(part);
-		DesignPosition left = new DesignPosition(parent, index);
-		DesignPosition right = new DesignPosition(parent, index + 1);
-		int compare = compareDesignPosition(left, range.getEndPosition());
-		if (compare == 1 || compare == 0 || compare == Integer.MIN_VALUE)
-			return false;
-
-		compare = compareDesignPosition(right, range.getStartPosition());
-		if (compare == -1 || compare == 0 || compare == Integer.MIN_VALUE)
-			return false;
-
-		return true;
-	}
-
-	/**
-	 * make sure the start position is before end position. If the original
-	 * range is already normalized, then the original range will be returned
-	 * without constructing a new one.
-	 * 
-	 * @param range
-	 * @return the normalized range
-	 */
-	public static DesignRange normalize(DesignRange range) {
-		if (range == null || !range.isValid()) {
-			return range;
-		}
-		int result = compareDesignPosition(range.getStartPosition(), range
-				.getEndPosition());
-		if (result == 1)
-        {
-			return new DesignRange(range.getEndPosition(), range
-					.getStartPosition());
-        }
-        return range;
-	}
-
-	/**
-	 * 
-	 * @param p1
-	 * @param p2
-	 * @return 0 means equal. 1 Means p1 is after p2. -1 means p1 is before p2.
-	 *         Integer.MIN_VALUE means some error and can't compare.
-	 */
-	private static int compareDesignPosition(DesignPosition p1, DesignPosition p2) {
-		if (!p1.isValid() || !p2.isValid())
-			return Integer.MIN_VALUE;
-		if (p1.equals(p2))
-			return 0;
-		int offset1 = p1.getOffset();
-		int offset2 = p2.getOffset();
-		List a1 = getAncesters(p1.getContainerPart());
-		List a2 = getAncesters(p2.getContainerPart());
-		if (a1 == null || a2 == null)
-			return Integer.MIN_VALUE;
-		if (a1.get(0) != a2.get(0))
-			return Integer.MIN_VALUE; // not same DocumentEditPart
-		for (int i = 1;; i++) {
-			EditPart p1a = (EditPart) a1.get(i);
-			EditPart p2a = (EditPart) a2.get(i);
-			if (p1a == p2a) {
-				if (p1a != null)
-                {
-					continue; // same ancester
-                }
-                // both are null. just compare the offset.
-                return offset1 < offset2 ? -1
-                		: (offset1 == offset2 ? 0 : 1);
-			}
-			// p1a != p2a. now we can just compare p1a and p2a to decide the
-			// order.
-			if (p1a != null)
-				offset1 = p1a.getParent().getChildren().indexOf(p1a);
-			if (p2a != null)
-				offset2 = p2a.getParent().getChildren().indexOf(p2a);
-			if ((p1a == null && p2a == null) || (p1a != null && p2a != null)) {
-				return offset1 < offset2 ? -1 : (offset1 == offset2 ? 0 : 1);
-			} else if (p1a == null) {
-				return offset1 <= offset2 ? -1 : 1;
-			} else {
-				return offset1 >= offset2 ? 1 : -1;
-			}
-		}
-	}
-
-	/**
-	 * Get a list of ancester nodes starting from the DocumentEditPart till the
-	 * node.
-	 * 
-	 * @param part
-	 * @return
-	 */
-	private static List getAncesters(EditPart part) {
-		List list = new ArrayList();
-		while (part != null) {
-			list.add(part);
-			if (part instanceof DocumentEditPart)
-            {
-				break;
-            }
-			part = part.getParent();
-		}
-		if (part == null) {
-			// if part ==null, means we didn't find a DocumentEditPart,
-			// something must be wrong.
-			return null;
-		}
-		// reverse to make it starting from the docuemnteditpart node.
-		Collections.reverse(list);
-		list.add(null); // add an null terminator.
-		return list;
-	}
-
-	/**
-	 * find the smallest common ancester of two edit part.
-	 * 
-	 * @param part1
-	 * @param part2
-	 * @return
-	 */
-	private static EditPart findCommonAncester(EditPart part1, EditPart part2) {
-		if (part1 == part2) {
-			return part1;
-		}
-		List list1 = getAncesters(part1);
-		if (list1 == null)
-			return null;
-		List list2 = getAncesters(part2);
-		if (list2 == null)
-			return null;
-		if (list1.get(0) != list2.get(0))
-			return null;
-		EditPart common = (EditPart) list1.get(0);
-		for (int i = 1;; i++) {
-			EditPart p1 = (EditPart) list1.get(i);
-			EditPart p2 = (EditPart) list2.get(i);
-			if (p1 == null || p2 == null)
-				return common;
-			if (p1 != p2)
-				return common;
-			common = p1;
-		}
-
-	}
-
-	/**
-	 * @param range
-	 * @return the common ancestor
-	 */
-	public static EditPart findCommonAncestor(DesignRange range) {
-		if (!range.isValid()) {
-			return null;
-		}
-		DesignPosition startPosition = range.getStartPosition();
-		DesignPosition endPosition = range.getEndPosition();
-		return findCommonAncester(startPosition.getContainerPart(), endPosition
-				.getContainerPart());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/requests/LocationModifierRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/requests/LocationModifierRequest.java
deleted file mode 100644
index 176710b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/requests/LocationModifierRequest.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.requests;
-
-import org.eclipse.gef.requests.LocationRequest;
-
-/**
- * This is a LocationRequest plus keyboard modified support.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class LocationModifierRequest extends LocationRequest {
-
-	private boolean _controlKeyDown;
-
-	/**
-	 * 
-	 */
-	public LocationModifierRequest() {
-		super();
-	}
-
-	/**
-	 * @param type
-	 */
-	public LocationModifierRequest(Object type) {
-		super(type);
-	}
-
-	/**
-	 * @return true if the control key was pressed
-	 */
-	public boolean isControlKeyPressed() {
-		return _controlKeyDown;
-	}
-
-	/**
-	 * @param b
-	 */
-	public void setControlKeyPressed(boolean b) {
-		this._controlKeyDown = b;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/requests/NodeCreationFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/requests/NodeCreationFactory.java
deleted file mode 100644
index 7c54de0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/requests/NodeCreationFactory.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.requests;
-
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.gef.requests.CreationFactory;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.jst.pagedesigner.utils.JSPUtil;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- */
-public class NodeCreationFactory implements CreationFactory {
-	private final String _tagName;
-
-	private final String _uri;
-
-	private final String _suggestedPrefix;
-
-	private final Map _attributes;
-
-	/**
-	 * @param uri
-	 * @param tagname
-	 * @param suggestedPrefix
-	 * @param attributes
-	 */
-	public NodeCreationFactory(String uri, String tagname,
-			String suggestedPrefix, Map attributes) {
-		_tagName = tagname;
-		_uri = uri;
-		_suggestedPrefix = suggestedPrefix;
-		_attributes = attributes;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.requests.CreationFactory#getNewObject()
-	 */
-	public Object getNewObject() {
-		Document ownerdoc = getOwnerDocument();
-		if (ownerdoc == null)
-			return null;
-
-		Element ele = ownerdoc.createElement(_tagName);
-		if (ele instanceof IDOMNode) {
-			String prefix = getPrefix(_uri, ((IDOMDocument) ownerdoc)
-					.getModel(), _suggestedPrefix);
-			if (prefix != null) {
-				ele.setPrefix(prefix);
-			}
-		}
-		if (_attributes != null) {
-			for (Iterator iter = _attributes.keySet().iterator(); iter
-					.hasNext();) {
-				String key = (String) iter.next();
-				String value = (String) _attributes.get(key);
-				ele.setAttribute(key, value);
-			}
-		}
-		return ele;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.requests.CreationFactory#getObjectType()
-	 */
-	public Object getObjectType() {
-		return _tagName;
-	}
-
-	/**
-	 * XXX: need some better way for owner document. Maybe pass in from
-	 * constructor
-	 * 
-	 * @return the owner document
-	 */
-	protected Document getOwnerDocument() {
-		IWorkbenchWindow active = PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow();
-		if (active == null)
-			return null;
-		IWorkbenchPage page = active.getActivePage();
-		if (page == null)
-			return null;
-		IEditorPart editor = page.getActiveEditor();
-		if (editor instanceof HTMLEditor) {
-			return ((HTMLEditor) editor).getDOMDocument();
-		}
-        return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.requests.NodeCreationFactory#getPrefix(int)
-	 */
-	private String getPrefix(String uri, IDOMModel model, String suggested) {
-		if (ITLDConstants.URI_HTML.equals(uri)
-				|| ITLDConstants.URI_JSP.equals(uri))
-			return null;
-
-		// now handles custom tag lib
-		return JSPUtil.getOrCreatePrefix(model, uri, suggested);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/requests/PageDesignerRequestConstants.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/requests/PageDesignerRequestConstants.java
deleted file mode 100644
index 74e1797..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/requests/PageDesignerRequestConstants.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.requests;
-
-/**
- * Page designer constants
- *
- */
-public final class PageDesignerRequestConstants 
-{
-    /**
-     * sent to an edit part to request a selection drag tracker
-     */
-    public final static String REQ_SELECTION_TRACKER = "selection.tracker.request";
-    
-    private PageDesignerRequestConstants()
-    {
-        // no instantiation
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/ColumnHandle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/ColumnHandle.java
deleted file mode 100644
index 97a1c1a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/ColumnHandle.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.GraphicalEditPart;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ColumnHandle extends TableSideItemHandle {
-
-	/**
-	 * @param owner
-	 * @param index
-	 */
-	public ColumnHandle(GraphicalEditPart owner, int index) {
-		super(owner, false, index);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/ColumnResizeHandle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/ColumnResizeHandle.java
deleted file mode 100644
index e6446a1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/ColumnResizeHandle.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.GraphicalEditPart;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ColumnResizeHandle extends TableSideResizeHandle {
-	// 0 means before first column
-	int _columnIndex;
-
-	/**
-	 * @param owner 
-	 * @param index 
-	 * 
-	 */
-	public ColumnResizeHandle(GraphicalEditPart owner, int index) {
-		super(owner, false, index);
-		_columnIndex = index;
-	}
-
-	/**
-	 * @return the column index
-	 */
-	public int getColumnIndex() {
-		return _columnIndex;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/DeleteHeaderFooterAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/DeleteHeaderFooterAction.java
deleted file mode 100644
index 02a8e5c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/DeleteHeaderFooterAction.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.action.Action;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DeleteHeaderFooterAction extends Action {
-	private Command _command;
-
-	/**
-	 * @param text
-	 * @param editPart 
-	 * @param isHeader 
-	 */
-	public DeleteHeaderFooterAction(String text, EditPart editPart,
-			boolean isHeader) {
-		super(text);
-		DeleteHeaderFooterRequest req = new DeleteHeaderFooterRequest(text,
-				isHeader);
-		this._command = editPart.getCommand(req);
-		this.setEnabled(this._command != null && this._command.canExecute());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		_command.execute();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/DeleteHeaderFooterRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/DeleteHeaderFooterRequest.java
deleted file mode 100644
index ebd315d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/DeleteHeaderFooterRequest.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.Request;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DeleteHeaderFooterRequest extends Request {
-	private boolean _isHeader;
-
-	/**
-	 * @param type
-	 * @param isHeader
-	 */
-	public DeleteHeaderFooterRequest(String type, boolean isHeader) {
-		super(type);
-		this._isHeader = isHeader;
-	}
-
-	/**
-	 * @return Returns the _isHeader.
-	 */
-	public boolean isHeader() {
-		return _isHeader;
-	}
-
-	/**
-	 * @param header
-	 *            The _isHeader to set.
-	 */
-	public void setHeader(boolean header) {
-		_isHeader = header;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/DeleteRowColumnAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/DeleteRowColumnAction.java
deleted file mode 100644
index 0f68bd1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/DeleteRowColumnAction.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.action.Action;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DeleteRowColumnAction extends Action {
-	private Command _command;
-
-	/**
-	 * @param text
-	 * @param tablePart 
-	 * @param index 
-	 * @param isrow 
-	 */
-	public DeleteRowColumnAction(String text, EditPart tablePart, int index,
-			boolean isrow) {
-		super(text);
-
-		TableRowColumnDeleteRequest req = new TableRowColumnDeleteRequest(
-				isrow, index);
-		this._command = tablePart.getCommand(req);
-		this.setEnabled(this._command != null && this._command.canExecute());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		_command.execute();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/EmptyLocator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/EmptyLocator.java
deleted file mode 100644
index d69fc73..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/EmptyLocator.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Locator;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class EmptyLocator implements Locator {
-	/**
-	 * 
-	 */
-	public EmptyLocator() {
-		super();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Locator#relocate(org.eclipse.draw2d.IFigure)
-	 */
-	public void relocate(IFigure target) {
-        // do nothing; this is a noop locator
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/InsertHeaderFooterAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/InsertHeaderFooterAction.java
deleted file mode 100644
index 4009220..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/InsertHeaderFooterAction.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.action.Action;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class InsertHeaderFooterAction extends Action {
-	private Command _command;
-
-	/**
-	 * @param text
-	 * @param editPart 
-	 * @param isHeader 
-	 */
-	public InsertHeaderFooterAction(String text, EditPart editPart,
-			boolean isHeader) {
-		super(text);
-
-		InsertHeaderFooterRequest req = new InsertHeaderFooterRequest(text,
-				isHeader);
-		this._command = editPart.getCommand(req);
-		this.setEnabled(this._command != null && this._command.canExecute());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		_command.execute();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/InsertHeaderFooterRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/InsertHeaderFooterRequest.java
deleted file mode 100644
index 845d48a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/InsertHeaderFooterRequest.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.Request;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class InsertHeaderFooterRequest extends Request {
-	private boolean _isHeader;
-
-	/**
-	 * @param type
-	 * @param isHeader
-	 */
-	public InsertHeaderFooterRequest(String type, boolean isHeader) {
-		super(type);
-		this._isHeader = isHeader;
-	}
-
-	/**
-	 * @return Returns the _isHeader.
-	 */
-	public boolean isHeader() {
-		return _isHeader;
-	}
-
-	/**
-	 * @param header
-	 *            The _isHeader to set.
-	 */
-	public void setHeader(boolean header) {
-		_isHeader = header;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/InsertRowColumnAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/InsertRowColumnAction.java
deleted file mode 100644
index 6eedf0a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/InsertRowColumnAction.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.jface.action.Action;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class InsertRowColumnAction extends Action {
-	private Command _command;
-
-	/**
-	 * @param text
-	 * @param tablePart 
-	 * @param index 
-	 * @param isrow 
-	 * @param isbefore 
-	 */
-	public InsertRowColumnAction(String text, EditPart tablePart, int index,
-			boolean isrow, boolean isbefore) {
-		super(text);
-
-		TableInsertRequest req = new TableInsertRequest(isrow, index, isbefore);
-		this._command = tablePart.getCommand(req);
-		this.setEnabled(this._command != null && this._command.canExecute());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.action.Action#run()
-	 */
-	public void run() {
-		_command.execute();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/MarqueeRectangleFigure.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/MarqueeRectangleFigure.java
deleted file mode 100644
index c65e771..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/MarqueeRectangleFigure.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Figure;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * This class is copied from MarqueeSelectionTool, since it is private there.
- * 
- * @author mengbo
- * @version 1.5
- */
-class MarqueeRectangleFigure extends Figure {
-
-	private int offset = 0;
-
-	private boolean schedulePaint = true;
-
-	private static final int DELAY = 110; // animation delay in millisecond
-
-	/**
-	 * @see org.eclipse.draw2d.Figure#paintFigure(org.eclipse.draw2d.Graphics)
-	 */
-	protected void paintFigure(Graphics graphics) {
-		Rectangle bounds1 = getBounds().getCopy();
-		graphics.translate(getLocation());
-
-		graphics.setXORMode(true);
-		graphics.setForegroundColor(ColorConstants.white);
-		graphics.setBackgroundColor(ColorConstants.black);
-
-		graphics.setLineStyle(Graphics.LINE_DOT);
-
-		int[] points = new int[6];
-
-		points[0] = 0 + offset;
-		points[1] = 0;
-		points[2] = bounds1.width - 1;
-		points[3] = 0;
-		points[4] = bounds1.width - 1;
-		points[5] = bounds1.height - 1;
-
-		graphics.drawPolyline(points);
-
-		points[0] = 0;
-		points[1] = 0 + offset;
-		points[2] = 0;
-		points[3] = bounds1.height - 1;
-		points[4] = bounds1.width - 1;
-		points[5] = bounds1.height - 1;
-
-		graphics.drawPolyline(points);
-
-		graphics.translate(getLocation().getNegated());
-
-		if (schedulePaint) {
-			Display.getCurrent().timerExec(DELAY, new Runnable() {
-				public void run() {
-					offset++;
-					if (offset > 5)
-						offset = 0;
-
-					schedulePaint = true;
-					repaint();
-				}
-			});
-		}
-
-		schedulePaint = false;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/RowHandle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/RowHandle.java
deleted file mode 100644
index 5ebd6d9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/RowHandle.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.GraphicalEditPart;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class RowHandle extends TableSideItemHandle {
-
-	/**
-	 * @param owner
-	 * @param index
-	 */
-	public RowHandle(GraphicalEditPart owner, int index) {
-		super(owner, true, index);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/RowResizeHandle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/RowResizeHandle.java
deleted file mode 100644
index 8efbcc3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/RowResizeHandle.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.GraphicalEditPart;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class RowResizeHandle extends TableSideResizeHandle {
-	// 0 means before first row
-	int _rowIndex;
-
-	/**
-	 * @param owner 
-	 * @param index 
-	 */
-	public RowResizeHandle(GraphicalEditPart owner, int index) {
-		super(owner, true, index);
-
-		_rowIndex = index;
-	}
-
-	/**
-	 * @return the row index
-	 */
-	public int getRowIndex() {
-		return _rowIndex;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableColumnHandle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableColumnHandle.java
deleted file mode 100644
index 466159b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableColumnHandle.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableColumnHandle extends TableSideHandle {
-	/**
-	 * @param tableHost
-	 */
-	public TableColumnHandle(GraphicalEditPart tableHost) {
-		super(tableHost, new TableColumnHandleLocator(tableHost));
-	}
-
-	/**
-	 * 
-	 * 
-	 */
-	public void setupColumns() {
-		ITableEditAdapter tableAdapter = getTableEditAdapter();
-		if (tableAdapter == null) {
-			return;
-		}
-		int numColumns = tableAdapter.getColumnCount();
-		for (int i = 0; i < numColumns; i++) {
-			ColumnHandle columnHandle = createColumnHandle(i);
-			add(columnHandle);
-			ColumnResizeHandle columnResizeHandle = createColumnResizeHandle(i);
-			add(columnResizeHandle);
-		}
-		ColumnResizeHandle lastResize = createColumnResizeHandle(numColumns);
-		add(lastResize);
-	}
-
-	/**
-	 * @param numColumns
-	 * @return
-	 */
-	private ColumnResizeHandle createColumnResizeHandle(int numColumns) {
-		return new ColumnResizeHandle(getOwner(), numColumns);
-	}
-
-	/**
-	 * @param i
-	 * @return
-	 */
-	private ColumnHandle createColumnHandle(int i) {
-		return new ColumnHandle(getOwner(), i);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableColumnHandleLocator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableColumnHandleLocator.java
deleted file mode 100644
index 37bb7e2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableColumnHandleLocator.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.handles.HandleBounds;
-import org.eclipse.gef.handles.MoveHandleLocator;
-import org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableColumnHandleLocator extends MoveHandleLocator {
-
-	GraphicalEditPart _tablePart;
-
-	/**
-	 * @param tablePart 
-	 */
-	public TableColumnHandleLocator(GraphicalEditPart tablePart) {
-		super(tablePart.getFigure());
-		_tablePart = tablePart;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.handles.MoveHandleLocator#relocate(org.eclipse.draw2d.IFigure)
-	 */
-	public void relocate(IFigure target) {
-		Rectangle bounds;
-		if (getReference() instanceof HandleBounds) {
-			bounds = ((HandleBounds) getReference()).getHandleBounds();
-		} else {
-			bounds = getReference().getBounds();
-		}
-		Insets referenceInsets = getReference().getInsets();
-
-		Rectangle r = new Rectangle(bounds.x + referenceInsets.left, bounds.y
-				+ bounds.height, bounds.width - referenceInsets.getWidth(),
-				TableEditConst.HEIGHT);
-
-		getReference().translateToAbsolute(r);
-		target.translateToRelative(r);
-
-		target.setBounds(r);
-		relocateChildren(target, getReference());
-	}
-
-	/**
-	 * @param target
-	 * @param reference
-	 */
-	private void relocateChildren(IFigure target, IFigure reference) {
-		// As user may removed columns/rows, so need to recalculate columns.
-		TableColumnHandle tableColumnHandle = (TableColumnHandle) target;
-		tableColumnHandle.removeAll();
-		tableColumnHandle.setupColumns();
-
-		// ---------------------------
-		List children = target.getChildren();
-
-		ITableEditAdapter tableAdapter = TableEditHelper
-				.getTableEditAdapter(this._tablePart);
-		if (tableAdapter == null) {
-			// XXX: what should we do if we found it is no longer table?
-			// here just skip
-			return;
-		}
-		for (int i = 0, size = children.size(); i < size; i++) {
-			Rectangle rect = null;
-			IFigure child = (IFigure) children.get(i);
-			if (child instanceof ColumnHandle) {
-				ColumnHandle columnHandle = (ColumnHandle) child;
-				int columnIndex = columnHandle.getIndex();
-				rect = new Rectangle(tableAdapter.getColumnStart(columnIndex),
-						0, tableAdapter.getColumnWidth(columnIndex),
-						TableEditConst.HEIGHT);
-			} else if (child instanceof ColumnResizeHandle) {
-				ColumnResizeHandle resizeHandle = (ColumnResizeHandle) child;
-				int columnIndex = resizeHandle.getColumnIndex();
-				rect = new Rectangle(tableAdapter
-						.getColumnResizeStart(columnIndex), 0, tableAdapter
-						.getColumnResizeWidth(), TableEditConst.HEIGHT);
-			} else {
-				// should not happen.
-			}
-			if (rect != null) {
-				child.setBounds(rect);
-			}
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableEditAdapter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableEditAdapter.java
deleted file mode 100644
index 6689636..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableEditAdapter.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.jst.pagedesigner.css2.layout.table.CSSTableLayout2;
-import org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableEditAdapter implements ITableEditAdapter {
-	CSSTableLayout2 _tableLayout;
-
-	/**
-	 * @param layout2
-	 */
-	public TableEditAdapter(CSSTableLayout2 layout2) {
-		this._tableLayout = layout2;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter#getColumnCount()
-	 */
-	public int getColumnCount() {
-		return _tableLayout.getColumnWidths().length;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter#getRowCount()
-	 */
-	public int getRowCount() {
-		return _tableLayout.getRowHeights().length;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter#insertColumn(int)
-	 */
-	public void insertColumn(int atPosition) {
-	    // do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter#insertRow(int)
-	 */
-	public void insertRow(int rowPosition) {
-		// TODO Auto-generated method stub
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter#getResizeStart(int)
-	 */
-	public int getColumnResizeStart(int columnIndex) {
-		int w = 0;
-		int[] columnWidths = _tableLayout.getColumnWidths();
-		for (int i = 0; i < columnIndex; i++) {
-			w += columnWidths[i];
-		}
-		w += columnIndex * _tableLayout.getHSpacing();
-		return w;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter#getResizeWidth()
-	 */
-	public int getColumnResizeWidth() {
-		return _tableLayout.getHSpacing();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter#getColumnStart(int)
-	 */
-	public int getColumnStart(int columnIndex) {
-		return getColumnResizeStart(columnIndex) + _tableLayout.getHSpacing();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter#getColumnWidth(int)
-	 */
-	public int getColumnWidth(int columnIndex) {
-		return _tableLayout.getColumnWidths()[columnIndex];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter#getRowStart(int)
-	 */
-	public int getRowStart(int rowIndex) {
-		int start = getRowResizeStart(rowIndex) + _tableLayout.getVSpacing();
-		if (_tableLayout.getCaptionInfo() != null
-				&& "top".equalsIgnoreCase(_tableLayout.getCaptionInfo().getAlign())) //$NON-NLS-1$
-		{
-			start += _tableLayout.getCaptionSize().height;
-		}
-		return start;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter#getRowHeight(int)
-	 */
-	public int getRowHeight(int rowIndex) {
-		return _tableLayout.getRowHeights()[rowIndex];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter#getRowResizeStart(int)
-	 */
-	public int getRowResizeStart(int rowIndex) {
-		int w = 0;
-		int[] rowHeights = _tableLayout.getRowHeights();
-		for (int i = 0; i < rowIndex; i++) {
-			w += rowHeights[i];
-		}
-		w += rowIndex * _tableLayout.getHSpacing();
-		return w;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter#getRowResizeWidth()
-	 */
-	public int getRowResizeWidth() {
-		return _tableLayout.getVSpacing();
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableEditConst.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableEditConst.java
deleted file mode 100644
index 40b1dee..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableEditConst.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-/*package*/ interface TableEditConst {
-	/**
-	 * height constant
-	 */
-	public static final int HEIGHT = 10;
-
-	/**
-	 * width constant
-	 */
-	public static final int WIDTH = 10;
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableEditHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableEditHelper.java
deleted file mode 100644
index 5614d81..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableEditHelper.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.LayoutManager;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.jst.pagedesigner.css2.layout.table.CSSTableLayout2;
-import org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableEditHelper {
-	/**
-	 * This method will return null if the editpart is not a table.
-	 * 
-	 * @param tablePart
-	 * @return the adapter
-	 */
-	public static ITableEditAdapter getTableEditAdapter(
-			GraphicalEditPart tablePart) {
-		IFigure figure = tablePart.getFigure();
-		LayoutManager layout = figure.getLayoutManager();
-		if (layout instanceof CSSTableLayout2) {
-			return new TableEditAdapter((CSSTableLayout2) layout);
-		}
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableHandleKit.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableHandleKit.java
deleted file mode 100644
index c8082e5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableHandleKit.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import java.util.List;
-
-import org.eclipse.gef.GraphicalEditPart;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableHandleKit {
-
-	/**
-	 * @param tableHost
-	 * @param handles
-	 */
-	public static void addHandles(GraphicalEditPart tableHost, List handles) {
-		addColumnHandles(tableHost, handles);
-		addRowHandles(tableHost, handles);
-	}
-
-	/**
-	 * @param tableHost
-	 * @param handles
-	 */
-	private static void addColumnHandles(GraphicalEditPart tableHost,
-			List handles) {
-		TableColumnHandle handle = new TableColumnHandle(tableHost);
-		handles.add(handle);
-
-	}
-
-	/**
-	 * @param tableHost
-	 * @param handles
-	 */
-	private static void addRowHandles(GraphicalEditPart tableHost, List handles) {
-		TableRowHandle handle = new TableRowHandle(tableHost);
-		handles.add(handle);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableInsertRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableInsertRequest.java
deleted file mode 100644
index 101d47c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableInsertRequest.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableInsertRequest extends TableRowColumnRequest {
-	/**
-	 * 
-	 */
-	private static final String TABLE_INSERT_REQUEST = "Table Insert";
-
-	boolean _before;
-
-	/**
-	 * @param row 
-	 * @param index 
-	 * @param before 
-	 * 
-	 */
-	public TableInsertRequest(boolean row, int index, boolean before) {
-		super(TABLE_INSERT_REQUEST, row, index);
-		this._before = before;
-	}
-
-	/**
-	 * @return true if is before
-	 */
-	public boolean isBefore() {
-		return _before;
-	}
-
-	/**
-	 * @param before
-	 */
-	public void setBefore(boolean before) {
-		this._before = before;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableResizableEditPolicy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableResizableEditPolicy.java
deleted file mode 100644
index 87619c2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableResizableEditPolicy.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import java.util.List;
-
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.jst.pagedesigner.editpolicies.ElementResizableEditPolicy;
-import org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableResizableEditPolicy extends ElementResizableEditPolicy {
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.editpolicies.ResizableEditPolicy#createSelectionHandles()
-	 */
-	protected List createSelectionHandles() {
-		List list = super.createSelectionHandles();
-
-		// CR402770-1. Add a check whether it is table. If is not, will not
-		// create the handles. Thus, the handles could assume
-		// TableEditHelper.getTableEditAdatper()
-		// will always return non null.
-		ITableEditAdapter adapter = TableEditHelper
-				.getTableEditAdapter((GraphicalEditPart) getHost());
-		if (adapter != null) {
-			TableHandleKit.addHandles((GraphicalEditPart) getHost(), list);
-		}
-		return list;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableResizeRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableResizeRequest.java
deleted file mode 100644
index 5bca788..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableResizeRequest.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.Request;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableResizeRequest extends Request {
-	private static final String TABLE_RESIZE_REQ = "Table Resize";
-
-	private boolean _row;
-
-	private int _index;
-
-	private int _delta;
-
-	/**
-	 * @param isrow 
-	 * @param index 
-	 */
-	public TableResizeRequest(boolean isrow, int index) {
-		super(TABLE_RESIZE_REQ);
-		this._row = isrow;
-		this._index = index;
-	}
-
-	/**
-	 * @return the index
-	 */
-	public int getIndex() {
-		return _index;
-	}
-
-	/**
-	 * @param index
-	 */
-	public void setIndex(int index) {
-		this._index = index;
-	}
-
-	/**
-	 * @return true if is row
-	 */
-	public boolean isRow() {
-		return _row;
-	}
-
-	/**
-	 * @param row
-	 */
-	public void setRow(boolean row) {
-		this._row = row;
-	}
-
-	/**
-	 * @return the delta
-	 */
-	public int getDelta() {
-		return _delta;
-	}
-
-	/**
-	 * @param delta
-	 */
-	public void setDelta(int delta) {
-		this._delta = delta;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableRowColumnDeleteRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableRowColumnDeleteRequest.java
deleted file mode 100644
index 1e44f46..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableRowColumnDeleteRequest.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableRowColumnDeleteRequest extends TableRowColumnRequest {
-	private static final String TABLE_ROWCOLUMN_DELETE = "Table RowColumn Delete";
-
-	/**
-	 * @param row
-	 * @param index
-	 */
-	public TableRowColumnDeleteRequest(boolean row, int index) {
-		super(TABLE_ROWCOLUMN_DELETE, row, index);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableRowColumnRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableRowColumnRequest.java
deleted file mode 100644
index b7bc8cd..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableRowColumnRequest.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.Request;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableRowColumnRequest extends Request {
-	int _index;
-
-	boolean _row;
-
-	/**
-	 * @param type
-	 * @param row 
-	 * @param index 
-	 */
-	public TableRowColumnRequest(Object type, boolean row, int index) {
-		super(type);
-		this._row = row;
-		this._index = index;
-	}
-
-	/**
-	 * @return the index
-	 */
-	public int getIndex() {
-		return _index;
-	}
-
-	/**
-	 * @param index
-	 */
-	public void setIndex(int index) {
-		this._index = index;
-	}
-
-	/**
-	 * @return true if is row
-	 */
-	public boolean isRow() {
-		return _row;
-	}
-
-	/**
-	 * @param row
-	 */
-	public void setRow(boolean row) {
-		this._row = row;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableRowHandle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableRowHandle.java
deleted file mode 100644
index daca6e4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableRowHandle.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableRowHandle extends TableSideHandle {
-	/**
-	 * @param tableHost
-	 */
-	public TableRowHandle(GraphicalEditPart tableHost) {
-		super(tableHost, new TableRowHandleLocator(tableHost));
-		// setupRows();
-	}
-
-	/**
-	 * 
-	 * 
-	 */
-	public void setupRows() {
-		ITableEditAdapter tableAdapter = getTableEditAdapter();
-		if (tableAdapter == null) {
-			return;
-		}
-		int numRows = tableAdapter.getRowCount();
-		for (int i = 0; i < numRows; i++) {
-			RowHandle rowHandle = createRowHandle(i);
-			add(rowHandle);
-			RowResizeHandle rowResizeHandle = createRowResizeHandle(i);
-			add(rowResizeHandle);
-		}
-		RowResizeHandle lastResize = createRowResizeHandle(numRows);
-		add(lastResize);
-	}
-
-	/**
-	 * @param rowIndex
-	 * @return
-	 */
-	private RowResizeHandle createRowResizeHandle(int rowIndex) {
-		return new RowResizeHandle(getOwner(), rowIndex);
-	}
-
-	/**
-	 * @param rowIndex
-	 * @return
-	 */
-	private RowHandle createRowHandle(int rowIndex) {
-		return new RowHandle(getOwner(), rowIndex);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableRowHandleLocator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableRowHandleLocator.java
deleted file mode 100644
index 54ed350..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableRowHandleLocator.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.PrecisionRectangle;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.handles.HandleBounds;
-import org.eclipse.gef.handles.MoveHandleLocator;
-import org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableRowHandleLocator extends MoveHandleLocator {
-
-	GraphicalEditPart _tablePart;
-
-	/**
-	 * @param tablePart
-	 */
-	public TableRowHandleLocator(GraphicalEditPart tablePart) {
-		super(tablePart.getFigure());
-		_tablePart = tablePart;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.handles.MoveHandleLocator#relocate(org.eclipse.draw2d.IFigure)
-	 */
-	public void relocate(IFigure target) {
-		Rectangle bounds;
-		if (getReference() instanceof HandleBounds) {
-			bounds = ((HandleBounds) getReference()).getHandleBounds();
-		} else {
-			bounds = getReference().getBounds();
-		}
-		// bounds = new PrecisionRectangle(bounds.getResized(-1, -1));
-		Insets referenceInsets = getReference().getInsets();
-
-		Rectangle r = new Rectangle(bounds.x + bounds.width, bounds.y
-				+ referenceInsets.top, TableEditConst.WIDTH, bounds.height
-				- referenceInsets.getHeight());
-		bounds = new PrecisionRectangle(r);
-
-		getReference().translateToAbsolute(bounds);
-		target.translateToRelative(bounds);
-
-		target.setBounds(bounds);
-		relocateChildren(target, getReference());
-	}
-
-	/**
-	 * @param target
-	 * @param reference
-	 */
-	private void relocateChildren(IFigure target, IFigure reference) {
-		// As user may removed columns/rows, so need to recalculate columns.
-		TableRowHandle tableRowHandle = (TableRowHandle) target;
-		tableRowHandle.removeAll();
-		tableRowHandle.setupRows();
-		List children = target.getChildren();
-
-		ITableEditAdapter tableAdapter = TableEditHelper
-				.getTableEditAdapter(this._tablePart);
-		if (tableAdapter == null) {
-			return;
-		}
-		for (int i = 0, size = children.size(); i < size; i++) {
-			Rectangle rect = null;
-			IFigure child = (IFigure) children.get(i);
-			if (child instanceof RowHandle) {
-				RowHandle rowHandle = (RowHandle) child;
-				int rowIndex = rowHandle.getIndex();
-				rect = new Rectangle(0, tableAdapter.getRowStart(rowIndex),
-						TableEditConst.WIDTH, tableAdapter
-								.getRowHeight(rowIndex));
-			} else if (child instanceof RowResizeHandle) {
-				RowResizeHandle resizeHandle = (RowResizeHandle) child;
-				int rowIndex = resizeHandle.getRowIndex();
-				rect = new Rectangle(0, tableAdapter
-						.getRowResizeStart(rowIndex), TableEditConst.WIDTH,
-						tableAdapter.getRowResizeWidth());
-			} else {
-				// should not happen.
-			}
-			if (rect != null) {
-				child.setBounds(rect);
-			}
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideHandle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideHandle.java
deleted file mode 100644
index 753ad40..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideHandle.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.draw2d.Locator;
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.handles.AbstractHandle;
-import org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableSideHandle extends AbstractHandle {
-	/**
-	 * @param owner
-	 * @param loc
-	 */
-	public TableSideHandle(GraphicalEditPart owner, Locator loc) {
-		super(owner, loc);
-		// TODO Auto-generated constructor stub
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.handles.AbstractHandle#createDragTracker()
-	 */
-	protected DragTracker createDragTracker() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/**
-	 * @return the edit part
-	 */
-	public GraphicalEditPart getTableEditPart() {
-		return this.getOwner();
-	}
-
-	/**
-	 * @return the adapter
-	 */
-	public ITableEditAdapter getTableEditAdapter() {
-		return TableEditHelper.getTableEditAdapter(getOwner());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Figure#useLocalCoordinates()
-	 */
-	protected boolean useLocalCoordinates() {
-		return true;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideItemDragTracker.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideItemDragTracker.java
deleted file mode 100644
index efedef5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideItemDragTracker.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.tools.DragEditPartsTracker;
-
-/**
- * This is the tracker for the TableSideItem. It will be responsible to track
- * the right mouse down event and popup a menu.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class TableSideItemDragTracker extends DragEditPartsTracker {
-    // TODO: dead?
-    //	private boolean _isRow;
-//
-//	private int _index;
-
-	/**
-	 * 
-	 * @param sourceEditPart
-	 * @param isrow
-	 * @param index
-	 */
-	public TableSideItemDragTracker(EditPart sourceEditPart, boolean isrow,
-			int index) {
-		super(sourceEditPart);
-        // TODO: dead?
-//		this._isRow = isrow;
-//		this._index = index;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.DragEditPartsTracker#handleButtonUp(int)
-	 */
-	protected boolean handleButtonUp(int button) {
-		boolean result = super.handleButtonUp(button);
-		//
-		// if (button == 3)
-		// {
-		// MenuManager m = new MenuManager();
-		// if (_isRow)
-		// {
-		// m.add(new InsertRowColumnAction("Insert row before",
-		// getSourceEditPart(), _index, _isRow, true));
-		// m.add(new InsertRowColumnAction("Insert row after",
-		// getSourceEditPart(), _index, _isRow, false));
-		// m.add(new DeleteRowColumnAction("Delete row", getSourceEditPart(),
-		// _index, _isRow));
-		// }
-		// else
-		// {
-		// m.add(new InsertRowColumnAction("Insert column before",
-		// getSourceEditPart(), _index, _isRow, true));
-		// m.add(new InsertRowColumnAction("Insert column after",
-		// getSourceEditPart(), _index, _isRow, false));
-		// m.add(new DeleteRowColumnAction("Delete column", getSourceEditPart(),
-		// _index, _isRow));
-		// }
-		// m.createContextMenu(this.getCurrentViewer().getControl()).setVisible(true);
-		// }
-		return result;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideItemHandle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideItemHandle.java
deleted file mode 100644
index 9b833ab..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideItemHandle.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.Cursors;
-import org.eclipse.draw2d.Graphics;
-import org.eclipse.draw2d.LineBorder;
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.handles.AbstractHandle;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public abstract class TableSideItemHandle extends AbstractHandle {
-	private boolean _isRow;
-
-	private int _index;
-
-	/**
-	 * @param owner 
-	 * @param isRow 
-	 * @param index 
-	 * 
-	 */
-	public TableSideItemHandle(GraphicalEditPart owner, boolean isRow, int index) {
-		super(owner, new EmptyLocator());
-		this._isRow = isRow;
-		this._index = index;
-		initialize();
-	}
-
-	/**
-	 * 
-	 */
-	private void initialize() {
-		this.setOpaque(false);
-		LineBorder border1 = new LineBorder(ColorConstants.green, 1);
-		this.setBorder(border1);
-		this.setCursor(Cursors.ARROW);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.Figure#paintFigure(org.eclipse.draw2d.Graphics)
-	 */
-	protected void paintFigure(Graphics graphics) {
-		graphics.setXORMode(true);
-		graphics.setBackgroundColor(ColorConstants.darkGray);
-		graphics.fillRectangle(getBounds());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.handles.AbstractHandle#createDragTracker()
-	 */
-	protected DragTracker createDragTracker() {
-		return new TableSideItemDragTracker(getOwner(), _isRow, _index);
-	}
-
-	/**
-	 * @return the index
-	 */
-	public int getIndex() {
-		return _index;
-	}
-
-	/**
-	 * @return true if is row
-	 */
-	public boolean isRow() {
-		return _isRow;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideResizeDragTracker.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideResizeDragTracker.java
deleted file mode 100644
index ca0771f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideResizeDragTracker.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.tools.DragEditPartsTracker;
-import org.eclipse.jst.pagedesigner.editpolicies.ITableEditAdapter;
-
-/**
- * This is the drag tracker for the small resize item on the
- * TableSideResizeHandle. used to adjust a single column/row size.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class TableSideResizeDragTracker extends DragEditPartsTracker {
-	private boolean _isrow;
-
-	private int _index;
-
-	private MarqueeRectangleFigure _marqueeFigure;
-
-	/**
-	 * @param sourceEditPart
-	 * @param isrow 
-	 * @param index 
-	 */
-	public TableSideResizeDragTracker(EditPart sourceEditPart, boolean isrow,
-			int index) {
-		super(sourceEditPart);
-		this._isrow = isrow;
-		this._index = index;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.DragEditPartsTracker#showSourceFeedback()
-	 */
-	protected void showSourceFeedback() {
-		Rectangle rect = getFeedbackRect();
-		if (rect != null) {
-			rect = rect.getCopy();
-			getMarqueeRectangleFigure().setBounds(rect);
-		} else {
-			// ignore.
-		}
-	}
-
-	private int calculateDelta() {
-		int delta;
-		// FIXME: TODO: XXX: when delta is too small (<0) to make previous
-		// column/row
-		// to have negative size, then we need adjust delta.
-		if (_isrow) {
-			delta = getLocation().y - getStartLocation().y;
-		} else {
-			delta = getLocation().x - getStartLocation().x;
-		}
-		return delta;
-	}
-
-	/**
-	 * @return null if this is not a table.
-	 */
-	private Rectangle getFeedbackRect() {
-		ITableEditAdapter adapter = getTableEditAdapter();
-		if (adapter == null) {
-			return null;
-		}
-
-		IFigure figure = ((GraphicalEditPart) this.getSourceEditPart())
-				.getFigure();
-		Rectangle bounds = figure.getBounds();
-		Insets insets = figure.getInsets();
-		Rectangle rect;
-		if (_isrow) {
-			int delta = calculateDelta();
-			rect = new Rectangle(0, adapter.getRowResizeStart(_index) + delta,
-					bounds.width - insets.getWidth(), adapter
-							.getRowResizeWidth());
-		} else {
-			int delta = calculateDelta();
-			rect = new Rectangle(adapter.getColumnResizeStart(_index) + delta,
-					0, adapter.getColumnResizeWidth(), bounds.height
-							- insets.getHeight());
-		}
-		rect.translate(bounds.x + insets.left, bounds.y + insets.top);
-
-		figure.translateToAbsolute(rect);
-		getMarqueeRectangleFigure().translateToRelative(rect);
-		return rect;
-	}
-
-	/**
-	 * 
-	 * @return null if this is not a table.
-	 */
-	private ITableEditAdapter getTableEditAdapter() {
-		return TableEditHelper.getTableEditAdapter((GraphicalEditPart) this
-				.getSourceEditPart());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.DragEditPartsTracker#eraseSourceFeedback()
-	 */
-	protected void eraseSourceFeedback() {
-		super.eraseSourceFeedback();
-		if (_marqueeFigure != null) {
-			removeFeedback(_marqueeFigure);
-			_marqueeFigure = null;
-		}
-	}
-
-	private MarqueeRectangleFigure getMarqueeRectangleFigure() {
-		if (this._marqueeFigure == null) {
-			this._marqueeFigure = new MarqueeRectangleFigure();
-			addFeedback(this._marqueeFigure);
-		}
-		return this._marqueeFigure;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.DragEditPartsTracker#createTargetRequest()
-	 */
-	protected Request createTargetRequest() {
-		return new TableResizeRequest(this._isrow, this._index);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.DragEditPartsTracker#updateTargetRequest()
-	 */
-	protected void updateTargetRequest() {
-		TableResizeRequest req = (TableResizeRequest) getTargetRequest();
-		req.setDelta(calculateDelta());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.SelectEditPartTracker#handleButtonDown(int)
-	 */
-	protected boolean handleButtonDown(int button) {
-		lockTargetEditPart(getSourceEditPart());
-		return super.handleButtonDown(button);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.DragEditPartsTracker#getCommand()
-	 */
-	protected Command getCommand() {
-		return getTargetEditPart().getCommand(getTargetRequest());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideResizeHandle.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideResizeHandle.java
deleted file mode 100644
index bfe6b22..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tableedit/TableSideResizeHandle.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tableedit;
-
-import org.eclipse.draw2d.Cursors;
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.handles.AbstractHandle;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TableSideResizeHandle extends AbstractHandle {
-	private boolean _isRow;
-
-	private int _index;
-
-	/**
-	 * @param owner 
-	 * @param isrow 
-	 * @param index 
-	 * 
-	 */
-	public TableSideResizeHandle(GraphicalEditPart owner, boolean isrow,
-			int index) {
-		super(owner, new EmptyLocator());
-		this._isRow = isrow;
-		this._index = index;
-
-		this.setCursor(isrow ? Cursors.SIZEN : Cursors.SIZEE);
-		// this.setBackgroundColor(ColorConstants.green);
-		this.setOpaque(false);
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.handles.AbstractHandle#createDragTracker()
-	 */
-	protected DragTracker createDragTracker() {
-		return new TableSideResizeDragTracker(getOwner(), _isRow, _index);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/ExposeHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/ExposeHelper.java
deleted file mode 100644
index 6828db1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/ExposeHelper.java
+++ /dev/null
@@ -1,333 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tools;
-
-import org.eclipse.draw2d.FigureCanvas;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Viewport;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.gef.editpolicies.AbstractEditPolicy;
-import org.eclipse.gef.ui.parts.ScrollingGraphicalViewer;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.w3c.dom.Node;
-
-/**
- * This helper class expose an rectangle in design view, currentlly it is used
- * to help expose caret.
- * 
- * @author mengbo
- */
-public class ExposeHelper {
-	private static final int DEFAULT_OFFSET = 100;
-
-	private static final int SCROLL_OFFSET = 8;
-
-	IHTMLGraphicalViewer _viewer;
-
-	/**
-	 * @param viewer 
-	 */
-	public ExposeHelper(IHTMLGraphicalViewer viewer) {
-		_viewer = viewer;
-	}
-
-	/**
-	 * Expose rectangle. (non-Javadoc)
-	 * @param rect 
-	 * 
-	 * @see org.eclipse.gef.ExposeHelper#exposeDescendant(org.eclipse.gef.EditPart)
-	 */
-	public void exposeArea(Rectangle rect) {
-		if (_viewer == null) {
-			return;
-		}
-		FigureCanvas canvas = (FigureCanvas) _viewer.getControl();
-		Viewport port = _viewer.getViewport();
-
-		if (port == null) {
-			return;
-		}
-		Rectangle exposeRegion = rect.getCopy();
-		Rectangle portBounds = port.getBounds().getCopy();
-		Point viewLocation = port.getViewLocation();
-		Dimension diff = calculateDiff(portBounds, exposeRegion);
-		if (diff != null) {
-			viewLocation.x -= diff.width;
-			viewLocation.y -= diff.height;
-			canvas.scrollSmoothTo(viewLocation.x, viewLocation.y);
-		}
-	}
-
-	private void exposeVertical(int offset) {
-		if (_viewer == null) {
-			return;
-		}
-		FigureCanvas canvas = (FigureCanvas) _viewer.getControl();
-		Viewport port = _viewer.getViewport();
-
-		if (port == null) {
-			return;
-		}
-		Point viewLocation = port.getViewLocation();
-		viewLocation.y += offset;
-		canvas.scrollSmoothTo(viewLocation.x, viewLocation.y);
-	}
-
-	private void exposeHorizontal(int offset) {
-		if (_viewer == null) {
-			return;
-		}
-		FigureCanvas canvas = (FigureCanvas) _viewer.getControl();
-		Viewport port = _viewer.getViewport();
-
-		if (port == null) {
-			return;
-		}
-		Point viewLocation = port.getViewLocation();
-		viewLocation.x += offset;
-		canvas.scrollSmoothTo(viewLocation.x, viewLocation.y);
-	}
-
-	private int calculateX(Rectangle portBounds, Rectangle caretRect) {
-		int result = 0;
-		if (portBounds.x > caretRect.getRight().x) {
-			result = portBounds.getLeft().getDifference(caretRect.getRight()).width;
-			if (portBounds.width >= caretRect.width) {
-				result = portBounds.getLeft()
-						.getDifference(caretRect.getLeft()).width;
-			}
-		} else if (portBounds.getRight().x < caretRect.getLeft().x) {
-			result = portBounds.getRight().getDifference(caretRect.getLeft()).width;
-			if (portBounds.width >= caretRect.width) {
-				result = portBounds.getRight().getDifference(
-						caretRect.getRight()).width;
-			}
-		}
-		return result;
-	}
-
-	private int calculateY(Rectangle portBounds, Rectangle caretRect) {
-		int result = 0;
-		if (portBounds.y > caretRect.getBottom().y) {
-			result = portBounds.getTop().getDifference(caretRect.getBottom()).height;
-			if (portBounds.height >= caretRect.height) {
-				result = portBounds.getTop().getDifference(caretRect.getTop()).height;
-			}
-		} else if (portBounds.getBottom().y < caretRect.getTop().y) {
-			result = portBounds.getBottom().getDifference(caretRect.getTop()).height;
-			if (portBounds.height >= caretRect.height) {
-				result = portBounds.getBottom().getDifference(
-						caretRect.getBottom()).height;
-			}
-		} else if (portBounds.getBottom().y < caretRect.getBottom().y) {
-			if (portBounds.height >= caretRect.height) {
-				result = portBounds.getBottom().getDifference(
-						caretRect.getBottom()).height;
-			}
-		} else if (portBounds.getTop().y > caretRect.getTop().y) {
-			if (portBounds.height >= caretRect.height) {
-				result = portBounds.getTop().getDifference(caretRect.getTop()).height;
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Calculate caretPoint's offset to posrBounds at both x coordinate and y
-	 * coordinate.
-	 * 
-	 * @param portBounds
-	 * @param exposeRegion
-	 * @param canvas
-	 * @param caretPoint
-	 */
-	private Dimension calculateDiff(Rectangle portBounds, Rectangle caretRect) {
-		Dimension diff = new Dimension(0, 0);
-		diff.width = calculateX(portBounds, caretRect);
-		diff.height = calculateY(portBounds, caretRect);
-		return diff;
-	}
-
-	// /**
-	// * Calculate caretPoint's offset to posrBounds at both x coordinate and y
-	// coordinate.
-	// *
-	// * @param portBounds
-	// * @param exposeRegion
-	// * @param canvas
-	// * @param caretPoint
-	// */
-	// private Dimension calculateDiff(Rectangle portBounds, Point caretPoint)
-	// {
-	// int position = portBounds.getPosition(caretPoint);
-	// Dimension diff = null;
-	// Point containerPos = null;
-	// switch (position)
-	// {
-	// case PositionConstants.EAST:
-	// containerPos = new Point(portBounds.getRight().x, caretPoint.y);
-	// diff = containerPos.getDifference(caretPoint);
-	// break;
-	// case PositionConstants.NORTH_EAST:
-	// diff = portBounds.getTopRight().getDifference(caretPoint);
-	// break;
-	// case PositionConstants.WEST:
-	// containerPos = new Point(portBounds.getLeft().x, caretPoint.y);
-	// diff = containerPos.getDifference(caretPoint);
-	// break;
-	// case PositionConstants.NORTH_WEST:
-	// diff = portBounds.getTopLeft().getDifference(caretPoint);
-	// break;
-	// case PositionConstants.SOUTH_WEST:
-	// diff = portBounds.getBottomLeft().getDifference(caretPoint);
-	// break;
-	// case PositionConstants.SOUTH_EAST:
-	// diff = portBounds.getBottomRight().getDifference(caretPoint);
-	// break;
-	// case PositionConstants.NORTH:
-	// containerPos = new Point(caretPoint.x, portBounds.getTop().y);
-	// diff = containerPos.getDifference(caretPoint);
-	// break;
-	// case PositionConstants.SOUTH:
-	// containerPos = new Point(caretPoint.x, portBounds.getBottom().y);
-	// diff = containerPos.getDifference(caretPoint);
-	// break;
-	// }
-	// return diff;
-	// }
-	//
-	private static void expose(EditPart part, ScrollingGraphicalViewer viewer) {
-		if (part != null && part.getModel() instanceof Node) {
-			viewer.reveal(part);
-		}
-	}
-
-	private static void expose(Node element, ScrollingGraphicalViewer viewer) {
-		if (element instanceof INodeNotifier) {
-			EditPart editPart = (EditPart) ((INodeNotifier) element)
-					.getAdapterFor(EditPart.class);
-			expose(editPart, viewer);
-		}
-	}
-
-	/**
-	 * @param selection
-	 * @param viewer
-	 */
-	public static void expose(ISelection selection,
-			ScrollingGraphicalViewer viewer) {
-		if (selection instanceof IStructuredSelection) {
-			Object element = ((IStructuredSelection) selection)
-					.getFirstElement();
-			if (element instanceof Node) {
-				expose((Node) element, viewer);
-			} else if (element instanceof EditPart) {
-				expose((EditPart) element, viewer);
-			}
-		}
-	}
-
-	/**
-	 * @param p
-	 */
-	public void adjustVertical(Point p) {
-		int offset = 0;
-		if ((offset = getVerticalBoundsOffset(p, false)) < SCROLL_OFFSET) {
-			exposeVertical(SCROLL_OFFSET - offset);
-		} else if ((offset = getVerticalBoundsOffset(p, true)) < SCROLL_OFFSET) {
-			exposeVertical(offset - SCROLL_OFFSET);
-		}
-		if ((offset = getHorizontalBoundsOffset(p, true)) < SCROLL_OFFSET) {
-			exposeHorizontal(SCROLL_OFFSET - offset);
-		} else if ((offset = getHorizontalBoundsOffset(p, false)) < SCROLL_OFFSET) {
-			exposeHorizontal(offset - SCROLL_OFFSET);
-		}
-	}
-
-	/**
-	 * @return the location of the view port
-	 */
-	public Point getViewpostLocation() {
-		if (_viewer != null) {
-			Viewport port = _viewer.getViewport();
-
-			if (port != null) {
-				return port.getViewLocation();
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param figure
-	 * @param p
-	 * @return the translated point
-	 */
-	public Point translateToViewport(IFigure figure, Point p) {
-		Point vp = getViewpostLocation();
-		return new Point(p.x - vp.x, p.y - vp.y);
-	}
-
-	private int getHorizontalBoundsOffset(Point p, boolean forward) {
-		if (_viewer == null) {
-			return DEFAULT_OFFSET;
-		}
-		Viewport port = _viewer.getViewport();
-
-		if (port == null) {
-			return DEFAULT_OFFSET;
-		}
-		if (forward) {
-			Rectangle portBounds = port.getBounds().getCopy();
-			return portBounds.getRight().x - p.x;
-		}
-        return p.x;
-	}
-
-	private int getVerticalBoundsOffset(Point p, boolean up) {
-		if (_viewer == null) {
-			return DEFAULT_OFFSET;
-		}
-		Viewport port = _viewer.getViewport();
-
-		if (port == null) {
-			return DEFAULT_OFFSET;
-		}
-		if (!up) {
-			Rectangle portBounds = port.getBounds().getCopy();
-			return portBounds.getBottom().y - p.y;
-		}
-        return p.y;
-	}
-
-	/**
-	 * @param rect
-	 * @param policy
-	 */
-	void exposeBorder(Rectangle rect, AbstractEditPolicy policy) {
-		Point p = rect.getTopLeft();
-		p = translateToViewport(((GraphicalEditPart) policy.getHost())
-				.getFigure(), p);
-		adjustVertical(p);
-		p = rect.getBottomRight();
-		p = translateToViewport(((GraphicalEditPart) policy.getHost())
-				.getFigure(), p);
-		adjustVertical(p);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/ObjectModeDragTracker.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/ObjectModeDragTracker.java
deleted file mode 100644
index 15519bc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/ObjectModeDragTracker.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tools;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.tools.DragEditPartsTracker;
-import org.eclipse.jst.pagedesigner.range.RangeUtil;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-
-/**
- * When user press right mouse to do selection, if the selected node is inside
- * current range selection, then don't change selection. This is for better
- * context menu support.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class ObjectModeDragTracker extends DragEditPartsTracker {
-	/**
-	 * @param sourceEditPart
-	 */
-	public ObjectModeDragTracker(EditPart sourceEditPart) {
-		super(sourceEditPart);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.SelectEditPartTracker#handleButtonDown(int)
-	 */
-	protected boolean handleButtonDown(int button) {
-		if (button == 3 && isInState(STATE_INITIAL)) {
-			EditPart sourcePart = this.getSourceEditPart();
-			IHTMLGraphicalViewer viewer = (IHTMLGraphicalViewer) sourcePart
-					.getViewer();
-			if (viewer != null && viewer.isInRangeMode()) {
-				DesignRange range = viewer.getRangeSelection();
-				if (range != null && range.isValid()) {
-					if (RangeUtil.intersect(range, sourcePart)) {
-						return true;
-					}
-				}
-			}
-		}
-		return super.handleButtonDown(button);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/RangeDragTracker.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/RangeDragTracker.java
deleted file mode 100644
index 03e690e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/RangeDragTracker.java
+++ /dev/null
@@ -1,314 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tools;
-
-import java.util.Collections;
-
-import org.eclipse.draw2d.Cursors;
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.RequestConstants;
-import org.eclipse.gef.requests.SelectionRequest;
-import org.eclipse.gef.tools.TargetingTool;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.parts.TextEditPart;
-import org.eclipse.jst.pagedesigner.range.RangeUtil;
-import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.InlineEditingPositionMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.Target;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.EditPartPositionHelper;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.graphics.Cursor;
-
-/**
- * @author mengbo
- */
-public class RangeDragTracker extends TargetingTool implements DragTracker {
-	/** Flag to indicate selection has been performed. */
-	private static final int FLAG_SELECTION_PERFORMED = TargetingTool.MAX_FLAG << 1;
-
-	private EditPart editpart;
-
-	/**
-	 * Constructs a new SelectEditPartTracker with the given edit part as the
-	 * source.
-	 * 
-	 * @param owner
-	 *            the source edit part
-	 */
-	public RangeDragTracker(EditPart owner) {
-		setSourceEditPart(owner);
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.AbstractTool#calculateCursor()
-	 */
-	protected Cursor calculateCursor() {
-        return Cursors.IBEAM;
-//		if (isInState(STATE_INITIAL))
-//        {
-//            return Cursors.IBEAM;
-//        }
-//        else if (isInState(STATE_DRAG | STATE_ACCESSIBLE_DRAG))
-//        {
-//			return getDefaultCursor();
-//		}
-//        return Cursors.IBEAM;
-//		return super.calculateCursor();
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.AbstractTool#getCommandName()
-	 */
-	protected String getCommandName() {
-		return "Range Drag Tracker";//$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.AbstractTool#getDebugName()
-	 */
-	protected String getDebugName() {
-		return "Range Drag Tracker";//$NON-NLS-1$
-	}
-
-	/**
-	 * Returns the source edit part.
-	 * 
-	 * @return the source edit part
-	 */
-	protected EditPart getSourceEditPart() {
-		return editpart;
-	}
-
-	/**
-	 * Performs a conditional selection if needed (if right or left mouse button
-	 * have been pressed) and goes into the drag state. If any other button has
-	 * been pressed, the tool goes into the invalid state.
-	 * 
-	 * @see org.eclipse.gef.tools.AbstractTool#handleButtonDown(int)
-	 */
-	protected boolean handleButtonDown(int button) {
-		if (button == 3 && isInState(STATE_INITIAL)) {
-			EditPart sourcePart = this.getSourceEditPart();
-			IHTMLGraphicalViewer viewer = (IHTMLGraphicalViewer) sourcePart
-					.getViewer();
-			if (viewer != null && viewer.isInRangeMode()) {
-				DesignRange range = viewer.getRangeSelection();
-				if (range != null && range.isValid()) {
-					if (RangeUtil.intersect(range, sourcePart)) {
-						return true;
-					}
-				}
-			}
-		}
-
-		if ((button == 1 || button == 3) && isInState(STATE_INITIAL)) {
-			peroformSelectionBegin();
-		}
-
-		if (button != 1) {
-			setState(STATE_INVALID);
-			if (button == 3)
-				setState(STATE_TERMINAL);
-			handleInvalidInput();
-		} else {
-			stateTransition(STATE_INITIAL, STATE_DRAG);
-		}
-		return true;
-	}
-
-	/**
-	 * If the
-	 * source is selected and there are no modifier keys pressed (i.e. the user
-	 * isn't selecting multiple edit parts or deselecting edit parts), sets the
-	 * direct edit flag so that when the mouse is released, a direct edit will
-	 * be performed.
-	 */
-	protected void peroformSelectionBegin() {
-		// if (getCurrentInput().isControlKeyDown())
-		// {
-		// // when control key is down, switch to object selection mode.
-		// getHTMLGraphicalViewer().ensureObjectSelectionMode();
-		// setFlag(FLAG_SELECTION_PERFORMED, true);
-		// EditPartViewer viewer = getCurrentViewer();
-		// List selectedObjects = viewer.getSelectedEditParts();
-		//
-		// if (selectedObjects.contains(getSourceEditPart()))
-		// viewer.deselect(getSourceEditPart());
-		// else
-		// viewer.appendSelection(getSourceEditPart());
-		// }
-		// else
-		if (getCurrentInput().isShiftKeyDown()) {
-			getHTMLGraphicalViewer().ensureRangeSelectionMode();
-			rangeSelection(true);
-		} else {
-			if (shouldStartRangeSelection()) {
-				rangeSelection(false);
-			} else {
-				getCurrentViewer().select(getSourceEditPart());
-			}
-		}
-	}
-
-	/**
-	 * If in the drag state, the tool selects the source edit part.  If the
-	 * edit part is newly selected and not completely visible,
-	 * {@link org.eclipse.gef.EditPartViewer#reveal(EditPart)}is called to show the selected
-	 * edit part.
-	 * 
-	 * @see org.eclipse.gef.tools.AbstractTool#handleButtonUp(int)
-	 */
-	protected boolean handleButtonUp(int button) {
-		if (isInState(STATE_DRAG)) {
-			// XXX: commented the following two line (lium)
-			// performSelection();
-			// if (button == 1 && getSourceEditPart().getSelected() !=
-			// EditPart.SELECTED_NONE)
-			// getCurrentViewer().reveal(getSourceEditPart());
-			setState(STATE_TERMINAL);
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * Calls {@link #performOpen()}if the double click was with mouse button 1.
-	 * 
-	 * @see org.eclipse.gef.tools.AbstractTool#handleDoubleClick(int)
-	 */
-	protected boolean handleDoubleClick(int button) {
-		if (button == 1) {
-			performOpen();
-		}
-		return true;
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.AbstractTool#handleDragStarted()
-	 */
-	protected boolean handleDragStarted() {
-		return stateTransition(STATE_DRAG, STATE_DRAG_IN_PROGRESS);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.AbstractTool#handleDragInProgress()
-	 */
-	protected boolean handleDragInProgress() {
-		if (getHTMLGraphicalViewer().isInRangeMode()) {
-			rangeSelection(true);
-			return true;
-		}
-        return super.handleDragInProgress();
-	}
-
-	/**
-	 * Returns <code>true</code> if selection has already occured.
-	 * 
-	 * @return <code>true</code> if selection has occured
-	 */
-	protected boolean hasSelectionOccurred() {
-		return getFlag(FLAG_SELECTION_PERFORMED);
-	}
-
-	/**
-	 * Creates a {@link SelectionRequest}and sends it to the source edit part
-	 * via {@link EditPart#performRequest(org.eclipse.gef.Request)}. Possible uses are to open
-	 * the selected item in another editor or replace the current editor's
-	 * contents based on the selected item.
-	 */
-	protected void performOpen() {
-		SelectionRequest request = new SelectionRequest();
-		request.setLocation(getLocation());
-		request.setType(RequestConstants.REQ_OPEN);
-		getSourceEditPart().performRequest(request);
-	}
-
-	/**
-	 * @see org.eclipse.gef.tools.AbstractTool#resetFlags()
-	 */
-	protected void resetFlags() {
-		super.resetFlags();
-		setFlag(FLAG_SELECTION_PERFORMED, false);
-	}
-
-	/**
-	 * Sets the source edit part.
-	 * 
-	 * @param part
-	 *            the source edit part
-	 */
-	protected void setSourceEditPart(EditPart part) {
-		this.editpart = part;
-	}
-
-	/**
-	 * @return the html graphical viewer
-	 */
-	public IHTMLGraphicalViewer getHTMLGraphicalViewer() {
-		return (IHTMLGraphicalViewer) getCurrentViewer();
-	}
-
-	/**
-	 * @return
-	 */
-	private boolean shouldStartRangeSelection() {
-		IPositionMediator positionMediator = new InlineEditingPositionMediator(
-				new ActionData(ActionData.INLINE_EDIT, null));
-		if (positionMediator.isEditable(new Target(getSourceEditPart()))) {
-			return getSourceEditPart() instanceof TextEditPart
-					|| !(((NodeEditPart) getSourceEditPart()).isWidget());
-		}
-        return false;
-	}
-
-	/**
-	 * @param b
-	 *            true means remain the old range start position.
-	 */
-	private void rangeSelection(boolean b) {
-		// XXX: not using updateTargetEditPartUnderMouse. Maybe should. Don't
-		// want to
-		// go through the request mechanism, so simple implementation for now.
-		
-		//to avoid 219038 and possibility of current viewer changing
-		final EditPartViewer viewer = getCurrentViewer();
-		final IHTMLGraphicalViewer graphicalViewer = (IHTMLGraphicalViewer)viewer;
-		EditPart editPart = viewer.findObjectAtExcluding(
-				getLocation(), Collections.EMPTY_LIST);
-		IPositionMediator positionMediator = new InlineEditingPositionMediator(
-				new ActionData(ActionData.INLINE_EDIT, null));
-		ExposeHelper exposeHelper = new ExposeHelper(graphicalViewer);
-		exposeHelper.adjustVertical(getCurrentInput().getMouseLocation());
-		DesignPosition position = EditPartPositionHelper.findEditPartPosition(
-				editPart, getCurrentInput().getMouseLocation(),
-				positionMediator);
-		if (b) {
-			graphicalViewer.setRangeEndPosition(position);
-		} else {
-			graphicalViewer.setRange(position, position);
-		}
-		graphicalViewer.updateHorizontalPos();
-	}
-
-    protected boolean handleHover() {
-        boolean retValue = super.handleHover();
-        refreshCursor();
-        return retValue;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/RangeSelectionTool.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/RangeSelectionTool.java
deleted file mode 100644
index be49075..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/RangeSelectionTool.java
+++ /dev/null
@@ -1,319 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.tools;
-
-import org.eclipse.gef.DragTracker;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.RequestConstants;
-import org.eclipse.gef.commands.Command;
-import org.eclipse.gef.requests.LocationRequest;
-import org.eclipse.gef.tools.SelectionTool;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.pagedesigner.commands.DeleteNodeCommand;
-import org.eclipse.jst.pagedesigner.commands.SwitchSelectionCommand;
-import org.eclipse.jst.pagedesigner.commands.nav.HorizontalMoveCommand;
-import org.eclipse.jst.pagedesigner.commands.nav.ICaretPositionMover;
-import org.eclipse.jst.pagedesigner.commands.nav.VerticalMoveCommand;
-import org.eclipse.jst.pagedesigner.commands.range.CopyCommand;
-import org.eclipse.jst.pagedesigner.commands.range.CutCommand;
-import org.eclipse.jst.pagedesigner.commands.range.DeleteCommand;
-import org.eclipse.jst.pagedesigner.commands.range.InsertCommand;
-import org.eclipse.jst.pagedesigner.commands.range.KeyboardData;
-import org.eclipse.jst.pagedesigner.commands.range.PasteCommand;
-import org.eclipse.jst.pagedesigner.commands.range.SelectAllCommand;
-import org.eclipse.jst.pagedesigner.editors.pagedesigner.PageDesignerResources;
-import org.eclipse.jst.pagedesigner.parts.DocumentEditPart;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.requests.LocationModifierRequest;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.graphics.Cursor;
-
-/**
- * @author mengbo
- */
-public class RangeSelectionTool extends SelectionTool 
-{
-	private LocationRequest _hoverRequest;
-    
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.SelectionTool#handleKeyDown(org.eclipse.swt.events.KeyEvent)
-	 */
-	protected boolean handleKeyDown(KeyEvent e) {
-		// resetHover() is not visible.
-		if (isHoverActive()) {
-			handleHoverStop();
-		}
-		setHoverActive(false);
-
-		if ((e.stateMask & SWT.ALT) != 0) {
-			return false;
-		}
-		Command command = null;
-		KeyboardData keyCode = null;
-		switch (e.keyCode) {
-		case SWT.F2:
-			command = new SwitchSelectionCommand((IHTMLGraphicalViewer) this
-					.getCurrentViewer());
-
-			break;
-		case SWT.ARROW_UP:
-			command = new VerticalMoveCommand((IHTMLGraphicalViewer) this
-					.getCurrentViewer(), true, (e.stateMask & SWT.SHIFT) != 0);
-			break;
-		case SWT.ARROW_DOWN:
-			command = new VerticalMoveCommand((IHTMLGraphicalViewer) this
-					.getCurrentViewer(), false, (e.stateMask & SWT.SHIFT) != 0);
-			break;
-		case SWT.ARROW_LEFT:
-			command = new HorizontalMoveCommand((IHTMLGraphicalViewer) this
-					.getCurrentViewer(), false, (e.stateMask & SWT.SHIFT) != 0);
-			break;
-		case SWT.ARROW_RIGHT:
-			command = new HorizontalMoveCommand((IHTMLGraphicalViewer) this
-					.getCurrentViewer(), true, (e.stateMask & SWT.SHIFT) != 0);
-			break;
-		case SWT.DEL:
-			if ((e.stateMask & SWT.SHIFT) == 0) {
-				if (getCurrentViewer().getSelection() != null) {
-					ISelection selection = getCurrentViewer().getSelection();
-					if (selection instanceof StructuredSelection) {
-						Object object = ((StructuredSelection) selection)
-								.getFirstElement();
-						if (!(object instanceof DocumentEditPart)) {
-							// "delete node"
-							command = new DeleteNodeCommand(
-									(IHTMLGraphicalViewer) getCurrentViewer());
-						}
-					}
-				}
-				if (command == null) {
-					// "delete"
-					command = new DeleteCommand(true,
-							(IHTMLGraphicalViewer) this.getCurrentViewer()); //$NON-NLS-1$
-				}
-			} else {
-				// "cut"
-				command = new CutCommand((IHTMLGraphicalViewer) this
-						.getCurrentViewer()); //$NON-NLS-1$
-				e.doit = false;
-			}
-			break;
-		case SWT.BS:
-			// "delete"
-			command = new DeleteCommand(false, (IHTMLGraphicalViewer) this
-					.getCurrentViewer()); //$NON-NLS-1$
-			e.doit = false;
-			break;
-		case SWT.INSERT:
-			if ((e.stateMask & SWT.SHIFT) != 0) {
-				// "paste"
-				command = new PasteCommand((IHTMLGraphicalViewer) this
-						.getCurrentViewer()); //$NON-NLS-1$
-				e.doit = false;
-				break;
-			} else if ((e.stateMask & SWT.CONTROL) != 0) {
-				// "copy"
-				command = new CopyCommand((IHTMLGraphicalViewer) this
-						.getCurrentViewer()); //$NON-NLS-1$
-				e.doit = false;
-				break;
-			}
-			break;
-		case SWT.LF:
-		case SWT.CR:
-			// "insert"
-			keyCode = new KeyboardData(e.character, e.stateMask,
-					(IHTMLGraphicalViewer) getCurrentViewer());
-			command = new InsertCommand(
-					PageDesignerResources.getInstance().getString(
-							"RangeSelectionTool.CommandLabel.Insert"), (IHTMLGraphicalViewer) this.getCurrentViewer(), keyCode); //$NON-NLS-1$
-			e.doit = false;
-			break;
-		default:
-			if (e.keyCode == 'a' && (e.stateMask & SWT.CTRL) != 0) {
-				command = new SelectAllCommand("selectAll",
-						(IHTMLGraphicalViewer) this.getCurrentViewer());
-				e.doit = false;
-			} else {
-				if (getCurrentViewer() instanceof IHTMLGraphicalViewer
-						&& ((IHTMLGraphicalViewer) getCurrentViewer())
-								.isInRangeMode()
-						&& (!Character.isIdentifierIgnorable(e.character) && !Character
-								.isISOControl(e.character))
-						|| (e.character == '\r')) {
-					keyCode = new KeyboardData(e.character, e.stateMask,
-							(IHTMLGraphicalViewer) getCurrentViewer());
-					// "insert"
-					command = new InsertCommand(
-							PageDesignerResources.getInstance().getString(
-									"RangeSelectionTool.CommandLabel.Insert"), (IHTMLGraphicalViewer) this.getCurrentViewer(), keyCode); //$NON-NLS-1$
-					e.doit = false;
-					break;
-				}
-                return super.handleKeyDown(e);
-			}
-		}
-		if (command != null) {
-			command.execute();
-			e.doit = false;
-			if (command instanceof ICaretPositionMover) {
-				if (getCurrentViewer() instanceof IHTMLGraphicalViewer) {
-					((IHTMLGraphicalViewer) getCurrentViewer())
-							.updateHorizontalPos();
-				}
-			}
-			return true;
-		}
-		return false;
-	}
-
-	// /**
-	// * @param e
-	// * @return
-	// */
-	// protected boolean handleRangeModeKeyDown(KeyEvent e)
-	// {
-	// if (e.keyCode == SWT.SHIFT || e.keyCode == SWT.CONTROL || e.keyCode ==
-	// SWT.ALT)
-	// {
-	// return false;
-	// }
-	//
-	// dumpKey(e);
-	// Command command = null;
-	// switch (e.keyCode)
-	// {
-	// case SWT.ARROW_LEFT:
-	// command = new HorizontalMoveCommand((IHTMLGraphicalViewer)
-	// this.getCurrentViewer(), false,
-	// (e.stateMask & SWT.SHIFT) != 0);
-	// break;
-	// case SWT.ARROW_RIGHT:
-	// command = new HorizontalMoveCommand((IHTMLGraphicalViewer)
-	// this.getCurrentViewer(), true,
-	// (e.stateMask & SWT.SHIFT) != 0);
-	// break;
-	//
-	// }
-	// if (command != null)
-	// {
-	// command.execute();
-	// return true;
-	// }
-	//
-	// char content = e.character;
-	//
-	// // when reach here, should be standard content keys.
-	// return handleRangeModeContentChar(content);
-	// }
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.SelectionTool#createHoverRequest()
-	 */
-	protected void createHoverRequest() {
-		this._hoverRequest = new LocationModifierRequest();
-		_hoverRequest.setType(RequestConstants.REQ_SELECTION_HOVER);
-	}
-
-	protected Request getTargetHoverRequest() {
-		if (_hoverRequest == null) {
-			createHoverRequest();
-		}
-		return _hoverRequest;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.tools.SelectionTool#updateHoverRequest()
-	 */
-	protected void updateHoverRequest() {
-		LocationModifierRequest request = (LocationModifierRequest) getTargetHoverRequest();
-		request.setLocation(getLocation());
-		request.setControlKeyPressed(getCurrentInput().isControlKeyDown());
-	}
-
-    /* 
-     * If the target edit part is a NodeEditPart, then inform it if of the current
-     * drag status before calling its hover feedback
-     */
-    protected void showHoverFeedback() 
-    {
-        if (getTargetEditPart() instanceof NodeEditPart)
-        {
-            ((NodeEditPart)getTargetEditPart())
-                .setDragActive(
-                        isInState(STATE_DRAG_IN_PROGRESS 
-                                | STATE_ACCESSIBLE_DRAG_IN_PROGRESS 
-                                | STATE_DRAG));
-        }
-        super.showHoverFeedback();
-    }
-
-    // TODO : this method is for debug purposes and should
-    // be removed in production
-//    protected boolean updateTargetUnderMouse() {
-//        EditPart editPart = getTargetEditPart();
-//        boolean retValue =  super.updateTargetUnderMouse();
-//        if (getTargetEditPart() != editPart)
-//        {
-//            System.out.println("New target editpart:  "+getTargetEditPart()+" Old edit part: "+editPart);
-//        }
-//        return retValue;
-//    }
-
-    protected boolean handleMove() {
-        boolean handled =  super.handleMove();
-        EditPart targetEditPart = getTargetEditPart();
-        
-        if (isInState(STATE_INITIAL)
-                && targetEditPart instanceof NodeEditPart)
-        {
-            LocationRequest request = new LocationRequest(org.eclipse.jst.pagedesigner.requests.PageDesignerRequestConstants.REQ_SELECTION_TRACKER);
-            request.setLocation(getLocation());
-            DragTracker selectionTracker = targetEditPart.getDragTracker(request);
-            setDragTracker(selectionTracker);
-        }
-        
-        return handled;
-    }
-
-    protected Cursor calculateCursor() {
-        EditPart targetEditPart = getTargetEditPart();
-        if (isInState(STATE_INITIAL)
-               && targetEditPart instanceof NodeEditPart)
-        {
-            final Cursor  nodeCursor = 
-                ((NodeEditPart)targetEditPart).getCursor(getLocation());
-            
-            // if the edit part specified a custom cursor and there is no
-            // active drag tracker (which would otherwise manage cursor)
-            // then set the custom cursor
-            // if we fall-through, the default behaviour will be used
-            if (nodeCursor != null
-                    && getDragTracker() == null)
-            {
-                return nodeCursor;
-            }
-        }
-        // otherwise, use super's defaults
-        return super.calculateCursor();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/CommonResourceDialog.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/CommonResourceDialog.java
deleted file mode 100644
index c714b34..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/CommonResourceDialog.java
+++ /dev/null
@@ -1,403 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.common;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.WebrootUtil;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.editors.pagedesigner.PageDesignerResources;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.model.WorkbenchLabelProvider;
-
-/**
- * This dialog shows IFile type resources within a IProject domain for
- * selection. The client can prvide the suffixs of files to filter when
- * candidates are shown on the tree,
- * 
- * TODO: dead?
- * 
- * @author mengbo
- */
-class CommonResourceDialog extends TreeViewerSelectionDialog {
-	private static final int WEBROOT_FOLDER_DEPTH = 2;
-
-	// CommonResourceDialog.statusMessage = Please select an image file
-	private static final String STATUS_MESSAGE = PageDesignerResources
-			.getInstance().getString("CommonResourceDialog.statusMessage"); //$NON-NLS-1$
-
-	private String _suffixs[] = null;
-
-	private CommonResourceFilter _filter;
-
-	/** Create the logger for this class */
-	private static Logger _log = PDPlugin.getLogger(CommonResourceDialog.class);
-
-	// The content provider
-	class ProjectFileDialogContentProvider implements ITreeContentProvider {
-		/**
-		 * The visual part that is using this content provider is about to be
-		 * disposed. Deallocate all allocated SWT resources.
-		 */
-		public void dispose() {
-            // do nothing
-		}
-
-		/**
-		 * @see ITreeContentProvider#getChildren
-		 */
-		public Object[] getChildren(Object element) {
-			if (element instanceof IWorkspace) {
-				IWorkspaceRoot root = ((IWorkspace) element).getRoot();
-				IProject[] projects = root.getProjects();
-				return projects;
-			} else if (element instanceof IContainer) {
-				if (element instanceof IProject) {
-					IContainer container = (IContainer) element;
-					if (container.isAccessible()) {
-						try {
-							IResource[] members = container.members();
-							return members;
-						} catch (CoreException e) {
-							// "Error.CommonResourceDialog.0.1" = "Error in
-							// project memeber querying"
-							// "Error.CommonResourceDialog.0.2" = "Please refer
-							// to the log for details"
-							PDPlugin
-									.getAlerts()
-									.error(
-											"Error.CommonResourceDialog.0.1", "Error.CommonResourceDialog.0.2"); //$NON-NLS-1$ //$NON-NLS-2$
-							// Error.ProjectFileDialogContentProvider.0 = Core
-							// error, you may need to restart the application
-							_log
-									.error(
-											"Error.ProjectFileDialogContentProvider.0", e); //$NON-NLS-1$
-						}
-					}
-				} else if (element instanceof IFolder) {
-					// Process the folder container
-					IContainer container = (IContainer) element;
-					if (container.isAccessible()) {
-						try {
-							// Filter all the files under the project and only
-							// show
-							// the folder in the container selection dialog
-							List children = new ArrayList();
-							IResource[] members = container.members();
-							for (int i = 0; i < members.length; i++) {
-								if (!members[i].getName().equals(
-										IFileFolderConstants.FOLDER_WEBINF)
-										&& !members[i]
-												.getName()
-												.equals(
-														IFileFolderConstants.FOLDER_METAINF)) {
-									children.add(members[i]);
-								}
-							}
-							return children.toArray();
-						} catch (CoreException e) {
-							// "Error.CommonResourceDialog.0.1" = "Error in
-							// project memeber querying"
-							// "Error.CommonResourceDialog.0.2" = "Please refer
-							// to the log for details"
-							PDPlugin
-									.getAlerts()
-									.error(
-											"Error.CommonResourceDialog.0.1", "Error.CommonResourceDialog.0.2"); //$NON-NLS-1$ //$NON-NLS-2$
-							// Error.ProjectFileDialogContentProvider.0 = core
-							// error, you may need to restart the application
-							_log
-									.error(
-											"Error.ProjectFileDialogContentProvider.0", e); //$NON-NLS-1$
-						}
-					}
-				}
-			}
-			return new Object[0];
-		}
-
-		/**
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements
-		 */
-		public Object[] getElements(Object element) {
-			return getChildren(element);
-		}
-
-		/**
-		 * @see ITreeContentProvider#getParent
-		 */
-		public Object getParent(Object element) {
-			if (element instanceof IResource) {
-				return ((IResource) element).getParent();
-			}
-			return null;
-		}
-
-		/**
-		 * @see org.eclipse.jface.viewers.ITreeContentProvider#hasChildren
-		 */
-		public boolean hasChildren(Object element) {
-			return getChildren(element).length > 0;
-		}
-
-		/**
-		 * @see org.eclipse.jface.viewers.IContentProvider#inputChanged
-		 */
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-            // do nothing
-		}
-
-	}
-
-	// The default resource filter
-	static class CommonResourceFilter extends ViewerFilter {
-		private String _suffixs[] = { IFileFolderConstants.EXT_PROPERTIES };
-
-		private Logger _mylog = PDPlugin.getLogger(CommonResourceFilter.class);
-
-		private IProject _project;
-
-		/**
-		 * @return Returns the _suffixs.
-		 */
-		public String[] getSuffixs() {
-			return _suffixs;
-		}
-
-		/**
-		 * @param _suffixs
-		 *            The _suffixs to set.
-		 */
-		public void setSuffixs(String[] _suffixs) {
-			this._suffixs = _suffixs;
-		}
-
-		/**
-		 * @param project
-		 */
-		public CommonResourceFilter(IProject project) {
-			_project = project;
-		}
-
-		/**
-		 * @param project
-		 *            The _project to set.
-		 */
-		public void setProject(IProject project) {
-			this._project = project;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer,
-		 *      java.lang.Object, java.lang.Object)
-		 */
-		public boolean select(Viewer viewer, Object parentElement,
-				Object element) {
-			// TODO: This logic can be improved by add caching mechanism
-			if (element instanceof IWorkspace) {
-				return true;
-			} else if (element instanceof IFile) {
-				if (Arrays.asList(_suffixs).contains(
-						((IFile) element).getFileExtension())) {
-					return true;
-				}
-			} else if (element instanceof IContainer) {
-				if (!((IContainer) element).isAccessible()) {
-					return false;
-				}
-				if (element instanceof IProject) {
-					IProject container = (IProject) element;
-					if (isWebAppProject(container)
-							&& this.isSameProject(container, _project)) {
-						return true;
-					}
-                    return false;
-				} else if (element instanceof IFolder) {
-					IContainer container = (IContainer) element;
-					try {
-						if (container.getName().equals(
-								IFileFolderConstants.FOLDER_WEBINF)
-								|| container.getName().equals(
-										IFileFolderConstants.FOLDER_METAINF)) {
-							return false;
-						}
-						IResource[] members = container.members();
-						for (int i = 0; i < members.length; i++) {
-							{
-								if (select(viewer, members[i].getParent(),
-										members[i])) {
-									return true;
-								}
-							}
-						}
-					} catch (CoreException e) {
-						// "Error.ImgFileFilter.0" = "Error in filtering the
-						// tree", "Error.ImgFileFilter.2 = ""CoreException is
-						// thrown, please refer to error log for details"
-						// "Error.ProjectFileDialogContentProvider.0" = core
-						// error, show alert dialog to user.
-						PDPlugin
-								.getAlerts()
-								.detailError(
-										"Error.ImgFileFilter.0", "Error.ImgFileFilter.2"); //$NON-NLS-2$
-						_mylog.error(
-								"Error.ProjectFileDialogContentProvider.0", e); //$NON-NLS-1$
-						return false;
-					}
-				}
-			}
-			// we don't select any other types of resources.
-			return false;
-		}
-
-		/**
-		 * Determines if a project is a Web Application project by the presence
-		 * of an associated Web Application Nature.
-		 * 
-		 * @return boolean - True, when project is a Web Application project
-		 */
-		private boolean isWebAppProject(IProject project) {
-			return WebrootUtil.isValidWebProject(project);
-		}
-
-		private boolean isSameProject(IProject orig, IProject dst) {
-			String currentProjectName = orig.getFullPath()
-					.toString().trim();
-			String projectName = dst.getFullPath().toString().trim();
-			return projectName.equalsIgnoreCase(currentProjectName);
-		}
-	}
-
-	/**
-	 * This is a dialog for common resource selection, the resouce supported
-	 * include IFolder, IProject, IFile, user can provide
-	 * 
-	 * @param parentShell
-	 * @param project
-	 */
-	public CommonResourceDialog(Shell parentShell, IProject project) {
-		super(parentShell, STATUS_MESSAGE);
-		setContentProvider(new ProjectFileDialogContentProvider());
-		setLabelProvider(WorkbenchLabelProvider
-				.getDecoratingWorkbenchLabelProvider());
-		_filter = new CommonResourceFilter(project);
-		setFilter(_filter);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.ui.common.SelectionTreeViewerDialog#findInputElement()
-	 */
-	protected Object findInputElement() {
-		return ResourcesPlugin.getWorkspace();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.ui.common.SelectionTreeViewerDialog#isValidSelection(java.lang.Object)
-	 */
-	protected boolean isValidSelection(Object selection) {
-		if (getContainerFullPath(selection) == null) {
-			return false;
-		}
-        int depth = getContainerFullPath(selection).segmentCount();
-        // The location is within WEBROOT PATH?
-        if ((selection instanceof IFile) && depth >= WEBROOT_FOLDER_DEPTH) {
-        	// Null means no filter is set
-        	if (_suffixs == null) {
-        		return true;
-        	}
-        	// The extension is supported?
-        	else if (_suffixs != null
-        			&& Arrays.asList(_suffixs).contains(
-        					((IFile) selection).getFileExtension())) {
-        		return true;
-        	}
-        }
-        // None of above conditions, invalid.
-        return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.dialogs.SelectionDialog#getResult()
-	 */
-	public Object[] getResult() {
-		Object[] objects = super.getResult();
-		if (objects == null || objects.length == 0) {
-			return null;
-		}
-		// Only one element is set by us.
-		IPath returnValue = getWebRelatedPath(objects[0]);
-		if (returnValue != null) {
-			if (!(returnValue.toString().startsWith(
-					IFileFolderConstants.PATH_SEPARATOR) || returnValue
-					.toString().startsWith("\\"))) {
-				Path tempPath = new Path(IFileFolderConstants.PATH_SEPARATOR
-						+ returnValue.toString());
-				returnValue = tempPath;
-			}
-		}
-		return new Object[] { returnValue };
-	}
-
-	private IPath getContainerFullPath(Object _selectedElement) {
-		if (_selectedElement == null) {
-			return null;
-		} else if (_selectedElement instanceof IContainer) {
-			return ((IContainer) _selectedElement).getFullPath();
-		} else if (_selectedElement instanceof IFile) {
-			return ((IFile) _selectedElement).getFullPath();
-		}
-		return null;
-	}
-
-	private IPath getWebRelatedPath(Object _selectedElement) {
-		IPath result = null;
-		if (_selectedElement == null) {
-			return null;
-		} else if (_selectedElement instanceof IContainer) {
-			result = ((IContainer) _selectedElement).getFullPath();
-		} else if (_selectedElement instanceof IFile) {
-			result = ((IFile) _selectedElement).getFullPath();
-		}
-		if (result != null) {
-			if (result.segmentCount() > 2) {
-				result = result.removeFirstSegments(2);
-			}
-		}
-		return result;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/PartActivationHandler.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/PartActivationHandler.java
deleted file mode 100644
index e6bc799..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/PartActivationHandler.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.common;
-
-import org.eclipse.swt.events.ShellAdapter;
-import org.eclipse.swt.events.ShellEvent;
-import org.eclipse.ui.IPartListener;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * @author mengbo
- */
-public abstract class PartActivationHandler extends ShellAdapter implements
-		IPartListener {
-	private IWorkbenchPart _activePart;
-
-	private boolean _isHandlingActivation = false;
-
-	private IWorkbenchPart _trace;
-
-	/**
-	 * @param part
-	 */
-	public PartActivationHandler(IWorkbenchPart part) {
-		_trace = part;
-	}
-
-	/**
-	 * this method is called when the specified part is activated.
-	 */
-	public abstract void handleActivation();
-
-	private void internalHandleActivation() {
-
-		if (_isHandlingActivation)
-			return;
-
-		if (_activePart == _trace) {
-			_isHandlingActivation = true;
-			try {
-				handleActivation();
-			} finally {
-				_isHandlingActivation = false;
-			}
-		}
-	}
-
-	/**
-	 * @see IPartListener#partActivated(IWorkbenchPart)
-	 */
-	public void partActivated(IWorkbenchPart part) {
-		_activePart = part;
-		internalHandleActivation();
-	}
-
-	/**
-	 * @see IPartListener#partBroughtToTop(IWorkbenchPart)
-	 */
-	public void partBroughtToTop(IWorkbenchPart part) {
-        // do nothing
-	}
-
-	/**
-	 * @see IPartListener#partClosed(IWorkbenchPart)
-	 */
-	public void partClosed(IWorkbenchPart part) {
-        // do nothing
-	}
-
-	/**
-	 * @see IPartListener#partDeactivated(IWorkbenchPart)
-	 */
-	public void partDeactivated(IWorkbenchPart part) {
-		_activePart = null;
-	}
-
-	/**
-	 * @see IPartListener#partOpened(IWorkbenchPart)
-	 */
-	public void partOpened(IWorkbenchPart part) {
-        // do nothing
-	}
-
-	/*
-	 * @see ShellListener#shellActivated(ShellEvent)
-	 */
-	public void shellActivated(ShellEvent e) {
-		internalHandleActivation();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/ResourceOnClasspathDialog.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/ResourceOnClasspathDialog.java
deleted file mode 100644
index 6a53826..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/ResourceOnClasspathDialog.java
+++ /dev/null
@@ -1,255 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.common;
-
-import java.io.File;
-import java.util.Arrays;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jdt.core.IJarEntryResource;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.ui.JavaElementLabelProvider;
-import org.eclipse.jdt.ui.StandardJavaElementContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.pagedesigner.editors.pagedesigner.PageDesignerResources;
-import org.eclipse.jst.pagedesigner.utils.JavaUtil;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * This dialog will let client to select resources that located on a
- * IJavaProject classpath, the client can provide a list of files suffixs to
- * filter.
- * 
- * @author mengbo
- */
-// TODO: Since many jar files might do nothing to do with client's selection, we
-// may need to provides more filter choice
-// to clients to exclude unnecessary jar files, such as that are located in JDK
-// dir.
-public class ResourceOnClasspathDialog extends TreeViewerSelectionDialog {
-	// ResourcesOnClasspathDialog.statusMessage = Please select a property file
-	private static final String STATUS_MESSAGE = PageDesignerResources
-			.getInstance()
-			.getString("ResourcesOnClasspathDialog.statusMessage"); //$NON-NLS-1$
-
-	private IJavaProject _javaProject;
-
-	// the suffixs of files that can be selected
-	private String _suffixs[]; // =
-
-	// IJMTConstants.DEFAULT_SUFFIX;
-
-	private ResourceOnClasspathFilter _filter;
-
-	// Client doesn't need to know it.
-	class ResourceOnClasspathFilter extends ViewerFilter {
-		StandardJavaElementContentProvider _javaContentProvider;
-
-		/**
-		 * @param contentProvider
-		 */
-		public ResourceOnClasspathFilter(
-				StandardJavaElementContentProvider contentProvider) {
-			_javaContentProvider = contentProvider;
-		}
-
-		/**
-		 * Set the suffixs of files need to be selected.
-		 * 
-		 * @param suffixs
-		 */
-		public void setSuffixs(String suffixs[]) {
-			_suffixs = suffixs;
-		}
-
-		/**
-		 * @param contentProvider
-		 *            The _javaContentProvider to set.
-		 */
-		public void setJavaContentProvider(
-				StandardJavaElementContentProvider contentProvider) {
-			_javaContentProvider = contentProvider;
-		}
-
-		/**
-		 * @param project
-		 *            The _javaProject to set.
-		 */
-		public void setJavaProject(IJavaProject project) {
-			_javaProject = project;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jface.viewers.ViewerFilter#select(org.eclipse.jface.viewers.Viewer,
-		 *      java.lang.Object, java.lang.Object)
-		 */
-		public boolean select(Viewer viewer, Object parentElement,
-				Object element) {
-			// TODO: This logic can be improved by add caching mechanism
-			if (element instanceof IJavaProject) {
-				String currentProjectName = ((IJavaProject) element)
-						.getProject().getFullPath().toString().trim();
-				String projectName = _javaProject.getProject().getFullPath()
-						.toString().trim();
-				if (projectName.equalsIgnoreCase(currentProjectName)) {
-					return true;
-				}
-                return false;
-			} else if (element instanceof IResource) {
-				if (((_javaProject != null) && !_javaProject
-						.isOnClasspath((IResource) element))) {
-					return false;
-				}
-				if (element instanceof IFile) {
-					if (Arrays.asList(_suffixs).contains(
-							((IFile) element).getFileExtension())) {
-						return true;
-					}
-				}
-				return false;
-			}
-
-			if (element instanceof IJarEntryResource) {
-				String ext = ((IJarEntryResource) element).getFullPath()
-						.getFileExtension();
-				if (ext != null && Arrays.asList(_suffixs).contains(ext)) {
-					return true;
-				}
-                return false;
-			}
-			if (!(element instanceof IJavaElement)) {
-				return false;
-			}
-			if (((_javaProject != null) && !_javaProject
-					.isOnClasspath((IJavaElement) element))) {
-				return false;
-			}
-			IJavaElement javaElement = (IJavaElement) element;
-			Object[] children = null;
-			switch (javaElement.getElementType()) {
-			case IJavaElement.PACKAGE_FRAGMENT_ROOT:
-				children = _javaContentProvider.getChildren(javaElement);
-				break;
-			case IJavaElement.IMPORT_CONTAINER:
-				return true;
-			case IJavaElement.PACKAGE_FRAGMENT:
-				children = _javaContentProvider.getChildren(javaElement);
-				break;
-			case IJavaElement.CLASS_FILE:
-				if (Arrays.asList(_suffixs).contains(
-						IFileFolderConstants.EXT_CLASS)) {
-					return true;
-				} 
-				return false;
-			case IJavaElement.COMPILATION_UNIT:
-				String ext = javaElement.getPath().getFileExtension();
-				if (ext != null && Arrays.asList(_suffixs).contains(ext)) {
-					return true;
-				} 
-				return false;
-			default:
-				return false;
-			}
-
-			for (int i = 0; i < children.length; i++) {
-				if (select(viewer, javaElement, children[i])) {
-					return true;
-				}
-			}
-			// Either the resouce or its children are not for displaying.
-			return false;
-		}
-	}
-
-	/**
-	 * Set the suffixs of files need to be selected.
-	 * 
-	 * @param suffixs
-	 */
-	public void setSuffixs(String suffixs[]) {
-		_suffixs = suffixs;
-		_filter.setSuffixs(suffixs);
-	}
-
-	/**
-	 * @param parentShell
-	 * @param project
-	 */
-	public ResourceOnClasspathDialog(Shell parentShell, IJavaProject project) {
-		super(parentShell, STATUS_MESSAGE);
-		// set provider and filter
-		StandardJavaElementContentProvider contentProvider = new StandardJavaElementContentProvider();
-		setContentProvider(contentProvider);
-		setLabelProvider(new JavaElementLabelProvider());
-		_filter = new ResourceOnClasspathFilter(contentProvider);
-		setFilter(_filter);
-		// store the project
-		_javaProject = project;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.dialogs.SelectionDialog#getResult()
-	 */
-	public Object[] getResult() {
-		Object[] objects = super.getResult();
-		if (objects == null || objects.length == 0) {
-			return null;
-		}
-		IPath path = JavaUtil.getPathOnClasspath(_javaProject, objects[0]);
-		String result = null;
-		if (path.segmentCount() == 0) {
-			return new Object[] { "" };
-		}
-		path = path.removeFileExtension();
-		result = path.toOSString();
-		result = result.replace(File.separatorChar, '.');
-		return new Object[] { result };
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.ui.common.SelectionTreeViewerDialog#isValidSelection()
-	 */
-	protected boolean isValidSelection(Object selection) {
-		String extension = JavaUtil.getPathOnClasspath(_javaProject, selection)
-				.getFileExtension();
-		return (extension != null && Arrays.asList(_suffixs)
-				.contains(extension));
-	}
-
-	protected Object findInputElement() {
-		Object input = ResourcesPlugin.getWorkspace();
-		if (input instanceof IWorkspace) {
-			return JavaCore.create(((IWorkspace) input).getRoot());
-		} else if (input instanceof IContainer) {
-			IJavaElement element = JavaCore.create((IContainer) input);
-			if (element != null && element.exists())
-				return element;
-			return input;
-		}
-		return JavaCore.create(ResourcesPlugin.getWorkspace().getRoot());
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/TreeViewerSelectionDialog.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/TreeViewerSelectionDialog.java
deleted file mode 100644
index 97aa367..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/TreeViewerSelectionDialog.java
+++ /dev/null
@@ -1,328 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.common;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.SWTUtils;
-import org.eclipse.jst.pagedesigner.editors.pagedesigner.PageDesignerResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.dialogs.SelectionDialog;
-import org.eclipse.ui.part.DrillDownComposite;
-
-/**
- * This is a base dialog that uses TreeViewer to show selections, subclass needs
- * to provide IContentProvider, ILabelProvider and ViewerFilter for the
- * TreeViewer. Subclass needs to implement isValidSelection(), which valids the
- * selection, and findInputElement() which provides the root element of the
- * tree. Besides, subclass might need to implement getResult() to return a
- * customized result.
- * 
- * @author mengbo
- */
-abstract class TreeViewerSelectionDialog extends SelectionDialog {
-	// = "Select a file"
-	private static final String DEFAULT_TITLE = PageDesignerResources
-			.getInstance().getString("TreeViewerSelectionDialog.Title"); //$NON-NLS-1$
-
-	/** Used to tag the image type */
-	static final int STYLE_NONE = 0;
-
-	static final int STYLE_INFORMATION = 1;
-
-	static final int STYLE_ERROR = 2;
-
-	static final int STYLE_WARNING = 3;
-
-	/** Sizi of the TreeViewer composite */
-	private static final int SIZING_SELECTION_PANE_HEIGHT = 300;
-
-	private static final int SIZING_SELECTION_PANE_WIDTH = 320;
-
-	private String _title = DEFAULT_TITLE;
-
-	// the seleciton on the treeviewer.
-	private static Object _selection;
-
-	// providers
-	private ITreeContentProvider _contentProvider;
-
-	private ILabelProvider _labelProvider;
-
-	private ViewerFilter _filter;
-
-	/** The validation image */
-	private Label _statusImage;
-
-	/** The validation message */
-	private Label _statusLabel;
-
-	private String _statusMessage;
-
-	// private IJavaProject _project;
-	/** The selection tree */
-	private TreeViewer _treeViewer;
-
-	/**
-	 * @param parentShell
-	 * @param statusMessage 
-	 */
-	public TreeViewerSelectionDialog(Shell parentShell, String statusMessage) {
-		super(parentShell);
-		_statusMessage = statusMessage;
-		// ? need SWT.RESIZE
-		setShellStyle(getShellStyle());
-	}
-
-	/**
-	 * Returns a new drill down viewer for this dialog.
-	 * @param parent 
-	 * 
-	 */
-	protected void createTreeViewer(Composite parent) {
-		// Create drill down
-		DrillDownComposite drillDown = new DrillDownComposite(parent,
-				SWT.BORDER);
-		GridData spec = new GridData(GridData.VERTICAL_ALIGN_FILL
-				| GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL
-				| GridData.GRAB_VERTICAL);
-		spec.widthHint = SIZING_SELECTION_PANE_WIDTH;
-		spec.heightHint = SIZING_SELECTION_PANE_HEIGHT;
-		drillDown.setLayoutData(spec);
-		_treeViewer = new TreeViewer(drillDown, SWT.NONE);
-		drillDown.setChildTree(_treeViewer);
-	}
-
-	private void setTreeViewerProviders() {
-		_treeViewer.setContentProvider(_contentProvider);
-		_treeViewer.setLabelProvider(_labelProvider);
-		_treeViewer.setSorter(new ViewerSorter());
-		_treeViewer
-				.addSelectionChangedListener(new ISelectionChangedListener() {
-					public void selectionChanged(SelectionChangedEvent event) {
-						_selection = getSelectedElement((IStructuredSelection) event
-								.getSelection());
-						updateStatus();
-					}
-				});
-		_treeViewer.addDoubleClickListener(new IDoubleClickListener() {
-			public void doubleClick(DoubleClickEvent event) {
-				ISelection selection = event.getSelection();
-				if (selection instanceof IStructuredSelection) {
-					Object item = ((IStructuredSelection) selection)
-							.getFirstElement();
-					if (_treeViewer.getExpandedState(item)) {
-						_treeViewer.collapseToLevel(item, 1);
-					} else {
-						_treeViewer.expandToLevel(item, 1);
-					}
-				}
-			}
-		});
-		_treeViewer.setInput(findInputElement());
-
-		if (_filter != null) {
-			// Assert.isLegal(_contentProvider instanceof
-			// StandardJavaElementContentProvider);
-			_treeViewer.addFilter(_filter);
-		}
-
-	}
-
-	/**
-	 * Creates the contents of the composite.
-	 * @param parent 
-	 */
-	public void createTreeViewerComposite(Composite parent) {
-		Composite treeViewerComposite = new Composite(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.marginWidth = 0;
-		treeViewerComposite.setLayout(layout);
-		GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
-		gridData.horizontalSpan = 2;
-		treeViewerComposite.setLayoutData(gridData);
-		Label label = new Label(treeViewerComposite, SWT.WRAP);
-		label.setText(_title);
-		label.setFont(treeViewerComposite.getFont());
-		createTreeViewer(treeViewerComposite);
-		Dialog.applyDialogFont(treeViewerComposite);
-	}
-
-	/**
-	 * Sets the selected existing container.
-	 * 
-	 * @param selection -
-	 *            the current selected container.
-	 */
-	public void setSelectedElement(Object selection) {
-		// Expand to and select the specified container
-		if (_selection != null) {
-			_treeViewer.expandToLevel(_selection, 1);
-		}
-		List itemsToExpand = new ArrayList();
-		Object parent = _contentProvider.getParent(selection);
-		if (parent == null) {
-			return;
-		}
-		while (parent != null) {
-			itemsToExpand.add(0, parent);
-			parent = _contentProvider.getParent(parent);
-		}
-		_treeViewer.setExpandedElements(itemsToExpand.toArray());
-		_treeViewer.setSelection(new StructuredSelection(selection), true);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on Dialog.
-	 */
-	protected Control createDialogArea(Composite parent) {
-		Composite area = (Composite) super.createDialogArea(parent);
-		GridLayout gridLayout = new GridLayout();
-		gridLayout.numColumns = 2;
-		area.setLayout(gridLayout);
-
-		// Container treeviewer composite
-		createTreeViewerComposite(area);
-
-		_statusImage = SWTUtils.createLabelImage(area,
-				getMessageImage(STYLE_ERROR), 1, null);
-		_statusLabel = SWTUtils.createLabel(area, "", 1);
-		// Link to model
-		setTreeViewerProviders();
-
-		return dialogArea;
-	}
-
-	private Object getSelectedElement(IStructuredSelection selection) {
-		return selection.getFirstElement();
-	}
-
-	/**
-	 * @param provider
-	 *            The _contentProvider to set.
-	 */
-	public void setContentProvider(ITreeContentProvider provider) {
-		_contentProvider = provider;
-	}
-
-	/**
-	 * @param provider
-	 *            The _labelProvider to set.
-	 */
-	public void setLabelProvider(ILabelProvider provider) {
-		_labelProvider = provider;
-	}
-
-	/**
-	 * @param filter
-	 *            The _filter to set.
-	 */
-	public void setFilter(ViewerFilter filter) {
-		this._filter = filter;
-	}
-
-
-	/**
-	 * Update the status message
-	 */
-	private void updateStatus() {
-		if (isValidSelection(_selection)) {
-			_statusImage.setImage(getMessageImage(STYLE_NONE));
-			_statusLabel.setText("");
-			getOkButton().setEnabled(true);
-		} else {
-			_statusImage.setImage(getMessageImage(STYLE_ERROR));
-			_statusLabel.setText(_statusMessage);
-			getOkButton().setEnabled(false);
-		}
-	}
-
-	/**
-	 * Get the different message according the message type.
-	 * 
-	 * @param imageType 
-	 * 
-	 * @return Image - the message image
-	 */
-	protected Image getMessageImage(int imageType) {
-		switch (imageType) {
-		case STYLE_ERROR:
-			return JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_ERROR);
-		case STYLE_WARNING:
-			return JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_WARNING);
-		case STYLE_INFORMATION:
-			return JFaceResources.getImage(Dialog.DLG_IMG_MESSAGE_INFO);
-		default:
-			return null;
-		}
-	}
-
-	/**
-	 * The <code>ContainerSelectionDialog</code> implementation of this
-	 * <code>Dialog</code> method builds a list of the selected resource
-	 * containers for later retrieval by the client and closes this dialog.
-	 */
-	protected void okPressed() {
-		List chosenContainerPathList = new ArrayList();
-		if (_selection != null) {
-			chosenContainerPathList.add(_selection);
-		}
-		setResult(chosenContainerPathList);
-		super.okPressed();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.window.Window#createContents(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		Control control = super.createContents(parent);
-		if (_selection != null) {
-			this.setSelectedElement(_selection);
-		}
-		return control;
-	}
-
-	/**
-	 * @param selection
-	 * @return true if the selection is valid
-	 */
-	protected abstract boolean isValidSelection(Object selection);
-
-	/**
-	 * @return the input element
-	 */
-	protected abstract Object findInputElement();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/sash/NestedEditorActionBarContributor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/sash/NestedEditorActionBarContributor.java
deleted file mode 100644
index 2e0a2c0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/sash/NestedEditorActionBarContributor.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.common.sash;
-
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.part.MultiPageEditorActionBarContributor;
-
-/**
- * This contributor should be used when a SashEditor is inside a multipage
- * editor.
- * 
- * @author mengbo
- * @version 1.5
- */
-public abstract class NestedEditorActionBarContributor extends
-		MultiPageEditorActionBarContributor {
-	/**
-	 * Child class should not override this method.
-	 */
-	public final void setActivePage(IEditorPart activeEditor) {
-		if (activeEditor instanceof SashEditorPart) {
-			activeEditor = ((SashEditorPart) activeEditor).getActiveEditor();
-		}
-
-		setInnerActivePage(activeEditor);
-	}
-
-	/**
-	 * Child class should override this method
-	 * 
-	 * @param activeEditor
-	 */
-	public abstract void setInnerActivePage(IEditorPart activeEditor);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/sash/SashEditorPart.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/sash/SashEditorPart.java
deleted file mode 100644
index ddaf592..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/sash/SashEditorPart.java
+++ /dev/null
@@ -1,531 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.common.sash;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.jface.util.SafeRunnable;
-import org.eclipse.jface.viewers.IPostSelectionProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jst.jsf.common.ui.internal.guiutils.SWTUtils;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.SashForm;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.ui.IEditorActionBarContributor;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IKeyBindingService;
-import org.eclipse.ui.INestableKeyBindingService;
-import org.eclipse.ui.IPropertyListener;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.part.EditorPart;
-import org.eclipse.ui.part.MultiPageEditorActionBarContributor;
-import org.eclipse.ui.part.MultiPageEditorSite;
-
-/**
- * This class emulates the MultiPageEditorPart. But instead of using multipage,
- * it use SashForm to separate the editors.
- * 
- * @author mengbo
- */
-public abstract class SashEditorPart extends EditorPart {
-	private int _orientation = SWT.VERTICAL;
-
-	private SashForm _sashForm;
-
-	/**
-	 * List of nested editors. Element type: IEditorPart. Need to hang onto them
-	 * here, in addition to using get/setData on the items, because dispose()
-	 * needs to access them, but widgetry has already been disposed at that
-	 * point.
-	 */
-	private ArrayList _nestedEditors = new ArrayList(3);
-
-	private Map _editorToComposite = new HashMap();
-
-	private IEditorPart _activeEditor = null;
-
-	/**
-	 * Creates and adds a new page containing the given editor to this
-	 * multi-page editor. The page is added at the given index. This also hooks
-	 * a property change listener on the nested editor.
-	 * 
-	 * @param editor
-	 *            the nested editor
-	 * @param input
-	 *            the input for the nested editor
-	 * @exception PartInitException
-	 *                if a new page could not be created
-	 * @see org.eclipse.ui.part.MultiPageEditorPart#handlePropertyChange(int) the handler for
-	 *      property change events from the nested editor
-	 */
-	public void addPage(final IEditorPart editor, IEditorInput input)
-			throws PartInitException {
-		IEditorSite site = createSite(editor);
-		// call init first so that if an exception is thrown, we have created no
-		// new widgets
-		editor.init(site, input);
-		final Composite parent1 = new Composite(getContainer(), SWT.NONE);
-		FillLayout fillLayout = new FillLayout();
-		fillLayout.marginWidth = fillLayout.marginHeight = 1;
-		parent1.setLayout(fillLayout);
-
-		parent1.addListener(SWT.Activate, new Listener() {
-			public void handleEvent(Event event) {
-				if (event.type == SWT.Activate) {
-					activeEditorChanged(editor);
-					parent1.setBackground(ColorConstants.green);
-				}
-			}
-		});
-		parent1.addListener(SWT.Deactivate, new Listener() {
-			public void handleEvent(Event event) {
-				parent1.setBackground(ColorConstants.titleInactiveBackground);
-			}
-		});
-		SWTUtils.workaroundResize(parent1);
-		editor.createPartControl(parent1);
-		editor.addPropertyListener(new IPropertyListener() {
-			public void propertyChanged(Object source, int propertyId) {
-				SashEditorPart.this.handlePropertyChange(propertyId);
-			}
-		});
-
-		_nestedEditors.add(editor);
-		_editorToComposite.put(editor, parent1);
-
-		connectPage(editor);
-	}
-
-	/**
-	 * @param editor
-	 */
-	protected void connectPage(IEditorPart editor) {
-		ISelectionProvider editSelectionProvider = editor.getSite()
-				.getSelectionProvider();
-		if (editSelectionProvider instanceof IPostSelectionProvider) {
-			((IPostSelectionProvider) editSelectionProvider)
-					.addPostSelectionChangedListener(new ISelectionChangedListener() {
-						public void selectionChanged(SelectionChangedEvent event) {
-							((SashEditorSelectionProvider) getSite()
-									.getSelectionProvider())
-									.firePostSelectionChanged(event);
-						}
-					});
-		} else {
-			editSelectionProvider
-					.addSelectionChangedListener(new ISelectionChangedListener() {
-
-						public void selectionChanged(SelectionChangedEvent event) {
-							((SashEditorSelectionProvider) getSite()
-									.getSelectionProvider())
-									.fireSelectionChanged(event);
-						}
-					});
-		}
-	}
-
-	/**
-	 * Creates an empty container. Creates a CTabFolder with no style bits set,
-	 * and hooks a selection listener which calls <code>pageChange()</code>
-	 * whenever the selected tab changes.
-	 * 
-	 * @param parent
-	 *            The composite in which the container tab folder should be
-	 *            created; must not be <code>null</code>.
-	 * @return a new container
-	 */
-	private SashForm createContainer(Composite parent) {
-		// use SWT.FLAT style so that an extra 1 pixel border is not reserved
-		// inside the folder
-		SashForm newContainer = new SashForm(parent, SWT.NONE);
-		SWTUtils.workaroundResize(newContainer);
-		newContainer.setOrientation(_orientation);
-		return newContainer;
-	}
-
-	/**
-	 * @throws PartInitException
-	 */
-	abstract protected void createPages() throws PartInitException;
-
-	/**
-	 * The <code>MultiPageEditor</code> implementation of this
-	 * <code>IWorkbenchPart</code> method creates the control for the
-	 * multi-page editor by calling <code>createContainer</code>, then
-	 * <code>createPages</code>. Subclasses should implement
-	 * <code>createPages</code> rather than overriding this method.
-	 * 
-	 * @param parent
-	 *            The parent in which the editor should be created; must not be
-	 *            <code>null</code>.
-	 */
-	public final void createPartControl(Composite parent) {
-		this._sashForm = createContainer(parent);
-
-		try {
-			createPages();
-		} catch (PartInitException ex) {
-			ex.printStackTrace();
-		}
-		// set the active page (page 0 by default), unless it has already been
-		// done
-		if (getActiveEditor() == null) {
-			if (!_nestedEditors.isEmpty()) {
-				setActiveEditor((IEditorPart) _nestedEditors.get(0));
-			}
-		}
-	}
-
-	/**
-	 * Creates the site for the given nested editor. The
-	 * <code>MultiPageEditorPart</code> implementation of this method creates
-	 * an instance of <code>MultiPageEditorSite</code>. Subclasses may
-	 * reimplement to create more specialized sites.
-	 * 
-	 * @param editor
-	 *            the nested editor
-	 * @return the editor site
-	 */
-	protected IEditorSite createSite(IEditorPart editor) {
-		return new SashEditorSite(this, editor);
-	}
-
-	/**
-	 * The <code>MultiPageEditorPart</code> implementation of this
-	 * <code>IWorkbenchPart</code> method disposes all nested editors.
-	 * Subclasses may extend.
-	 */
-	public void dispose() {
-		_activeEditor = null;
-		for (int i = 0; i < _nestedEditors.size(); ++i) {
-			IEditorPart editor = (IEditorPart) _nestedEditors.get(i);
-			disposePart(editor);
-		}
-		_nestedEditors.clear();
-		_editorToComposite.clear();
-	}
-
-	/**
-	 * Returns the active nested editor if there is one.
-	 * <p>
-	 * Subclasses should not override this method
-	 * </p>
-	 * 
-	 * @return the active nested editor, or <code>null</code> if none
-	 */
-	public IEditorPart getActiveEditor() {
-		return _activeEditor;
-	}
-
-	/**
-	 * Returns the composite control containing this multi-page editor's pages.
-	 * This should be used as the parent when creating controls for the
-	 * individual pages. That is, when calling <code>addPage(Control)</code>,
-	 * the passed control should be a child of this container.
-	 * <p>
-	 * Warning: Clients should not assume that the container is any particular
-	 * subclass of Composite. The actual class used may change in order to
-	 * improve the look and feel of multi-page editors. Any code making
-	 * assumptions on the particular subclass would thus be broken.
-	 * </p>
-	 * <p>
-	 * Subclasses should not override this method
-	 * </p>
-	 * 
-	 * @return the composite, or <code>null</code> if
-	 *         <code>createPartControl</code> has not been called yet
-	 */
-	protected Composite getContainer() {
-		return _sashForm;
-	}
-
-	/**
-	 * Returns the editor for the given page index. The page index must be
-	 * valid.
-	 * 
-	 * @param pageIndex
-	 *            the index of the page
-	 * @return the editor for the specified page, or <code>null</code> if the
-	 *         specified page was not created with
-	 *         <code>addPage(IEditorPart,IEditorInput)</code>
-	 */
-	protected IEditorPart getEditor(int pageIndex) {
-		return (IEditorPart) _nestedEditors.get(pageIndex);
-	}
-
-	/**
-	 * Handles a property change notification from a nested editor. The default
-	 * implementation simply forwards the change to listeners on this multi-page
-	 * editor by calling <code>firePropertyChange</code> with the same
-	 * property id. For example, if the dirty state of a nested editor changes
-	 * (property id <code>IEditorPart.PROP_DIRTY</code>), this method handles
-	 * it by firing a property change event for
-	 * <code>IEditorPart.PROP_DIRTY</code> to property listeners on this
-	 * multi-page editor.
-	 * <p>
-	 * Subclasses may extend or reimplement this method.
-	 * </p>
-	 * 
-	 * @param propertyId
-	 *            the id of the property that changed
-	 */
-	protected void handlePropertyChange(int propertyId) {
-		firePropertyChange(propertyId);
-	}
-
-	/**
-	 * The <code>MultiPageEditorPart</code> implementation of this
-	 * <code>IEditorPart</code> method sets its site to the given site, its
-	 * input to the given input, and the site's selection provider to a
-	 * <code>MultiPageSelectionProvider</code>. Subclasses may extend this
-	 * method.
-	 * 
-	 * @param site
-	 *            The site for which this part is being created; must not be
-	 *            <code>null</code>.
-	 * @param input
-	 *            The input on which this editor should be created; must not be
-	 *            <code>null</code>.
-	 * @throws PartInitException
-	 *             If the initialization of the part fails -- currently never.
-	 */
-	public void init(IEditorSite site, IEditorInput input)
-			throws PartInitException {
-		setSite(site);
-		setInput(input);
-		site.setSelectionProvider(new SashEditorSelectionProvider(this));
-	}
-
-	/**
-	 * The <code>MultiPageEditorPart</code> implementation of this
-	 * <code>IEditorPart</code> method returns whether the contents of any of
-	 * this multi-page editor's nested editors have changed since the last save.
-	 * Pages created with <code>addPage(Control)</code> are ignored.
-	 * <p>
-	 * Subclasses may extend or reimplement this method.
-	 * </p>
-	 * 
-	 * @return <code>true</code> if any of the nested editors are dirty;
-	 *         <code>false</code> otherwise.
-	 */
-	public boolean isDirty() {
-		// use nestedEditors to avoid SWT requests; see bug 12996
-		for (Iterator i = _nestedEditors.iterator(); i.hasNext();) {
-			IEditorPart editor = (IEditorPart) i.next();
-			if (editor.isDirty()) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Notifies this multi-page editor that the page with the given id has been
-	 * activated. This method is called when the user selects a different tab.
-	 * <p>
-	 * The <code>MultiPageEditorPart</code> implementation of this method sets
-	 * focus to the new page, and notifies the action bar contributor (if there
-	 * is one). This checks whether the action bar contributor is an instance of
-	 * <code>MultiPageEditorActionBarContributor</code>, and, if so, calls
-	 * <code>setActivePage</code> with the active nested editor. This also
-	 * fires a selection change event if required.
-	 * </p>
-	 * <p>
-	 * Subclasses may extend this method.
-	 * </p>
-	 * @param activeEditor 
-	 * 
-	 */
-	protected void activeEditorChanged(IEditorPart activeEditor) {
-		setActiveEditor(activeEditor);
-		setFocus();
-
-		IEditorSite site = getEditorSite();
-		while (site != null) {
-			IEditorActionBarContributor contributor = site
-					.getActionBarContributor();
-			if (contributor instanceof MultiPageEditorActionBarContributor) {
-				((MultiPageEditorActionBarContributor) contributor)
-						.setActivePage(activeEditor);
-			}
-			if (site instanceof MultiPageEditorSite) {
-				site = (IEditorSite) ((MultiPageEditorSite) site)
-						.getMultiPageEditor().getSite();
-			} else if (site instanceof SashEditorSite) {
-				site = (IEditorSite) ((SashEditorSite) site).getSashEditor()
-						.getSite();
-			} else {
-				site = null;
-			}
-		}
-
-		if (activeEditor != null) {
-			// Workaround for 1GAUS7C: ITPUI:ALL - Editor not activated when
-			// restored from previous session
-			// do not need second if once fixed
-			ISelectionProvider selectionProvider = activeEditor.getSite()
-					.getSelectionProvider();
-			if (selectionProvider != null) {
-				SelectionChangedEvent event = new SelectionChangedEvent(
-						selectionProvider, selectionProvider.getSelection());
-				((SashEditorSelectionProvider) getSite().getSelectionProvider())
-						.fireSelectionChanged(event);
-			}
-		}
-	}
-
-	/**
-	 * Disposes the given part and its site.
-	 * 
-	 * @param part
-	 *            The part to dispose; must not be <code>null</code>.
-	 */
-	private void disposePart(final IWorkbenchPart part) {
-        SafeRunner.run(new SafeRunnable() {
-			public void run() {
-				if (part.getSite() instanceof SashEditorSite) {
-					SashEditorSite partSite = (SashEditorSite) part.getSite();
-					partSite.dispose();
-				}
-				part.dispose();
-			}
-
-			public void handleException(Throwable e) {
-				// Exception has already being logged by Core. Do nothing.
-			}
-		});
-	}
-
-	/**
-	 * Sets the currently active page.
-	 * @param part
-	 * 
-	 */
-	protected void setActiveEditor(IEditorPart part) {
-		_activeEditor = part;
-	}
-
-	/**
-	 * The <code>MultiPageEditor</code> implementation of this
-	 * <code>IWorkbenchPart</code> method sets focus on the active nested
-	 * editor, if there is one.
-	 * <p>
-	 * Subclasses may extend or reimplement.
-	 * </p>
-	 */
-	public void setFocus() {
-		setFocus(getActiveEditor());
-	}
-
-	/**
-	 * Sets focus to the control for the given page. If the page has an editor,
-	 * this calls its <code>setFocus()</code> method. Otherwise, this calls
-	 * <code>setFocus</code> on the control for the page.
-	 * 
-	 * @param pageIndex
-	 *            the index of the page
-	 */
-	private void setFocus(IEditorPart editor) {
-		final IKeyBindingService service = getSite().getKeyBindingService();
-
-		if (editor == null) {
-			// There is no selected page, so deactivate the active service.
-			if (service instanceof INestableKeyBindingService) {
-				final INestableKeyBindingService nestableService = (INestableKeyBindingService) service;
-				nestableService.activateKeyBindingService(null);
-			} else {
-				//WorkbenchPlugin
-				PDPlugin
-				    .getLogger(getClass()).error("MultiPageEditorPart.setFocus()   Parent key binding service was not an instance of INestableKeyBindingService.  It was an instance of " + service.getClass().getName() + " instead."); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-			return;
-		}
-        editor.setFocus();
-        // There is no selected page, so deactivate the active service.
-        if (service instanceof INestableKeyBindingService) {
-        	final INestableKeyBindingService nestableService = (INestableKeyBindingService) service;
-        	if (editor != null) {
-        		nestableService.activateKeyBindingService(editor
-        				.getEditorSite());
-        	} else {
-        		nestableService.activateKeyBindingService(null);
-        	}
-        } else {
-            PDPlugin
-                .getLogger(getClass()).error("MultiPageEditorPart.setFocus()   Parent key binding service was not an instance of INestableKeyBindingService.  It was an instance of " + service.getClass().getName() + " instead."); //$NON-NLS-1$ //$NON-NLS-2$
-        }
-	}
-
-	public void doSave(IProgressMonitor monitor) {
-		if (_activeEditor != null) {
-			_activeEditor.doSave(monitor);
-		}
-	}
-
-	public void doSaveAs() {
-		if (_activeEditor != null) {
-			_activeEditor.doSaveAs();
-		}
-
-	}
-
-	public boolean isSaveAsAllowed() {
-		if (_activeEditor != null)
-        {
-			return _activeEditor.isSaveAsAllowed();
-        }
-		return false;
-	}
-
-	/**
-	 * @param orientation
-	 */
-	public void setOrientation(int orientation) {
-		this._orientation = orientation;
-		if (_sashForm != null && !_sashForm.isDisposed()) {
-			_sashForm.setMaximizedControl(null);
-			_sashForm.setOrientation(_orientation);
-		}
-	}
-
-	/**
-	 * @param part
-	 */
-	public void setMaximizedEditor(IEditorPart part) {
-		if (part != null) {
-			Composite c = (Composite) _editorToComposite.get(part);
-			if (c != null && _sashForm != null && !_sashForm.isDisposed()) {
-				_sashForm.setMaximizedControl(c);
-				part.setFocus();
-			}
-		} else {
-			if (_sashForm != null && !_sashForm.isDisposed()) {
-				_sashForm.setMaximizedControl(null);
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/sash/SashEditorSelectionProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/sash/SashEditorSelectionProvider.java
deleted file mode 100644
index 2f47aaa..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/sash/SashEditorSelectionProvider.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.common.sash;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.SafeRunner;
-import org.eclipse.jface.util.SafeRunnable;
-import org.eclipse.jface.viewers.IPostSelectionProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.ui.IEditorPart;
-
-/**
- * @author mengbo
- */
-public class SashEditorSelectionProvider implements IPostSelectionProvider {
-
-	/**
-	 * Registered selection changed listeners (element type:
-	 * <code>ISelectionChangedListener</code>).
-	 */
-	private ListenerList _listeners = new ListenerList(ListenerList.IDENTITY);
-
-	private ListenerList _postSelectionChangedListeners = new ListenerList(ListenerList.IDENTITY);
-
-	/**
-	 * The multi-page editor.
-	 */
-	private SashEditorPart _sashEditor;
-
-	/**
-	 * Creates a selection provider for the given multi-page editor.
-	 * 
-	 * @param sashEditor
-	 *            the multi-page editor
-	 */
-	public SashEditorSelectionProvider(SashEditorPart sashEditor) {
-		Assert.isNotNull(sashEditor);
-		this._sashEditor = sashEditor;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on <code>ISelectionProvider</code>.
-	 */
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		_listeners.add(listener);
-	}
-
-	/**
-	 * Notifies all registered selection changed listeners that the editor's
-	 * selection has changed. Only listeners registered at the time this method
-	 * is called are notified.
-	 * 
-	 * @param event
-	 *            the selection changed event
-	 */
-	public void fireSelectionChanged(final SelectionChangedEvent event) {
-		Object[] listeners = this._listeners.getListeners();
-		for (int i = 0; i < listeners.length; ++i) {
-			final ISelectionChangedListener l = (ISelectionChangedListener) listeners[i];
-            SafeRunner.run(new SafeRunnable() {
-				public void run() {
-					l.selectionChanged(event);
-				}
-			});
-		}
-	}
-
-	/**
-	 * Returns the sash editor.
-	 * @return the sash editor part
-	 */
-	public SashEditorPart getSashEditor() {
-		return _sashEditor;
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on <code>ISelectionProvider</code>.
-	 */
-	public ISelection getSelection() {
-		IEditorPart activeEditor = _sashEditor.getActiveEditor();
-		if (activeEditor != null) {
-			ISelectionProvider selectionProvider = activeEditor.getSite()
-					.getSelectionProvider();
-			if (selectionProvider != null)
-				return selectionProvider.getSelection();
-		}
-		return null;
-	}
-
-	/*
-	 * (non-JavaDoc) Method declaed on <code>ISelectionProvider</code>.
-	 */
-	public void removeSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		_listeners.remove(listener);
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on <code>ISelectionProvider</code>.
-	 */
-	public void setSelection(ISelection selection) {
-		IEditorPart activeEditor = _sashEditor.getActiveEditor();
-		if (activeEditor != null) {
-			ISelectionProvider selectionProvider = activeEditor.getSite()
-					.getSelectionProvider();
-			if (selectionProvider != null)
-				selectionProvider.setSelection(selection);
-		}
-	}
-
-	public void addPostSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		_postSelectionChangedListeners.add(listener);
-	}
-
-	public void removePostSelectionChangedListener(
-			ISelectionChangedListener listener) {
-		_postSelectionChangedListeners.remove(listener);
-	}
-
-	/**
-	 * Notifies any post selection listeners that a post selection event has
-	 * been received. Only listeners registered at the time this method is
-	 * called are notified.
-	 * 
-	 * @param event
-	 *            a selection changed event
-	 * 
-	 * @see #addPostSelectionChangedListener(ISelectionChangedListener)
-	 */
-	public void firePostSelectionChanged(final SelectionChangedEvent event) {
-		Object[] listeners = _postSelectionChangedListeners.getListeners();
-		for (int i = 0; i < listeners.length; ++i) {
-			final ISelectionChangedListener l = (ISelectionChangedListener) listeners[i];
-			SafeRunnable.run(new SafeRunnable() {
-				public void run() {
-					l.selectionChanged(event);
-				}
-			});
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/sash/SashEditorSite.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/sash/SashEditorSite.java
deleted file mode 100644
index 4558404..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/common/sash/SashEditorSite.java
+++ /dev/null
@@ -1,435 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.common.sash;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.viewers.ILabelDecorator;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorActionBarContributor;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IKeyBindingService;
-import org.eclipse.ui.INestableKeyBindingService;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-//import org.eclipse.ui.internal.PopupMenuExtender;
-
-/**
- * @author mengbo
- */
-public class SashEditorSite implements IEditorSite {
-
-	/**
-	 * The nested editor.
-	 */
-	private IEditorPart _editor;
-
-	/**
-	 * The multi-page editor.
-	 */
-	private SashEditorPart _sashEditor;
-
-	/**
-	 * The selection provider; <code>null</code> if none.
-	 * 
-	 * @see SashEditorSite#setSelectionProvider(ISelectionProvider)
-	 */
-	private ISelectionProvider _selectionProvider = null;
-
-	/**
-	 * The selection change listener, initialized lazily; <code>null</code> if
-	 * not yet created.
-	 */
-	private ISelectionChangedListener _selectionChangedListener = null;
-
-	/**
-	 * The cached copy of the key binding service specific to this sash editor
-	 * site. This value is <code>null</code> if it is not yet initialized.
-	 */
-	private IKeyBindingService _service = null;
-
-	/**
-	 * The list of popup menu extenders; <code>null</code> if none registered.
-	 */
-	// TODO: dead? private ArrayList _menuExtenders;
-
-	/**
-	 * Creates a site for the given editor nested within the given multi-page
-	 * editor.
-	 * 
-	 * @param sashEditor
-	 *            the multi-page editor
-	 * @param editor
-	 *            the nested editor
-	 */
-	public SashEditorSite(SashEditorPart sashEditor, IEditorPart editor) {
-		Assert.isNotNull(sashEditor);
-		Assert.isNotNull(editor);
-		this._sashEditor = sashEditor;
-		this._editor = editor;
-	}
-
-	/**
-	 * Dispose the contributions.
-	 */
-	public void dispose() {
-//		if (_menuExtenders != null) {
-//			for (int i = 0, size = _menuExtenders.size(); i < size; i++) {
-//				((PopupMenuExtender) _menuExtenders.get(i)).dispose();
-//			}
-//			_menuExtenders = null;
-//		}
-
-		// Remove myself from the list of nested key binding services.
-		if (_service != null) {
-			IKeyBindingService parentService = getEditor().getSite()
-					.getKeyBindingService();
-			if (parentService instanceof INestableKeyBindingService) {
-				INestableKeyBindingService nestableParent = (INestableKeyBindingService) parentService;
-				nestableParent.removeKeyBindingService(this);
-			}
-			_service = null;
-		}
-	}
-
-	/**
-	 * The <code>SashEditorSite</code> implementation of this
-	 * <code>IEditorSite</code> method returns <code>null</code>, since
-	 * nested editors do not have their own action bar contributor.
-	 * 
-	 * @return <code>null</code>
-	 */
-	public IEditorActionBarContributor getActionBarContributor() {
-		return null;
-	}
-
-	/**
-	 * The <code>SashEditorSite</code> implementation of this
-	 * <code>IEditorSite</code> method forwards to the multi-page editor to
-	 * return the action bars.
-	 * 
-	 * @return The action bars from the parent multi-page editor.
-	 */
-	public IActionBars getActionBars() {
-		return _sashEditor.getEditorSite().getActionBars();
-	}
-
-	/**
-	 * The <code>SashEditorSite</code> implementation of this
-	 * <code>IWorkbenchPartSite</code> method forwards to the multi-page
-	 * editor to return the decorator manager.
-	 * 
-	 * @return The decorator from the workbench window.
-	 * @deprecated use IWorkbench.getDecoratorManager()
-	 */
-	public ILabelDecorator getDecoratorManager() {
-		return getWorkbenchWindow().getWorkbench().getDecoratorManager()
-				.getLabelDecorator();
-	}
-
-	/**
-	 * Returns the nested editor.
-	 * 
-	 * @return the nested editor
-	 */
-	public IEditorPart getEditor() {
-		return _editor;
-	}
-
-	/**
-	 * The <code>SashEditorSite</code> implementation of this
-	 * <code>IWorkbenchPartSite</code> method returns an empty string since
-	 * the nested editor is not created from the registry.
-	 * 
-	 * @return An empty string.
-	 */
-	public String getId() {
-		return ""; //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc) Method declared on IEditorSite.
-	 */
-	public IKeyBindingService getKeyBindingService() {
-		if (_service == null) {
-			_service = getSashEditor().getEditorSite().getKeyBindingService();
-			if (_service instanceof INestableKeyBindingService) {
-				INestableKeyBindingService nestableService = (INestableKeyBindingService) _service;
-				_service = nestableService.getKeyBindingService(this);
-
-			} else {
-				/*
-				 * This is an internal reference, and should not be copied by
-				 * client code. If you are thinking of copying this, DON'T DO
-				 * IT.
-				 */
-				PDPlugin
-						.getLogger(SashEditorSite.class)
-						.info(
-								"MultiPageEditorSite.getKeyBindingService()   Parent key binding service was not an instance of INestableKeyBindingService.  It was an instance of " + _service.getClass().getName() + " instead."); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		}
-
-		return _service;
-	}
-
-	/**
-	 * Returns the sash editor.
-	 * 
-	 * @return the sash editor
-	 */
-	public SashEditorPart getSashEditor() {
-		return _sashEditor;
-	}
-
-	/**
-	 * The <code>SashEditorSite</code> implementation of this
-	 * <code>IWorkbenchPartSite</code> method forwards to the multi-page
-	 * editor to return the workbench page.
-	 * 
-	 * @return The workbench page in which this editor site resides.
-	 */
-	public IWorkbenchPage getPage() {
-		return getSashEditor().getSite().getPage();
-	}
-
-	/**
-	 * The <code>SashEditorSite</code> implementation of this
-	 * <code>IWorkbenchPartSite</code> method returns an empty string since
-	 * the nested editor is not created from the registry.
-	 * 
-	 * @return An empty string.
-	 */
-	public String getPluginId() {
-		return ""; //$NON-NLS-1$
-	}
-
-	/**
-	 * The <code>SashEditorSite</code> implementation of this
-	 * <code>IWorkbenchPartSite</code> method returns an empty string since
-	 * the nested editor is not created from the registry.
-	 * 
-	 * @return An empty string.
-	 */
-	public String getRegisteredName() {
-		return ""; //$NON-NLS-1$
-	}
-
-	/**
-	 * Returns the selection changed listener which listens to the nested
-	 * editor's selection changes, and calls <code>handleSelectionChanged</code>.
-	 * 
-	 * @return the selection changed listener
-	 */
-	private ISelectionChangedListener getSelectionChangedListener() {
-		if (_selectionChangedListener == null) {
-			_selectionChangedListener = new ISelectionChangedListener() {
-				public void selectionChanged(SelectionChangedEvent event) {
-					SashEditorSite.this.handleSelectionChanged(event);
-				}
-			};
-		}
-		return _selectionChangedListener;
-	}
-
-	/**
-	 * The <code>SashEditorSite</code> implementation of this
-	 * <code>IWorkbenchPartSite</code> method returns the selection provider
-	 * set by <code>setSelectionProvider</code>.
-	 * 
-	 * @return The current selection provider.
-	 */
-	public ISelectionProvider getSelectionProvider() {
-		return _selectionProvider;
-	}
-
-	/**
-	 * The <code>SashEditorSite</code> implementation of this
-	 * <code>IWorkbenchPartSite</code> method forwards to the multi-page
-	 * editor to return the shell.
-	 * 
-	 * @return The shell in which this editor site resides.
-	 */
-	public Shell getShell() {
-		return getSashEditor().getSite().getShell();
-	}
-
-	/**
-	 * The <code>SashEditorSite</code> implementation of this
-	 * <code>IWorkbenchPartSite</code> method forwards to the multi-page
-	 * editor to return the workbench window.
-	 * 
-	 * @return The workbench window in which this editor site resides.
-	 */
-	public IWorkbenchWindow getWorkbenchWindow() {
-		return getSashEditor().getSite().getWorkbenchWindow();
-	}
-
-	/**
-	 * Handles a selection changed event from the nested editor. The default
-	 * implementation gets the selection provider from the multi-page editor's
-	 * site, and calls <code>fireSelectionChanged</code> on it (only if it is
-	 * an instance of <code>SashSelectionProvider</code>), passing a new
-	 * event object.
-	 * <p>
-	 * Subclasses may extend or reimplement this method.
-	 * </p>
-	 * 
-	 * @param event
-	 *            the event
-	 */
-	public void handleSelectionChanged(SelectionChangedEvent event) {
-		// we'll only make the parent editor site fire the selection change
-		// event
-		// when we (the sasheditorsite) is the active editor in the parent site.
-		if (getSashEditor().getActiveEditor() == this.getPart()) {
-			ISelectionProvider parentProvider = getSashEditor().getSite()
-					.getSelectionProvider();
-			if (parentProvider instanceof SashEditorSelectionProvider) {
-				SelectionChangedEvent newEvent = new SelectionChangedEvent(
-						parentProvider, event.getSelection());
-				((SashEditorSelectionProvider) parentProvider)
-						.fireSelectionChanged(newEvent);
-			}
-		}
-	}
-
-	/**
-	 * The <code>SashEditorSite</code> implementation of this
-	 * <code>IWorkbenchPartSite</code> method forwards to the multi-page
-	 * editor for registration.
-	 * 
-	 * @param menuID
-	 *            The identifier for the menu.
-	 * @param menuMgr
-	 *            The menu manager
-	 * @param selProvider
-	 *            The selection provider.
-	 */
-	public void registerContextMenu(String menuID, MenuManager menuMgr,
-			ISelectionProvider selProvider) {
-//		if (_menuExtenders == null) {
-//			_menuExtenders = new ArrayList(1);
-//		}
-		// cancel the registration of PopupMenuExtender since the
-		// PopupMenuExtender's behavior
-		// is different between eclipse 3.0 and eclipse 3.1,and we always have
-		// one context
-		// menu listener,no need add PopupMenuExtender as the second
-		// listener(workaroud for bug 408295-1)
-		// _menuExtenders.add(new PopupMenuExtender(menuID, menuMgr,
-		// selProvider,
-		// _editor));
-	}
-
-	/**
-	 * The <code>SashEditorSite</code> implementation of this
-	 * <code>IWorkbenchPartSite</code> method forwards to the multi-page
-	 * editor for registration.
-	 * 
-	 * @param menuManager
-	 *            The menu manager
-	 * @param selProvider
-	 *            The selection provider.
-	 */
-	public void registerContextMenu(MenuManager menuManager,
-			ISelectionProvider selProvider) {
-		getSashEditor().getSite().registerContextMenu(menuManager, selProvider);
-	}
-
-	/**
-	 * The <code>SashEditorSite</code> implementation of this
-	 * <code>IWorkbenchPartSite</code> method remembers the selection
-	 * provider, and also hooks a listener on it, which calls
-	 * <code>handleSelectionChanged</code> when a selection changed event
-	 * occurs.
-	 * 
-	 * @param provider
-	 *            The selection provider.
-	 * @see SashEditorSite#handleSelectionChanged(SelectionChangedEvent)
-	 */
-	public void setSelectionProvider(ISelectionProvider provider) {
-		ISelectionProvider oldSelectionProvider = _selectionProvider;
-		_selectionProvider = provider;
-		if (oldSelectionProvider != null) {
-			oldSelectionProvider
-					.removeSelectionChangedListener(getSelectionChangedListener());
-		}
-		if (_selectionProvider != null) {
-			_selectionProvider
-					.addSelectionChangedListener(getSelectionChangedListener());
-		}
-	}
-
-	/**
-	 * @param job
-	 */
-	public void progressEnd(Job job) {
-		// Do nothing
-	}
-
-
-	/**
-	 * @param job
-	 */
-	public void progressStart(Job job) {
-		// Do nothing
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.IWorkbenchPartSite#getPart()
-	 */
-	public IWorkbenchPart getPart() {
-		return _editor;
-	}
-
-	public void registerContextMenu(MenuManager menuManager,
-			ISelectionProvider selectionProvider, boolean includeEditorInput) {
-	    // do nothing
-	}
-
-	public void registerContextMenu(String menuId, MenuManager menuManager,
-			ISelectionProvider selectionProvider, boolean includeEditorInput) {
-		// do nothing
-
-	}
-
-	public Object getService(Class api) {
-		// return null
-		return null;
-	}
-
-	public boolean hasService(Class api) {
-		// no service
-		return false;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/ClasspathResourceButtonDialogField.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/ClasspathResourceButtonDialogField.java
deleted file mode 100644
index 6960121..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/ClasspathResourceButtonDialogField.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogfields;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.jsf.common.ui.JSFUICommonPlugin;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IStringButtonAdapter;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogs.ResourceOnClasspathDialog;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.IElementContextable;
-import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- */
-public class ClasspathResourceButtonDialogField extends StringButtonDialogField implements IElementContextable
-{
-
-	private static final String[] PROPERTIES_FILES_SUFFIXS = new String[] { IFileFolderConstants.EXT_PROPERTIES }; //$NON-NLS-1$
-
-	private static class MyStringButtonAdapter implements IStringButtonAdapter
-	{
-		private IProject _project;
-
-		public void changeControlPressed(DialogField field) {
-			browseButtonPressed(field);
-		}
-
-		private void browseButtonPressed(DialogField field) 
-		{
-			if (field instanceof ClasspathResourceButtonDialogField)
-			{
-				ClasspathResourceButtonDialogField classPathField = 
-					(ClasspathResourceButtonDialogField) field;
-				Shell shell = field.getShell();
-				ResourceOnClasspathDialog dialog = 
-					new ResourceOnClasspathDialog(shell, getJavaProject());
-				dialog.setTitle(JSFUICommonPlugin
-						.getResourceString("DialogField.ResourceButton.SelectFile"));//$NON-NLS-1$
-				dialog.setSuffixs(PROPERTIES_FILES_SUFFIXS);
-				if (dialog.open() == Window.OK) {
-					String oldValue = classPathField.getText();
-	
-					String newValue = (String) dialog.getResult()[0];
-					if (oldValue != newValue) {
-						classPathField.setText(newValue);
-					}
-				}
-			}
-		}
-		
-		private IJavaProject getJavaProject() {
-			try {
-				if (_project != null && _project.hasNature(JavaCore.NATURE_ID)) {
-					return JavaCore.create(_project);
-				}
-	            return null;
-			} catch (CoreException e) {
-				return null;
-			}
-		}
-	}
-	
-	/**
-s	 */
-	public ClasspathResourceButtonDialogField() {
-		super(new MyStringButtonAdapter());
-	}
-
-	public void setElementContext(
-			org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode ancester,
-			IDOMElement element) {
-		IProject prj = StructuredModelUtil.getProjectFor(ancester.getModel());
-		
-		IStringButtonAdapter adapter = getStringButtonAdapter();
-		
-		if (adapter instanceof MyStringButtonAdapter)
-		{
-			((MyStringButtonAdapter)adapter)._project = prj;
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/ContextableResourceButtonDialogField.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/ContextableResourceButtonDialogField.java
deleted file mode 100644
index a9e50ec..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/ContextableResourceButtonDialogField.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogfields;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ResourceButtonDialogField;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.IElementContextable;
-import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
-import org.eclipse.jst.pagedesigner.utils.WebAppUtil;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ContextableResourceButtonDialogField extends
-		ResourceButtonDialogField implements IElementContextable {
-
-	/**
-	 * Default constructor
-	 */
-	public ContextableResourceButtonDialogField() {
-		super(null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.properties.attrgroup.IElementContextable#setElementContext(org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode,
-	 *      org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement)
-	 */
-	public void setElementContext(IDOMNode ancester, IDOMElement element) {
-		if (ancester == null) {
-			setProject(null);
-			setReferredFile(null);
-		} else {
-			IDOMModel model = ancester.getModel();
-			IFile file = StructuredModelUtil.getFileFor(model);
-			IProject prj = (file == null ? null : file.getProject());
-			setProject(prj);
-			setReferredFile(file);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.ResourceButtonDialogField#browseButtonPressed()
-	 */
-	protected String browseButtonPressed() {
-		String url = super.browseButtonPressed();
-		url = WebAppUtil.transformJSPURL(url, this.getReferredFile());
-		return url;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/DialogFieldWrapper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/DialogFieldWrapper.java
deleted file mode 100644
index 893f40e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/DialogFieldWrapper.java
+++ /dev/null
@@ -1,480 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogfields;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldChangeListener;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IStringButtonAdapter;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ISupportTextValue;
-import org.eclipse.jst.pagedesigner.editors.properties.IPropertyPageDescriptor;
-import org.eclipse.jst.pagedesigner.meta.IAttributeDescriptor;
-import org.eclipse.jst.pagedesigner.meta.IBindingHandler;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.IElementContextable;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.PaintEvent;
-import org.eclipse.swt.events.PaintListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.forms.events.IHyperlinkListener;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-
-/**
- * This is a wrapper to a dialog field, by adding a small image button at the
- * end. The caller is responsible to provide the image and the button click
- * handler.
- * 
- * @author mengbo
- * @version 1.5
- * @see org.eclipse.jst.pagedesigner.properties.celleditors.CellEditorWrapper
- */
-// NOTE: currently this class is dedicated to page designer by using the
-// IElementContextable interface.
-// It should be very easy to make it standard alone and reused in other places.
-@SuppressWarnings("deprecation")
-public class DialogFieldWrapper implements DialogField, ISupportTextValue,
-		IElementContextable {
-	private DialogField _wrapped;
-
-	private IDOMNode _ancester;
-
-	private IDOMElement _element;
-
-	private Button _databindingButton;
-
-	private boolean _databindingEnabled;
-
-	private Image _image;
-
-	private Image _disabledImage;
-
-	private IStringButtonAdapter _adapter;
-
-	private String _uri;
-
-	private String _tagName;
-
-    private IAttributeDescriptor _attr;
-
-    private IBindingHandler _handler;
-
-	private IPropertyPageDescriptor _pdattr;
-
-	/**
-	 * @param field 
-	 * @param image 
-	 * @param disabledImage 
-	 * @param uri 
-	 * @param tagName 
-	 * @param attr 
-	 * @param handler 
-	 * 
-	 */
-    public DialogFieldWrapper(DialogField field, Image image,
-			Image disabledImage, String uri, String tagName,
-			IAttributeDescriptor attr, IBindingHandler handler) {
-		super();
-		if (!(field instanceof ISupportTextValue)) {
-			throw new IllegalArgumentException(
-					"Field must be ISupportTextValue");
-		}
-		_wrapped = field;
-		this._image = image;
-		this._disabledImage = disabledImage;
-		this._uri = uri;
-		this._tagName = tagName;
-		this._attr = attr;
-		this._handler = handler;
-
-		setDatabindingPressedHandler(new IStringButtonAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IStringButtonAdapter#changeControlPressed(org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField)
-			 */
-            public void changeControlPressed(DialogField field1) {
-				Shell shell = field1.getLabelControl(null, null).getShell();
-				DialogFieldWrapper wrapper = (DialogFieldWrapper) field1;
-				String result = _handler
-						.handleBinding(shell, wrapper.getAncester(), wrapper
-								.getElement(), wrapper.getText());
-				if (result != null) {
-					wrapper.setText(result);
-				}
-			}
-		});
-	}
-	
-	/**
-	 * @param field 
-	 * @param image 
-	 * @param disabledImage 
-	 * @param uri 
-	 * @param tagName 
-	 * @param attr 
-	 * @param handler 
-	 * 
-	 */
-    public DialogFieldWrapper(DialogField field, Image image,
-			Image disabledImage, String uri, String tagName,
-			IPropertyPageDescriptor attr, IBindingHandler handler) {
-		super();
-		if (!(field instanceof ISupportTextValue)) {
-			throw new IllegalArgumentException(
-					"Field must be ISupportTextValue");
-		}
-		_wrapped = field;
-		this._image = image;
-		this._disabledImage = disabledImage;
-		this._uri = uri;
-		this._tagName = tagName;
-		this._pdattr = attr;
-		this._handler = handler;
-
-		setDatabindingPressedHandler(new IStringButtonAdapter() {
-			/*
-			 * (non-Javadoc)
-			 * 
-			 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IStringButtonAdapter#changeControlPressed(org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField)
-			 */
-			public void changeControlPressed(DialogField field1) {
-				Shell shell = field1.getLabelControl(null, null).getShell();
-				DialogFieldWrapper wrapper = (DialogFieldWrapper) field1;
-				String result = _handler
-						.handleBinding(shell, wrapper.getAncester(), wrapper
-								.getElement(), wrapper.getText());
-				if (result != null) {
-					wrapper.setText(result);
-				}
-			}
-		});
-	}
-
-	private void setDatabindingPressedHandler(IStringButtonAdapter adapter) {
-		this._adapter = adapter;
-		this.updateDatabindingControl();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.ISupportTextValue#setTextWithoutUpdate(java.lang.String)
-	 */
-	public void setTextWithoutUpdate(String value) {
-		((ISupportTextValue) _wrapped).setTextWithoutUpdate(value);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.ISupportTextValue#getText()
-	 */
-	public String getText() {
-		return ((ISupportTextValue) _wrapped).getText();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.ISupportTextValue#setText(java.lang.String)
-	 */
-	public void setText(String value) {
-		((ISupportTextValue) _wrapped).setText(value);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.properties.attrgroup.IElementContextable#setElementContext(org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode,
-	 *      org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement)
-	 */
-    public void setElementContext(IDOMNode ancester, IDOMElement element) {
-		if (_wrapped instanceof IElementContextable) {
-			((IElementContextable) _wrapped).setElementContext(ancester,
-					element);
-		}
-		this._ancester = ancester;
-		this._element = element;
-
-		boolean bindingEnabled = false;
-		
-		if (_attr != null)
-			bindingEnabled = _handler.isEnabled(_ancester, _element, _uri,
-				_tagName, _attr);
-		else if (_pdattr != null)
-			bindingEnabled = false;//_handler.isEnabled(_ancester, _element, _pdattr);
-		
-		this.setDatabindingEnabled(bindingEnabled);
-	}
-
-	// --------------------------------------------------------------------------------------------
-	// wrapped method to add the data binding browse button
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField#doFillIntoGrid(org.eclipse.ui.forms.widgets.FormToolkit,
-	 *      org.eclipse.swt.widgets.Composite, int)
-	 */
-	public Control[] doFillIntoGrid(FormToolkit toolkit, Composite parent,
-			int nColumns) {
-		Control[] wrappedControls = _wrapped.doFillIntoGrid(toolkit, parent,
-				nColumns - 1);
-		Control[] result = new Control[wrappedControls.length];
-
-		Control button = getDatabingingButton(toolkit, parent);
-		button.setLayoutData(gridDataForDatabindingButton(1));
-		button.setVisible(false);
-
-		System.arraycopy(wrappedControls, 0, result, 0, wrappedControls.length);
-		result[result.length - 1] = _databindingButton;
-		return result;
-	}
-
-	/**
-	 * @param span
-	 * @return
-	 */
-	private GridData gridDataForDatabindingButton(int span) {
-		GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-		gd.horizontalSpan = span;
-		gd.widthHint = gd.heightHint = 18;
-		return gd;
-	}
-
-	/**
-	 * @param toolkit
-	 * @param parent
-	 * @return
-	 */
-	private Control getDatabingingButton(FormToolkit toolkit, Composite parent) {
-		if (_databindingButton == null || _databindingButton.isDisposed()) {
-			Assert.isNotNull(parent,
-					"uncreated control requested with composite null"); //$NON-NLS-1$
-			if (toolkit != null) {
-				_databindingButton = toolkit.createButton(parent, "", SWT.PUSH);
-				_databindingButton.setImage(getImage());
-			} else {
-				_databindingButton = new Button(parent, SWT.PUSH);
-				_databindingButton.setImage(getImage());
-			}
-			_databindingButton.addPaintListener(new PaintListener() {
-				public void paintControl(PaintEvent e) {
-					if (!_databindingButton.isEnabled()
-							&& getDisabledImage() != null) {
-						Rectangle buttonBounds = _databindingButton.getBounds();
-						Rectangle imageBounds = getDisabledImage().getBounds();
-						e.gc.drawImage(getDisabledImage(),
-								(buttonBounds.width - imageBounds.width) / 2,
-								(buttonBounds.height - imageBounds.height) / 2);
-					}
-				}
-			});
-			_databindingButton.setEnabled(isEnabled() && _databindingEnabled);
-			_databindingButton.addSelectionListener(new SelectionListener() {
-				public void widgetDefaultSelected(SelectionEvent e) {
-					databindingControlPressed();
-				}
-
-				public void widgetSelected(SelectionEvent e) {
-					databindingControlPressed();
-				}
-			});
-
-		}
-		return _databindingButton;
-	}
-
-	/**
-	 * @return
-	 */
-	private Image getImage() {
-		return _image;
-	}
-
-	private Image getDisabledImage() {
-		return _disabledImage;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField#getLabelControl(org.eclipse.ui.forms.widgets.FormToolkit,
-	 *      org.eclipse.swt.widgets.Composite)
-	 */
-	public Control getLabelControl(FormToolkit _formToolkit, Composite parent) {
-		return _wrapped.getLabelControl(_formToolkit, parent);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#setHyperLink(org.eclipse.ui.forms.events.IHyperlinkListener)
-	 */
-	public void setHyperLink(IHyperlinkListener listener) {
-		_wrapped.setHyperLink(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#setLabelText(java.lang.String)
-	 */
-	public void setLabelText(String labeltext) {
-		_wrapped.setLabelText(labeltext);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#setDialogFieldChangeListener(org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldChangeListener)
-	 */
-	public void setDialogFieldChangeListener(IDialogFieldChangeListener listener) {
-		_wrapped.setDialogFieldChangeListener(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#setDialogFieldApplyListener(org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener)
-	 */
-	public void setDialogFieldApplyListener(IDialogFieldApplyListener listener) {
-		_wrapped.setDialogFieldApplyListener(listener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#setFocus()
-	 */
-	public boolean setFocus() {
-		return _wrapped.setFocus();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#getNumberOfControls()
-	 */
-	public int getNumberOfControls() {
-		return _wrapped.getNumberOfControls() + 1;
-	}
-
-	/**
-	 * @param enabled
-	 */
-	public void setDatabindingEnabled(boolean enabled) {
-		this._databindingEnabled = enabled;
-		updateDatabindingControl();
-	}
-
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#setEnabled(boolean)
-	 */
-	public void setEnabled(boolean enabled) {
-		_wrapped.setEnabled(enabled);
-		updateDatabindingControl();
-	}
-
-	/**
-	 * 
-	 */
-	private void updateDatabindingControl() {
-		if (this._databindingButton != null && !_databindingButton.isDisposed()) {
-			this._databindingButton.setEnabled(this.isEnabled()
-					&& _databindingEnabled && _adapter != null);
-			_databindingButton.redraw();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#isEnabled()
-	 */
-	public boolean isEnabled() {
-		return _wrapped.isEnabled();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#getAttachedData(java.lang.Object)
-	 */
-	public Object getAttachedData(Object key) {
-		return _wrapped.getAttachedData(key);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogField#putAttachedData(java.lang.Object,
-	 *      java.lang.Object)
-	 */
-	public void putAttachedData(Object key, Object value) {
-		_wrapped.putAttachedData(key, value);
-	}
-
-	private void databindingControlPressed() {
-		if (_adapter != null) {
-			_adapter.changeControlPressed(this);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField#handleGrabHorizontal()
-	 */
-	public void handleGrabHorizontal() {
-		_wrapped.handleGrabHorizontal();
-	}
-
-	private IDOMNode getAncester() {
-		return _ancester;
-	}
-
-	private IDOMElement getElement() {
-		return _element;
-	}
-
-	/**
-	 * @return the wrapped field
-	 */
-	public DialogField getWrappedDialogField() {
-		return _wrapped;
-	}
-
-	public boolean isRequired() {
-		return _wrapped.isRequired();
-	}
-
-	public void setToolTip(String toolTip) {
-		_wrapped.setToolTip(toolTip);
-	}
-
-	public Shell getShell() {
-		return _wrapped.getShell();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/ExtendedResourceButtonDialogField.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/ExtendedResourceButtonDialogField.java
deleted file mode 100644
index 0c458ec..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/ExtendedResourceButtonDialogField.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogfields;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ResourceButtonDialogField;
-import org.eclipse.jst.pagedesigner.utils.WebAppUtil;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ExtendedResourceButtonDialogField extends
-		ResourceButtonDialogField {
-	/**
-	 * @param project
-	 */
-	public ExtendedResourceButtonDialogField(IProject project) {
-		super(project);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.jsf.common.ui.internal.dialogfield.ResourceButtonDialogField#browseButtonPressed()
-	 */
-	protected String browseButtonPressed() {
-		String url = super.browseButtonPressed();
-		url = WebAppUtil.transformJSPURL(url, this.getReferredFile());
-		return url;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/StyleButtonDialogField.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/StyleButtonDialogField.java
deleted file mode 100644
index 0e05a53..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogfields/StyleButtonDialogField.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogfields;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.preference.PreferenceManager;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IStringButtonAdapter;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StringButtonDialogField;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.commands.single.ChangeStyleCommand;
-import org.eclipse.jst.pagedesigner.properties.attrgroup.IElementContextable;
-import org.eclipse.jst.pagedesigner.ui.dialogs.DialogsMessages;
-import org.eclipse.jst.pagedesigner.ui.dialogs.StyleDialog;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.css.core.internal.provisional.document.ICSSStyleDeclaration;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.css.ElementCSSInlineStyle;
-
-/**
- * @author mengbo
- */
-public class StyleButtonDialogField extends StringButtonDialogField implements
-		IElementContextable {
-	private IDOMElement _element;
-
-	/**
-	 * Equivalent to StyleButtonDialogField(null)
-	 */
-	public StyleButtonDialogField() {
-		this(null);
-	}
-
-	/**
-	 * @param element
-	 */
-	public StyleButtonDialogField(IDOMElement element) {
-		this(null, element);
-		setStringButtonAdapter(new IStringButtonAdapter() {
-			public void changeControlPressed(DialogField field) {
-				browseButtonPressed();
-			}
-		});
-		setButtonLabel(DialogsMessages.getString("StyleButtonDialogField.Edit"));//$NON-NLS-1$ 
-	}
-
-	/**
-	 * @param adapter
-	 * @param element
-	 */
-	public StyleButtonDialogField(IStringButtonAdapter adapter,
-			IDOMElement element) {
-		super(adapter);
-		_element = element;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.properties.attrgroup.IElementContextable#setElementContext(org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode,
-	 *      org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement)
-	 */
-	public void setElementContext(IDOMNode ancester, IDOMElement element) {
-		this._element = element;
-	}
-
-	private void browseButtonPressed() {
-		if (_element instanceof ElementCSSInlineStyle) {
-			ICSSStyleDeclaration styleDeclaration = (ICSSStyleDeclaration) ((ElementCSSInlineStyle) _element)
-					.getStyle();
-
-			PreferenceManager manager = new PreferenceManager();
-			Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow()
-					.getShell();
-
-			CSSPropertyContext context = new CSSPropertyContext(
-					styleDeclaration);
-			StyleDialog dialog = new StyleDialog(shell, manager, _element,
-					context);
-			if (dialog.open() == Dialog.OK) {
-				if (!context.isModified()) {
-					return;
-				}
-				ChangeStyleCommand c = new ChangeStyleCommand(_element, context);
-				c.execute();
-
-				String style = (_element == null ? null : _element
-						.getAttribute(IJSFConstants.ATTR_STYLE));
-				setText(style);
-			}
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BackgroudPreferenceNode.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BackgroudPreferenceNode.java
deleted file mode 100644
index f1fe115..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BackgroudPreferenceNode.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.IPreferenceNode;
-import org.eclipse.jface.preference.IPreferencePage;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class BackgroudPreferenceNode implements IPreferenceNode {
-	private BackgroundPreferencePage _page;
-
-	private IDOMElement _element;
-
-	private CSSPropertyContext _style;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public BackgroudPreferenceNode(IDOMElement element, CSSPropertyContext style) {
-		super();
-		_element = element;
-		_style = style;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#add(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public void add(IPreferenceNode node) {
-        // TODO: do nothing?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#createPage()
-	 */
-	public void createPage() {
-		_page = new BackgroundPreferencePage(_element, _style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#disposeResources()
-	 */
-	public void disposeResources() {
-        //TODO: do nothing?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#findSubNode(java.lang.String)
-	 */
-	public IPreferenceNode findSubNode(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getId()
-	 */
-	public String getId() {
-		return "Background";
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelImage()
-	 */
-	public Image getLabelImage() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelText()
-	 */
-	public String getLabelText() {
-		return DialogsMessages.getString("BackgroundPreferenceNode.LabelText");
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getPage()
-	 */
-	public IPreferencePage getPage() {
-		return _page;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getSubNodes()
-	 */
-	public IPreferenceNode[] getSubNodes() {
-		return new IPreferenceNode[0];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(java.lang.String)
-	 */
-	public IPreferenceNode remove(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public boolean remove(IPreferenceNode node) {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BackgroundPreferencePage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BackgroundPreferencePage.java
deleted file mode 100644
index 83ca8c4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BackgroundPreferencePage.java
+++ /dev/null
@@ -1,320 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ColorButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class BackgroundPreferencePage extends PreferencePage {
-	private CSSPropertyContext _style;
-
-	private StyleCombo _backgroundImageCombo, _backgroundRepeatCombo,
-			_backgroundAttachmentCombo, _horizontalNumberCombo,
-			_horizontalUnitCombo, _verticalNumberCombo, _verticalUnitCombo;
-
-	private ColorButtonDialogField _backgroundColorField;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public BackgroundPreferencePage(IDOMElement element,
-			CSSPropertyContext style) {
-		super();
-		_style = style;
-
-		setTitle(DialogsMessages.getString("BackgroundPreferencePage.Title")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.
-	 *      PreferencePage#createContents(Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		GridLayout layout;
-		GridData data;
-
-		Composite top = new Composite(parent, SWT.NONE);
-		layout = new GridLayout(3, false);
-		data = new GridData(GridData.FILL_BOTH);
-		top.setLayout(layout);
-		top.setLayoutData(data);
-
-		_backgroundColorField = new ColorButtonDialogField(SWT.BORDER, new ColorUtil());
-		_backgroundColorField.setLabelText(DialogsMessages
-				.getString("BackgroundBoxPreferencePage.BackgroundColor"));
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		_backgroundColorField.getLabelControl(null, top).setLayoutData(data);
-
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_backgroundColorField.getComboControl(null, top).setLayoutData(data);
-
-		data = new GridData();
-		_backgroundColorField.getChangeControl(null, top).setLayoutData(data);
-		_backgroundColorField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						String color = _backgroundColorField.getText();
-
-						_style.setBackgroundColor(color);
-					}
-				});
-
-		Label backgroundImageLabel = new Label(top, SWT.NONE);
-		backgroundImageLabel.setText(DialogsMessages
-				.getString("BackgroundBoxPreferencePage.BackgroundImage")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		backgroundImageLabel.setLayoutData(data);
-
-		_backgroundImageCombo = new StyleCombo(top, SWT.NONE);
-		_backgroundImageCombo.setItems(IStyleConstants.NONE);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_backgroundImageCombo.setLayoutData(data);
-		_backgroundImageCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String image = _backgroundImageCombo.getText();
-
-				_style.setBackgroundImage(image);
-			}
-		});
-
-		new Label(top, SWT.NONE);
-
-		Label backgroundRepeatLabel = new Label(top, SWT.NONE);
-		backgroundRepeatLabel
-				.setText(DialogsMessages
-						.getString("BackgroundBoxPreferencePage.BackgroundRepeatLabel")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		backgroundRepeatLabel.setLayoutData(data);
-
-		_backgroundRepeatCombo = new StyleCombo(top, SWT.NONE);
-		_backgroundRepeatCombo.setItems(IStyleConstants.REPEAT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_backgroundRepeatCombo.setLayoutData(data);
-		_backgroundRepeatCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String repeat = _backgroundRepeatCombo.getText();
-
-				_style.setBackgroundRepeat(repeat);
-			}
-		});
-
-		new Label(top, SWT.NONE);
-
-		Label backgroundAttachmentLabel = new Label(top, SWT.NONE);
-		backgroundAttachmentLabel
-				.setText(DialogsMessages
-						.getString("BackgroundBoxPreferencePage.BackgroundAttachmentLabel")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		backgroundAttachmentLabel.setLayoutData(data);
-
-		_backgroundAttachmentCombo = new StyleCombo(top, SWT.NONE);
-		_backgroundAttachmentCombo.setItems(IStyleConstants.ATTACHMENT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_backgroundAttachmentCombo.setLayoutData(data);
-		_backgroundAttachmentCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String attachment = _backgroundAttachmentCombo.getText();
-
-				_style.setBackgroundAttachment(attachment);
-			}
-		});
-
-		new Label(top, SWT.NONE);
-
-		Label backgroundHorizontalLabel = new Label(top, SWT.NONE);
-		backgroundHorizontalLabel.setText(DialogsMessages
-				.getString("BackgroundBoxPreferencePage.HorizontalLabel")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		backgroundHorizontalLabel.setLayoutData(data);
-
-		_horizontalNumberCombo = new StyleCombo(top, SWT.NONE);
-		_horizontalNumberCombo.setItems(IStyleConstants.POSITION);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_horizontalNumberCombo.setLayoutData(data);
-		_horizontalNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_horizontalUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_horizontalNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_horizontalUnitCombo.setEnabled(false);
-				}
-
-				String position = _horizontalNumberCombo.getText();
-				if (_horizontalUnitCombo.isEnabled()) {
-					position += _horizontalUnitCombo.getText();
-				}
-
-				_style.setBackgroundPositionX(position);
-			}
-		});
-
-		_horizontalUnitCombo = new StyleCombo(top, SWT.READ_ONLY);
-		_horizontalUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL);
-		_horizontalUnitCombo.setLayoutData(data);
-		_horizontalUnitCombo.select(0);
-		_horizontalUnitCombo.setEnabled(false);
-		_horizontalUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String position = _horizontalNumberCombo.getText();
-				if (_horizontalUnitCombo.isEnabled()) {
-					position += _horizontalUnitCombo.getText();
-				}
-
-				_style.setBackgroundPositionX(position);
-
-			}
-		});
-
-		Label backgroundVerticalLabel = new Label(top, SWT.NONE);
-		backgroundVerticalLabel.setText(DialogsMessages
-				.getString("BackgroundBoxPreferencePage.VerticalLabel")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		backgroundVerticalLabel.setLayoutData(data);
-
-		_verticalNumberCombo = new StyleCombo(top, SWT.NONE);
-		_verticalNumberCombo.setItems(IStyleConstants.POSITION);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_verticalNumberCombo.setLayoutData(data);
-		_verticalNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_verticalUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_verticalNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_verticalUnitCombo.setEnabled(false);
-				}
-
-				String position = _verticalNumberCombo.getText();
-				if (_verticalUnitCombo.isEnabled()) {
-					position += _verticalUnitCombo.getText();
-				}
-
-				_style.setBackgroundPositionY(position);
-			}
-		});
-
-		_verticalUnitCombo = new StyleCombo(top, SWT.READ_ONLY);
-		_verticalUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL);
-		_verticalUnitCombo.setLayoutData(data);
-		_verticalUnitCombo.select(0);
-		_verticalUnitCombo.setEnabled(false);
-		_verticalUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String position = _verticalNumberCombo.getText();
-				if (_verticalUnitCombo.isEnabled()) {
-					position += _verticalUnitCombo.getText();
-				}
-
-				_style.setBackgroundPositionY(position);
-			}
-		});
-
-		initializeControls();
-
-		return top;
-	}
-
-	private void initializeControls() {
-		// background-color
-		String color = _style.getBackgroundColor();
-		if (!isEmptyString(color)) {
-			_backgroundColorField.setTextWithoutUpdate(color);
-		}
-
-		// background-image
-		String image = _style.getBackgroundImage();
-		if (!isEmptyString(image)) {
-			int index = _backgroundImageCombo.indexOf(image);
-			if (index != -1) {
-				_backgroundImageCombo.select(index);
-			} else {
-				_backgroundImageCombo.setText(image);
-			}
-		}
-
-		// background-repeat
-		String repeat = _style.getBackgroundRepeat();
-		if (!isEmptyString(repeat)) {
-			int index = _backgroundRepeatCombo.indexOf(repeat);
-			if (index != -1) {
-				_backgroundRepeatCombo.select(index);
-			} else {
-				_backgroundRepeatCombo.setText(repeat);
-			}
-		}
-
-		// background-attachment
-		String attachment = _style.getBackgroundAttachment();
-		if (!isEmptyString(attachment)) {
-			int index = _backgroundAttachmentCombo.indexOf(repeat);
-			if (index != -1) {
-				_backgroundAttachmentCombo.select(index);
-			} else {
-				_backgroundAttachmentCombo.setText(attachment);
-			}
-		}
-
-		// background-position
-		String position = _style.getBackgroundPositionX();
-		if (!isEmptyString(position)) {
-			int index = _horizontalNumberCombo.indexOf(position);
-			if (index != -1) {
-				_horizontalNumberCombo.select(index);
-			} else {
-				_horizontalNumberCombo.setText(position);
-			}
-		}
-		position = _style.getBackgroundPositionY();
-		if (!isEmptyString(position)) {
-			int index = _verticalNumberCombo.indexOf(position);
-			if (index != -1) {
-				_verticalNumberCombo.select(index);
-			} else {
-				_verticalNumberCombo.setText(position);
-			}
-		}
-	}
-
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-
-		getApplyButton().setVisible(false);
-		getDefaultsButton().setVisible(false);
-	}
-
-	private boolean isEmptyString(String str) {
-		if (str == null || str.length() == 0) {
-			return true;
-		}
-        return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BlockPreferenceNode.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BlockPreferenceNode.java
deleted file mode 100644
index 064cefc..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BlockPreferenceNode.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.IPreferenceNode;
-import org.eclipse.jface.preference.IPreferencePage;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class BlockPreferenceNode implements IPreferenceNode {
-	private BlockPreferencePage _page;
-
-	private IDOMElement _element;
-
-	private CSSPropertyContext _style;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public BlockPreferenceNode(IDOMElement element, CSSPropertyContext style) {
-		super();
-		_element = element;
-		_style = style;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#add(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public void add(IPreferenceNode node) {
-        // TODO: do nothing?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#createPage()
-	 */
-	public void createPage() {
-		_page = new BlockPreferencePage(_element, _style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#disposeResources()
-	 */
-	public void disposeResources() {
-        // TODO: do nothing?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#findSubNode(java.lang.String)
-	 */
-	public IPreferenceNode findSubNode(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getId()
-	 */
-	public String getId() {
-		return "Block";
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelImage()
-	 */
-	public Image getLabelImage() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelText()
-	 */
-	public String getLabelText() {
-		return DialogsMessages.getString("BlockPreferenceNode.LabelText");
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getPage()
-	 */
-	public IPreferencePage getPage() {
-		return _page;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getSubNodes()
-	 */
-	public IPreferenceNode[] getSubNodes() {
-		return new IPreferenceNode[0];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(java.lang.String)
-	 */
-	public IPreferenceNode remove(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public boolean remove(IPreferenceNode node) {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BlockPreferencePage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BlockPreferencePage.java
deleted file mode 100644
index 786e738..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BlockPreferencePage.java
+++ /dev/null
@@ -1,398 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class BlockPreferencePage extends PreferencePage {
-	private CSSPropertyContext _style;
-
-	private StyleCombo _wordSpacingNumberCombo, _wordSpacingUnitCombo,
-			_letterSpacingNumberCombo, _letterSpacingUnitCombo,
-			_verticalAlignNumberCombo, _verticalAlignUnitCombo,
-			_textAlignCombo, _textIndentUnitCombo, _whiteSpaceCombo,
-			_displayCombo;
-
-	private Text _textIndentText;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public BlockPreferencePage(IDOMElement element, CSSPropertyContext style) {
-		super();
-		_style = style;
-
-		setTitle(DialogsMessages.getString("BlockPreferencePage.Title")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.
-	 *      PreferencePage#createContents(Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		GridLayout layout;
-		GridData data;
-
-		Composite top = new Composite(parent, SWT.NONE);
-		layout = new GridLayout(3, false);
-		data = new GridData(GridData.FILL_BOTH);
-		top.setLayout(layout);
-		top.setLayoutData(data);
-
-		Label wordSpacingLabel = new Label(top, SWT.NONE);
-		wordSpacingLabel.setText(DialogsMessages
-				.getString("BlockPreferencePage.WordSpacing")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		wordSpacingLabel.setLayoutData(data);
-
-		_wordSpacingNumberCombo = new StyleCombo(top, SWT.NONE);
-		_wordSpacingNumberCombo.setItems(IStyleConstants.NORMAL);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_wordSpacingNumberCombo.setLayoutData(data);
-		_wordSpacingNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_wordSpacingUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_wordSpacingNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_wordSpacingUnitCombo.setEnabled(false);
-				}
-
-				String spacing = _wordSpacingNumberCombo.getText();
-				if (_wordSpacingUnitCombo.isEnabled()) {
-					spacing += _wordSpacingUnitCombo.getText();
-				}
-
-				_style.setWordSpacing(spacing);
-			}
-		});
-
-		_wordSpacingUnitCombo = new StyleCombo(top, SWT.READ_ONLY);
-		_wordSpacingUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_wordSpacingUnitCombo.setLayoutData(data);
-		_wordSpacingUnitCombo.select(0);
-		_wordSpacingUnitCombo.setEnabled(false);
-		_wordSpacingUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String spacing = _wordSpacingNumberCombo.getText();
-				if (_wordSpacingUnitCombo.isEnabled()) {
-					spacing += _wordSpacingUnitCombo.getText();
-				}
-
-				_style.setWordSpacing(spacing);
-
-			}
-		});
-
-		Label letterSpacingLabel = new Label(top, SWT.NONE);
-		letterSpacingLabel.setText(DialogsMessages
-				.getString("BlockPreferencePage.LetterSpacing")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		letterSpacingLabel.setLayoutData(data);
-
-		_letterSpacingNumberCombo = new StyleCombo(top, SWT.NONE);
-		_letterSpacingNumberCombo.setItems(IStyleConstants.NORMAL);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_letterSpacingNumberCombo.setLayoutData(data);
-		_letterSpacingNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_letterSpacingUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_letterSpacingNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_letterSpacingUnitCombo.setEnabled(false);
-				}
-
-				String spacing = _letterSpacingNumberCombo.getText();
-				if (_letterSpacingUnitCombo.isEnabled()) {
-					spacing += _letterSpacingUnitCombo.getText();
-				}
-
-				_style.setLetterSpacing(spacing);
-			}
-		});
-
-		_letterSpacingUnitCombo = new StyleCombo(top, SWT.READ_ONLY);
-		_letterSpacingUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_letterSpacingUnitCombo.setLayoutData(data);
-		_letterSpacingUnitCombo.select(0);
-		_letterSpacingUnitCombo.setEnabled(false);
-		_letterSpacingUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String spacing = _letterSpacingNumberCombo.getText();
-				if (_letterSpacingUnitCombo.isEnabled()) {
-					spacing += _letterSpacingUnitCombo.getText();
-				}
-
-				_style.setLetterSpacing(spacing);
-			}
-		});
-
-		Label verticalAlignLabel = new Label(top, SWT.NONE);
-		verticalAlignLabel.setText(DialogsMessages
-				.getString("BlockPreferencePage.VerticalAlign")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		verticalAlignLabel.setLayoutData(data);
-
-		_verticalAlignNumberCombo = new StyleCombo(top, SWT.NONE);
-		_verticalAlignNumberCombo.setItems(IStyleConstants.VERTICAL_ALIGN);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_verticalAlignNumberCombo.setLayoutData(data);
-		_verticalAlignNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_verticalAlignUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_verticalAlignNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_verticalAlignUnitCombo.setEnabled(false);
-				}
-
-				String align = _verticalAlignNumberCombo.getText();
-				if (_verticalAlignUnitCombo.isEnabled()) {
-					align += _verticalAlignUnitCombo.getText();
-				}
-
-				_style.setVerticalAlign(align);
-			}
-		});
-
-		_verticalAlignUnitCombo = new StyleCombo(top, SWT.READ_ONLY);
-		_verticalAlignUnitCombo.setItems(IStyleConstants.PERCENT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_verticalAlignUnitCombo.setLayoutData(data);
-		_verticalAlignUnitCombo.select(0);
-		_verticalAlignUnitCombo.setEnabled(false);
-		_verticalAlignUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String align = _verticalAlignNumberCombo.getText();
-				if (_verticalAlignUnitCombo.isEnabled()) {
-					align += _verticalAlignUnitCombo.getText();
-				}
-
-				_style.setVerticalAlign(align);
-			}
-		});
-
-		Label textAlignLabel = new Label(top, SWT.NONE);
-		textAlignLabel.setText(DialogsMessages
-				.getString("BlockPreferencePage.TextAlign")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		textAlignLabel.setLayoutData(data);
-
-		_textAlignCombo = new StyleCombo(top, SWT.NONE);
-		_textAlignCombo.setItems(IStyleConstants.TEXT_ALIGN);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_textAlignCombo.setLayoutData(data);
-		_textAlignCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String align = _textAlignCombo.getText();
-
-				_style.setTextAlign(align);
-			}
-		});
-
-		new Label(top, SWT.NONE);
-
-		Label textIndentLabel = new Label(top, SWT.NONE);
-		textIndentLabel.setText(DialogsMessages
-				.getString("BlockPreferencePage.TextIndent")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		textIndentLabel.setLayoutData(data);
-
-		_textIndentText = new Text(top, SWT.BORDER);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_textIndentText.setLayoutData(data);
-		_textIndentText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_textIndentUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_textIndentText.getText());
-				} catch (NumberFormatException ex) {
-					_textIndentUnitCombo.setEnabled(false);
-				}
-
-				String indent = _textIndentText.getText();
-				if (_textIndentUnitCombo.isEnabled()) {
-					indent += _textIndentUnitCombo.getText();
-				}
-
-				_style.setTextIndent(indent);
-			}
-		});
-
-		_textIndentUnitCombo = new StyleCombo(top, SWT.READ_ONLY);
-		_textIndentUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_textIndentUnitCombo.setLayoutData(data);
-		_textIndentUnitCombo.select(0);
-		_textIndentUnitCombo.setEnabled(false);
-		_textIndentUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String indent = _textIndentText.getText();
-				if (_textIndentUnitCombo.isEnabled()) {
-					indent += _textIndentUnitCombo.getText();
-				}
-
-				_style.setTextIndent(indent);
-			}
-		});
-
-		Label whiteSpaceLabel = new Label(top, SWT.NONE);
-		whiteSpaceLabel.setText(DialogsMessages
-				.getString("BlockPreferencePage.WhiteSpace")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		whiteSpaceLabel.setLayoutData(data);
-
-		_whiteSpaceCombo = new StyleCombo(top, SWT.NONE);
-		_whiteSpaceCombo.setItems(IStyleConstants.WHITE_SPACE);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_whiteSpaceCombo.setLayoutData(data);
-		_whiteSpaceCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String space = _whiteSpaceCombo.getText();
-
-				_style.setWhiteSpace(space);
-			}
-		});
-
-		new Label(top, SWT.NONE);
-
-		Label displayLabel = new Label(top, SWT.NONE);
-		displayLabel.setText(DialogsMessages
-				.getString("BlockPreferencePage.Display")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		displayLabel.setLayoutData(data);
-
-		_displayCombo = new StyleCombo(top, SWT.NONE);
-		_displayCombo.setItems(IStyleConstants.DISPLAY);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_displayCombo.setLayoutData(data);
-		_displayCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String display = _displayCombo.getText();
-
-				_style.setDisplay(display);
-			}
-		});
-
-		initializeControls();
-
-		return top;
-	}
-
-	private void initializeControls() {
-		// word-spacing
-		String spacing = _style.getWordSpacing();
-		if (!isEmptyString(spacing)) {
-			int index = _wordSpacingNumberCombo.indexOf(spacing);
-			if (index != -1) {
-				_wordSpacingNumberCombo.select(index);
-			} else {
-				_wordSpacingNumberCombo.setText(spacing);
-			}
-		}
-
-		// letter-spacing
-		spacing = _style.getLetterSpacing();
-		if (!isEmptyString(spacing)) {
-			int index = _letterSpacingNumberCombo.indexOf(spacing);
-			if (index != -1) {
-				_letterSpacingNumberCombo.select(index);
-			} else {
-				_letterSpacingNumberCombo.setText(spacing);
-			}
-		}
-
-		// veritcal-align
-		String align = _style.getVerticalAlign();
-		if (!isEmptyString(align)) {
-			int index = _verticalAlignNumberCombo.indexOf(align);
-			if (index != -1) {
-				_verticalAlignNumberCombo.select(index);
-			} else {
-				_verticalAlignNumberCombo.setText(align);
-			}
-		}
-
-		// text-align
-		align = _style.getTextAlign();
-		if (!isEmptyString(align)) {
-			int index = _textAlignCombo.indexOf(align);
-			if (index != -1) {
-				_textAlignCombo.select(index);
-			} else {
-				_textAlignCombo.setText(align);
-			}
-		}
-
-		// text-indent
-		String indent = _style.getTextIndent();
-		if (!isEmptyString(indent)) {
-			_textIndentText.setText(indent);
-		}
-
-		// white-space
-		String space = _style.getWhiteSpace();
-		if (!isEmptyString(space)) {
-			int index = _whiteSpaceCombo.indexOf(space);
-			if (index != -1) {
-				_whiteSpaceCombo.select(index);
-			} else {
-				_whiteSpaceCombo.setText(space);
-			}
-		}
-
-		// display
-		String display = _style.getDisplay();
-		if (!isEmptyString(display)) {
-			int index = _displayCombo.indexOf(display);
-			if (index != -1) {
-				_displayCombo.select(index);
-			} else {
-				_displayCombo.setText(display);
-			}
-		}
-	}
-
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-
-		getApplyButton().setVisible(false);
-		getDefaultsButton().setVisible(false);
-	}
-
-    // TODO: seeing this method repeated in on other preference pages..
-	private boolean isEmptyString(String str) {
-		if (str == null || str.length() == 0) {
-			return true;
-		}
-        return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BorderPreferenceNode.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BorderPreferenceNode.java
deleted file mode 100644
index 63e775f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BorderPreferenceNode.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.IPreferenceNode;
-import org.eclipse.jface.preference.IPreferencePage;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class BorderPreferenceNode implements IPreferenceNode {
-	private BorderPreferencePage _page;
-
-	private IDOMElement _element;
-
-	private CSSPropertyContext _style;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public BorderPreferenceNode(IDOMElement element, CSSPropertyContext style) {
-		super();
-		_element = element;
-		_style = style;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#add(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public void add(IPreferenceNode node) {
-        // TODO: do nothing?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#createPage()
-	 */
-	public void createPage() {
-		_page = new BorderPreferencePage(_element, _style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#disposeResources()
-	 */
-	public void disposeResources() {
-        // TODO: do nothing?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#findSubNode(java.lang.String)
-	 */
-	public IPreferenceNode findSubNode(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getId()
-	 */
-	public String getId() {
-		return "Border";
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelImage()
-	 */
-	public Image getLabelImage() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelText()
-	 */
-	public String getLabelText() {
-		return DialogsMessages.getString("BorderPreferenceNode.LabelText");
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getPage()
-	 */
-	public IPreferencePage getPage() {
-		return _page;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getSubNodes()
-	 */
-	public IPreferenceNode[] getSubNodes() {
-		return new IPreferenceNode[0];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(java.lang.String)
-	 */
-	public IPreferenceNode remove(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public boolean remove(IPreferenceNode node) {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BorderPreferencePage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BorderPreferencePage.java
deleted file mode 100644
index 78e99f5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BorderPreferencePage.java
+++ /dev/null
@@ -1,538 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ColorButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class BorderPreferencePage extends PreferencePage {
-	private CSSPropertyContext _style;
-
-	private StyleCombo _styleTopCombo, _styleRightCombo, _styleBottomCombo,
-			_styleLeftCombo;
-
-	private StyleCombo _widthTopNumberCombo, _widthRightNumberCombo,
-			_widthBottomNumberCombo, _widthLeftNumberCombo;
-
-	private StyleCombo _widthTopUnitCombo, _widthRightUnitCombo,
-			_widthBottomUnitCombo, _widthLeftUnitCombo;
-
-	private ColorButtonDialogField _colorTopField, _colorRightField,
-			_colorBottomField, _colorLeftField;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public BorderPreferencePage(IDOMElement element, CSSPropertyContext style) {
-		super();
-		_style = style;
-
-		setTitle(DialogsMessages.getString("BorderPreferencePage.Title")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.
-	 *      PreferencePage#createContents(Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		GridLayout layout;
-		GridData data;
-
-		Composite top = new Composite(parent, SWT.NONE);
-		layout = new GridLayout(1, false);
-		data = new GridData(GridData.FILL_BOTH);
-		top.setLayout(layout);
-		top.setLayoutData(data);
-
-		Group styleGroup = new Group(top, SWT.NONE);
-		styleGroup.setText(DialogsMessages
-				.getString("BorderPreferencePage.Style"));
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		styleGroup.setLayoutData(data);
-		layout = new GridLayout(2, false);
-		styleGroup.setLayout(layout);
-
-		Label styleTopLabel = new Label(styleGroup, SWT.NONE);
-		styleTopLabel.setText(DialogsMessages
-				.getString("BorderPreferencePage.Top"));
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		styleTopLabel.setLayoutData(data);
-
-		_styleTopCombo = new StyleCombo(styleGroup, SWT.NONE);
-		_styleTopCombo.setItems(IStyleConstants.BORDER_STYLE);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_styleTopCombo.setLayoutData(data);
-		_styleTopCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String style = _styleTopCombo.getText();
-				_style.setBorderTopStyle(style);
-			}
-		});
-
-		Label styleRightLabel = new Label(styleGroup, SWT.NONE);
-		styleRightLabel.setText(DialogsMessages
-				.getString("BorderPreferencePage.Right"));
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		styleRightLabel.setLayoutData(data);
-
-		_styleRightCombo = new StyleCombo(styleGroup, SWT.NONE);
-		_styleRightCombo.setItems(IStyleConstants.BORDER_STYLE);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_styleRightCombo.setLayoutData(data);
-		_styleRightCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String style = _styleRightCombo.getText();
-				_style.setBorderRightStyle(style);
-			}
-		});
-
-		Label styleBottomLabel = new Label(styleGroup, SWT.NONE);
-		styleBottomLabel.setText(DialogsMessages
-				.getString("BorderPreferencePage.Bottom"));
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		styleBottomLabel.setLayoutData(data);
-
-		_styleBottomCombo = new StyleCombo(styleGroup, SWT.NONE);
-		_styleBottomCombo.setItems(IStyleConstants.BORDER_STYLE);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_styleBottomCombo.setLayoutData(data);
-		_styleBottomCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String style = _styleBottomCombo.getText();
-				_style.setBorderBottomStyle(style);
-			}
-		});
-
-		Label styleLeftLabel = new Label(styleGroup, SWT.NONE);
-		styleLeftLabel.setText(DialogsMessages
-				.getString("BorderPreferencePage.Left"));
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		styleLeftLabel.setLayoutData(data);
-
-		_styleLeftCombo = new StyleCombo(styleGroup, SWT.NONE);
-		_styleLeftCombo.setItems(IStyleConstants.BORDER_STYLE);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_styleLeftCombo.setLayoutData(data);
-		_styleLeftCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String style = _styleLeftCombo.getText();
-				_style.setBorderLeftStyle(style);
-			}
-		});
-
-		Group colorGroup = new Group(top, SWT.NONE);
-		colorGroup.setText(DialogsMessages
-				.getString("BorderPreferencePage.Color"));
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		colorGroup.setLayoutData(data);
-		layout = new GridLayout(3, false);
-		colorGroup.setLayout(layout);
-
-		_colorTopField = new ColorButtonDialogField(SWT.BORDER, new ColorUtil());
-		_colorTopField.setLabelText(DialogsMessages
-				.getString("BorderPreferencePage.Top"));
-
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		_colorTopField.getLabelControl(null, colorGroup).setLayoutData(data);
-
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_colorTopField.getComboControl(null, colorGroup).setLayoutData(data);
-
-		data = new GridData();
-		_colorTopField.getChangeControl(null, colorGroup).setLayoutData(data);
-		_colorTopField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						String color = _colorTopField.getText();
-						_style.setBorderTopColor(color);
-					}
-				});
-
-		_colorRightField = new ColorButtonDialogField(SWT.BORDER, new ColorUtil());
-		_colorRightField.setLabelText(DialogsMessages
-				.getString("BorderPreferencePage.Right"));
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		_colorRightField.getLabelControl(null, colorGroup).setLayoutData(data);
-
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_colorRightField.getComboControl(null, colorGroup).setLayoutData(data);
-
-		data = new GridData();
-		_colorRightField.getChangeControl(null, colorGroup).setLayoutData(data);
-		_colorRightField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						String color = _colorRightField.getText();
-						_style.setBorderRightColor(color);
-					}
-				});
-
-		_colorBottomField = new ColorButtonDialogField(SWT.BORDER, new ColorUtil());
-		_colorBottomField.setLabelText(DialogsMessages
-				.getString("BorderPreferencePage.Bottom"));
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		_colorBottomField.getLabelControl(null, colorGroup).setLayoutData(data);
-
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_colorBottomField.getComboControl(null, colorGroup).setLayoutData(data);
-
-		data = new GridData();
-		_colorBottomField.getChangeControl(null, colorGroup)
-				.setLayoutData(data);
-		_colorBottomField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						String color = _colorBottomField.getText();
-						_style.setBorderBottomColor(color);
-					}
-				});
-
-		_colorLeftField = new ColorButtonDialogField(SWT.BORDER, new ColorUtil());
-		_colorLeftField.setLabelText(DialogsMessages
-				.getString("BorderPreferencePage.Left"));
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		_colorLeftField.getLabelControl(null, colorGroup).setLayoutData(data);
-
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_colorLeftField.getComboControl(null, colorGroup).setLayoutData(data);
-
-		data = new GridData();
-		_colorLeftField.getChangeControl(null, colorGroup).setLayoutData(data);
-		_colorLeftField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						String color = _colorLeftField.getText();
-						_style.setBorderLeftColor(color);
-					}
-				});
-
-		Group widthGroup = new Group(top, SWT.NONE);
-		widthGroup.setText(DialogsMessages
-				.getString("BorderPreferencePage.Width"));
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		widthGroup.setLayoutData(data);
-		layout = new GridLayout(3, false);
-		widthGroup.setLayout(layout);
-
-		Label widthTopLabel = new Label(widthGroup, SWT.NONE);
-		widthTopLabel.setText(DialogsMessages
-				.getString("BorderPreferencePage.Top"));
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		widthTopLabel.setLayoutData(data);
-
-		_widthTopNumberCombo = new StyleCombo(widthGroup, SWT.NONE);
-		_widthTopNumberCombo.setItems(IStyleConstants.BORDER_WIDTH);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthTopNumberCombo.setLayoutData(data);
-		_widthTopNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_widthTopUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_widthTopNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_widthTopUnitCombo.setEnabled(false);
-				}
-
-				String width = _widthTopNumberCombo.getText();
-				if (_widthTopUnitCombo.isEnabled()) {
-					width += _widthTopUnitCombo.getText();
-				}
-
-				_style.setBorderTopWidth(width);
-			}
-		});
-
-		_widthTopUnitCombo = new StyleCombo(widthGroup, SWT.READ_ONLY);
-		_widthTopUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthTopUnitCombo.setLayoutData(data);
-		_widthTopUnitCombo.select(0);
-		_widthTopUnitCombo.setEnabled(false);
-		_widthTopUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String width = _widthTopNumberCombo.getText();
-				if (_widthTopUnitCombo.isEnabled()) {
-					width += _widthTopUnitCombo.getText();
-				}
-
-				_style.setBorderTopWidth(width);
-			}
-		});
-
-		Label widthRightLabel = new Label(widthGroup, SWT.NONE);
-		widthRightLabel.setText(DialogsMessages
-				.getString("BorderPreferencePage.Right"));
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		widthRightLabel.setLayoutData(data);
-
-		_widthRightNumberCombo = new StyleCombo(widthGroup, SWT.NONE);
-		_widthRightNumberCombo.setItems(IStyleConstants.BORDER_WIDTH);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthRightNumberCombo.setLayoutData(data);
-		_widthRightNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_widthRightUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_widthRightNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_widthRightUnitCombo.setEnabled(false);
-				}
-
-				String width = _widthRightNumberCombo.getText();
-				if (_widthRightUnitCombo.isEnabled()) {
-					width += _widthRightUnitCombo.getText();
-				}
-
-				_style.setBorderRightWidth(width);
-			}
-		});
-
-		_widthRightUnitCombo = new StyleCombo(widthGroup, SWT.READ_ONLY);
-		_widthRightUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthRightUnitCombo.setLayoutData(data);
-		_widthRightUnitCombo.select(0);
-		_widthRightUnitCombo.setEnabled(false);
-		_widthRightUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String width = _widthRightNumberCombo.getText();
-				if (_widthRightUnitCombo.isEnabled()) {
-					width += _widthRightUnitCombo.getText();
-				}
-
-				_style.setBorderRightWidth(width);
-			}
-		});
-
-		Label widthBottomLabel = new Label(widthGroup, SWT.NONE);
-		widthBottomLabel.setText(DialogsMessages
-				.getString("BorderPreferencePage.Bottom"));
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		widthBottomLabel.setLayoutData(data);
-
-		_widthBottomNumberCombo = new StyleCombo(widthGroup, SWT.NONE);
-		_widthBottomNumberCombo.setItems(IStyleConstants.BORDER_WIDTH);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthBottomNumberCombo.setLayoutData(data);
-		_widthBottomNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_widthBottomUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_widthBottomNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_widthBottomUnitCombo.setEnabled(false);
-				}
-
-				String width = _widthBottomNumberCombo.getText();
-				if (_widthBottomUnitCombo.isEnabled()) {
-					width += _widthBottomUnitCombo.getText();
-				}
-
-				_style.setBorderBottomWidth(width);
-			}
-		});
-
-		_widthBottomUnitCombo = new StyleCombo(widthGroup, SWT.READ_ONLY);
-		_widthBottomUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthBottomUnitCombo.setLayoutData(data);
-		_widthBottomUnitCombo.select(0);
-		_widthBottomUnitCombo.setEnabled(false);
-		_widthBottomUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String width = _widthBottomNumberCombo.getText();
-				if (_widthBottomUnitCombo.isEnabled()) {
-					width += _widthBottomUnitCombo.getText();
-				}
-
-				_style.setBorderBottomWidth(width);
-			}
-		});
-
-		Label widthLeftLabel = new Label(widthGroup, SWT.NONE);
-		widthLeftLabel.setText(DialogsMessages
-				.getString("BorderPreferencePage.Left"));
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		widthLeftLabel.setLayoutData(data);
-
-		_widthLeftNumberCombo = new StyleCombo(widthGroup, SWT.NONE);
-		_widthLeftNumberCombo.setItems(IStyleConstants.BORDER_WIDTH);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthLeftNumberCombo.setLayoutData(data);
-		_widthLeftNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_widthLeftUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_widthLeftNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_widthLeftUnitCombo.setEnabled(false);
-				}
-
-				String width = _widthLeftNumberCombo.getText();
-				if (_widthLeftUnitCombo.isEnabled()) {
-					width += _widthLeftUnitCombo.getText();
-				}
-
-				_style.setBorderLeftWidth(width);
-			}
-		});
-
-		_widthLeftUnitCombo = new StyleCombo(widthGroup, SWT.READ_ONLY);
-		_widthLeftUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthLeftUnitCombo.setLayoutData(data);
-		_widthLeftUnitCombo.select(0);
-		_widthLeftUnitCombo.setEnabled(false);
-		_widthLeftUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String width = _widthLeftNumberCombo.getText();
-				if (_widthLeftUnitCombo.isEnabled()) {
-					width += _widthLeftUnitCombo.getText();
-				}
-
-				_style.setBorderLeftWidth(width);
-			}
-		});
-
-		initializeControls();
-
-		return top;
-	}
-
-	private void initializeControls() {
-		// border-style
-		String style = _style.getBorderTopStyle();
-		if (!isEmptyString(style)) {
-			int index = _styleTopCombo.indexOf(style);
-			if (index != -1) {
-				_styleTopCombo.select(index);
-			} else {
-				_styleTopCombo.setText(style);
-			}
-		}
-		style = _style.getBorderRightStyle();
-		if (!isEmptyString(style)) {
-			int index = _styleRightCombo.indexOf(style);
-			if (index != -1) {
-				_styleRightCombo.select(index);
-			} else {
-				_styleRightCombo.setText(style);
-			}
-		}
-		style = _style.getBorderBottomStyle();
-		if (!isEmptyString(style)) {
-			int index = _styleBottomCombo.indexOf(style);
-			if (index != -1) {
-				_styleBottomCombo.select(index);
-			} else {
-				_styleBottomCombo.setText(style);
-			}
-		}
-		style = _style.getBorderLeftStyle();
-		if (!isEmptyString(style)) {
-			int index = _styleLeftCombo.indexOf(style);
-			if (index != -1) {
-				_styleLeftCombo.select(index);
-			} else {
-				_styleLeftCombo.setText(style);
-			}
-		}
-
-		// border-color
-		String color = _style.getBorderTopColor();
-		if (!isEmptyString(color)) {
-			_colorTopField.setTextWithoutUpdate(color);
-		}
-		color = _style.getBorderRightColor();
-		if (!isEmptyString(color)) {
-			_colorRightField.setTextWithoutUpdate(color);
-		}
-		color = _style.getBorderBottomColor();
-		if (!isEmptyString(color)) {
-			_colorBottomField.setTextWithoutUpdate(color);
-		}
-		color = _style.getBorderLeftColor();
-		if (!isEmptyString(color)) {
-			_colorLeftField.setTextWithoutUpdate(color);
-		}
-
-		// border-width
-		String width = _style.getBorderTopWidth();
-		if (!isEmptyString(width)) {
-			int index = _widthTopNumberCombo.indexOf(width);
-			if (index != -1) {
-				_widthTopNumberCombo.select(index);
-			} else {
-				_widthTopNumberCombo.setText(width);
-			}
-		}
-		width = _style.getBorderRightWidth();
-		if (!isEmptyString(width)) {
-			int index = _widthRightNumberCombo.indexOf(width);
-			if (index != -1) {
-				_widthRightNumberCombo.select(index);
-			} else {
-				_widthRightNumberCombo.setText(width);
-			}
-		}
-		width = _style.getBorderBottomWidth();
-		if (!isEmptyString(width)) {
-			int index = _widthBottomNumberCombo.indexOf(width);
-			if (index != -1) {
-				_widthBottomNumberCombo.select(index);
-			} else {
-				_widthBottomNumberCombo.setText(width);
-			}
-		}
-		width = _style.getBorderLeftWidth();
-		if (!isEmptyString(width)) {
-			int index = _widthLeftNumberCombo.indexOf(width);
-			if (index != -1) {
-				_widthLeftNumberCombo.select(index);
-			} else {
-				_widthLeftNumberCombo.setText(width);
-			}
-		}
-	}
-
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-
-		getApplyButton().setVisible(false);
-		getDefaultsButton().setVisible(false);
-	}
-
-	private boolean isEmptyString(String str) {
-		if (str == null || str.length() == 0) {
-			return true;
-		}
-        return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BoxPreferenceNode.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BoxPreferenceNode.java
deleted file mode 100644
index 8899b9f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BoxPreferenceNode.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.IPreferenceNode;
-import org.eclipse.jface.preference.IPreferencePage;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class BoxPreferenceNode implements IPreferenceNode {
-	private BoxPreferencePage _page;
-
-	private IDOMElement _element;
-
-	private CSSPropertyContext _styles;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public BoxPreferenceNode(IDOMElement element, CSSPropertyContext style) {
-		super();
-		_element = element;
-		_styles = style;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#add(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public void add(IPreferenceNode node) {
-        // TODO: this pattern is being repeated; perhaps need common super for preference nodes?
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#createPage()
-	 */
-	public void createPage() {
-		_page = new BoxPreferencePage(_element, _styles);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#disposeResources()
-	 */
-	public void disposeResources() {
-        // TODO:
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#findSubNode(java.lang.String)
-	 */
-	public IPreferenceNode findSubNode(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getId()
-	 */
-	public String getId() {
-		return "Box";
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelImage()
-	 */
-	public Image getLabelImage() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelText()
-	 */
-	public String getLabelText() {
-		return DialogsMessages.getString("BoxPreferenceNode.LabelText");
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getPage()
-	 */
-	public IPreferencePage getPage() {
-		return _page;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getSubNodes()
-	 */
-	public IPreferenceNode[] getSubNodes() {
-		return new IPreferenceNode[0];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(java.lang.String)
-	 */
-	public IPreferenceNode remove(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public boolean remove(IPreferenceNode node) {
-		return false;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BoxPreferencePage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BoxPreferencePage.java
deleted file mode 100644
index 697944f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/BoxPreferencePage.java
+++ /dev/null
@@ -1,673 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class BoxPreferencePage extends PreferencePage {
-	private CSSPropertyContext _style;
-
-	private StyleCombo _widthNumberCombo, _widthUnitCombo, _heightNumberCombo,
-			_heightUnitCombo, _clearCombo;
-
-	private Text _paddingTopNumberText, _paddingRightNumberText,
-			_paddingBottomNumberText, _paddingLeftNumberText;
-
-	private StyleCombo _paddingTopUnitCombo, _paddingRightUnitCombo,
-			_paddingBottomUnitCombo, _paddingLeftUnitCombo;
-
-	private StyleCombo _marginTopNumberCombo, _marginRightNumberCombo,
-			_marginBottomNumberCombo, _marginLeftNumberCombo;
-
-	private StyleCombo _marginTopUnitCombo, _marginRightUnitCombo,
-			_marginBottomUnitCombo, _marginLeftUnitCombo;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public BoxPreferencePage(IDOMElement element, CSSPropertyContext style) {
-		super();
-		_style = style;
-
-		setTitle(DialogsMessages.getString("BoxPreferencePage.Title")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.
-	 *      PreferencePage#createContents(Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		GridLayout layout;
-		GridData data;
-
-		Composite top = new Composite(parent, SWT.NONE);
-		layout = new GridLayout(6, false);
-		data = new GridData(GridData.FILL_BOTH);
-		top.setLayout(layout);
-		top.setLayoutData(data);
-
-		Label widthLabel = new Label(top, SWT.NONE);
-		widthLabel
-				.setText(DialogsMessages.getString("BoxPreferencePage.Width")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		widthLabel.setLayoutData(data);
-
-		_widthNumberCombo = new StyleCombo(top, SWT.NONE);
-		_widthNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthNumberCombo.setLayoutData(data);
-		_widthNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_widthUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_widthNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_widthUnitCombo.setEnabled(false);
-				}
-
-				String width = _widthNumberCombo.getText();
-				if (_widthUnitCombo.isEnabled()) {
-					width += _widthUnitCombo.getText();
-				}
-
-				_style.setWidth(width);
-			}
-		});
-
-		_widthUnitCombo = new StyleCombo(top, SWT.READ_ONLY);
-		_widthUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthUnitCombo.setLayoutData(data);
-		_widthUnitCombo.select(0);
-		_widthUnitCombo.setEnabled(false);
-		_widthUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String width = _widthNumberCombo.getText();
-				if (_widthUnitCombo.isEnabled()) {
-					width += _widthUnitCombo.getText();
-				}
-
-				_style.setWidth(width);
-			}
-		});
-
-		Label clearLabel = new Label(top, SWT.NONE);
-		clearLabel
-				.setText(DialogsMessages.getString("BoxPreferencePage.Clear")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		clearLabel.setLayoutData(data);
-
-		_clearCombo = new StyleCombo(top, SWT.NONE);
-		_clearCombo.setItems(IStyleConstants.CLEAR);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_clearCombo.setLayoutData(data);
-		_clearCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String clear = _clearCombo.getText();
-				_style.setClear(clear);
-			}
-		});
-
-		new Label(top, SWT.NONE);
-
-		Label heightLabel = new Label(top, SWT.NONE);
-		heightLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Height")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		heightLabel.setLayoutData(data);
-
-		_heightNumberCombo = new StyleCombo(top, SWT.NONE);
-		_heightNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_heightNumberCombo.setLayoutData(data);
-		_heightNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_heightUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_heightNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_heightUnitCombo.setEnabled(false);
-				}
-
-				String height = _heightNumberCombo.getText();
-				if (_heightUnitCombo.isEnabled()) {
-					height += _heightUnitCombo.getText();
-				}
-
-				_style.setHeight(height);
-			}
-		});
-
-		_heightUnitCombo = new StyleCombo(top, SWT.READ_ONLY);
-		_heightUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_heightUnitCombo.setLayoutData(data);
-		_heightUnitCombo.select(0);
-		_heightUnitCombo.setEnabled(false);
-		_heightUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String height = _heightNumberCombo.getText();
-				if (_heightUnitCombo.isEnabled()) {
-					height += _heightNumberCombo.getText();
-				}
-
-				_style.setHeight(height);
-			}
-		});
-
-		new Label(top, SWT.NONE);
-		new Label(top, SWT.NONE);
-		new Label(top, SWT.NONE);
-
-		Group paddingGroup = new Group(top, SWT.NONE);
-		paddingGroup.setText(DialogsMessages
-				.getString("BoxPreferencePage.Padding"));
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		data.horizontalSpan = 3;
-		data.verticalSpan = 4;
-		paddingGroup.setLayoutData(data);
-		layout = new GridLayout(3, false);
-		paddingGroup.setLayout(layout);
-
-		Label paddingTopLabel = new Label(paddingGroup, SWT.NONE);
-		paddingTopLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Top")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		paddingTopLabel.setLayoutData(data);
-
-		_paddingTopNumberText = new Text(paddingGroup, SWT.BORDER);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_paddingTopNumberText.setLayoutData(data);
-		_paddingTopNumberText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_paddingTopUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_paddingTopNumberText.getText());
-				} catch (NumberFormatException ex) {
-					_paddingTopUnitCombo.setEnabled(false);
-				}
-
-				String padding = _paddingTopNumberText.getText();
-				if (_paddingTopUnitCombo.isEnabled()) {
-					padding += _paddingTopUnitCombo.getText();
-				}
-
-				_style.setPaddingTop(padding);
-			}
-		});
-
-		_paddingTopUnitCombo = new StyleCombo(paddingGroup, SWT.READ_ONLY);
-		_paddingTopUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_paddingTopUnitCombo.setLayoutData(data);
-		_paddingTopUnitCombo.select(0);
-		_paddingTopUnitCombo.setEnabled(false);
-		_paddingTopUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String padding = _paddingTopNumberText.getText();
-				if (_paddingTopUnitCombo.isEnabled()) {
-					padding += _paddingTopUnitCombo.getText();
-				}
-
-				_style.setPaddingTop(padding);
-			}
-		});
-
-		Label paddingRightLabel = new Label(paddingGroup, SWT.NONE);
-		paddingRightLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Right")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		paddingRightLabel.setLayoutData(data);
-
-		_paddingRightNumberText = new Text(paddingGroup, SWT.BORDER);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_paddingRightNumberText.setLayoutData(data);
-		_paddingRightNumberText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_paddingRightUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_paddingRightNumberText.getText());
-				} catch (NumberFormatException ex) {
-					_paddingRightUnitCombo.setEnabled(false);
-				}
-
-				String padding = _paddingRightNumberText.getText();
-				if (_paddingRightUnitCombo.isEnabled()) {
-					padding += _paddingRightUnitCombo.getText();
-				}
-
-				_style.setPaddingRight(padding);
-			}
-		});
-
-		_paddingRightUnitCombo = new StyleCombo(paddingGroup, SWT.READ_ONLY);
-		_paddingRightUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_paddingRightUnitCombo.setLayoutData(data);
-		_paddingRightUnitCombo.select(0);
-		_paddingRightUnitCombo.setEnabled(false);
-		_paddingRightUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String padding = _paddingRightNumberText.getText();
-				if (_paddingRightUnitCombo.isEnabled()) {
-					padding += _paddingRightUnitCombo.getText();
-				}
-
-				_style.setPaddingRight(padding);
-			}
-		});
-
-		Label paddingBottomLabel = new Label(paddingGroup, SWT.NONE);
-		paddingBottomLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Bottom")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		paddingBottomLabel.setLayoutData(data);
-
-		_paddingBottomNumberText = new Text(paddingGroup, SWT.BORDER);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_paddingBottomNumberText.setLayoutData(data);
-		_paddingBottomNumberText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_paddingBottomUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_paddingBottomNumberText.getText());
-				} catch (NumberFormatException ex) {
-					_paddingBottomUnitCombo.setEnabled(false);
-				}
-
-				String padding = _paddingBottomNumberText.getText();
-				if (_paddingBottomUnitCombo.isEnabled()) {
-					padding += _paddingBottomUnitCombo.getText();
-				}
-
-				_style.setPaddingBottom(padding);
-			}
-		});
-
-		_paddingBottomUnitCombo = new StyleCombo(paddingGroup, SWT.READ_ONLY);
-		_paddingBottomUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_paddingBottomUnitCombo.setLayoutData(data);
-		_paddingBottomUnitCombo.select(0);
-		_paddingBottomUnitCombo.setEnabled(false);
-		_paddingBottomUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String padding = _paddingBottomNumberText.getText();
-				if (_paddingBottomUnitCombo.isEnabled()) {
-					padding += _paddingBottomUnitCombo.getText();
-				}
-
-				_style.setPaddingBottom(padding);
-			}
-		});
-
-		Label paddingLeftLabel = new Label(paddingGroup, SWT.NONE);
-		paddingLeftLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Left")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		paddingLeftLabel.setLayoutData(data);
-
-		_paddingLeftNumberText = new Text(paddingGroup, SWT.BORDER);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_paddingLeftNumberText.setLayoutData(data);
-		_paddingLeftNumberText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_paddingLeftUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_paddingLeftNumberText.getText());
-				} catch (NumberFormatException ex) {
-					_paddingLeftUnitCombo.setEnabled(false);
-				}
-
-				String top1 = _paddingLeftNumberText.getText();
-				if (_paddingLeftUnitCombo.isEnabled()) {
-					top1 += _paddingLeftUnitCombo.getText();
-				}
-
-				_style.setPaddingLeft(top1);
-			}
-		});
-
-		_paddingLeftUnitCombo = new StyleCombo(paddingGroup, SWT.READ_ONLY);
-		_paddingLeftUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_paddingLeftUnitCombo.setLayoutData(data);
-		_paddingLeftUnitCombo.select(0);
-		_paddingLeftUnitCombo.setEnabled(false);
-		_paddingLeftUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String top1 = _paddingLeftNumberText.getText();
-				if (_paddingLeftUnitCombo.isEnabled()) {
-					top1 += _paddingLeftUnitCombo.getText();
-				}
-
-				_style.setPaddingLeft(top1);
-			}
-		});
-
-		Group marginGroup = new Group(top, SWT.NONE);
-		marginGroup.setText(DialogsMessages
-				.getString("BoxPreferencePage.Margin"));
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		data.horizontalSpan = 3;
-		data.verticalSpan = 4;
-		marginGroup.setLayoutData(data);
-		layout = new GridLayout(3, false);
-		marginGroup.setLayout(layout);
-
-		Label marginTopLabel = new Label(marginGroup, SWT.NONE);
-		marginTopLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Top")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		marginTopLabel.setLayoutData(data);
-
-		_marginTopNumberCombo = new StyleCombo(marginGroup, SWT.NONE);
-		_marginTopNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_marginTopNumberCombo.setLayoutData(data);
-		_marginTopNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_marginTopUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_marginTopNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_marginTopUnitCombo.setEnabled(false);
-				}
-
-				String margin = _marginTopNumberCombo.getText();
-				if (_marginTopUnitCombo.isEnabled()) {
-					margin += _marginTopUnitCombo.getText();
-				}
-
-				_style.setMarginTop(margin);
-			}
-		});
-
-		_marginTopUnitCombo = new StyleCombo(marginGroup, SWT.READ_ONLY);
-		_marginTopUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_marginTopUnitCombo.setLayoutData(data);
-		_marginTopUnitCombo.select(0);
-		_marginTopUnitCombo.setEnabled(false);
-		_marginTopUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String margin = _marginTopNumberCombo.getText();
-				if (_marginTopUnitCombo.isEnabled()) {
-					margin += _marginTopUnitCombo.getText();
-				}
-
-				_style.setMarginTop(margin);
-			}
-		});
-
-		Label marginRightLabel = new Label(marginGroup, SWT.NONE);
-		marginRightLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Right")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		marginRightLabel.setLayoutData(data);
-
-		_marginRightNumberCombo = new StyleCombo(marginGroup, SWT.NONE);
-		_marginRightNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_marginRightNumberCombo.setLayoutData(data);
-		_marginRightNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_marginRightUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_marginRightNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_marginRightUnitCombo.setEnabled(false);
-				}
-
-				String margin = _marginRightNumberCombo.getText();
-				if (_marginRightUnitCombo.isEnabled()) {
-					margin += _marginRightUnitCombo.getText();
-				}
-
-				_style.setMarginRight(margin);
-			}
-		});
-
-		_marginRightUnitCombo = new StyleCombo(marginGroup, SWT.READ_ONLY);
-		_marginRightUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_marginRightUnitCombo.setLayoutData(data);
-		_marginRightUnitCombo.select(0);
-		_marginRightUnitCombo.setEnabled(false);
-		_marginRightUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String margin = _marginRightNumberCombo.getText();
-				if (_marginRightUnitCombo.isEnabled()) {
-					margin += _marginRightUnitCombo.getText();
-				}
-
-				_style.setMarginRight(margin);
-			}
-		});
-
-		Label marginBottomLabel = new Label(marginGroup, SWT.NONE);
-		marginBottomLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Bottom")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		marginBottomLabel.setLayoutData(data);
-
-		_marginBottomNumberCombo = new StyleCombo(marginGroup, SWT.NONE);
-		_marginBottomNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_marginBottomNumberCombo.setLayoutData(data);
-		_marginBottomNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_marginBottomUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_marginBottomNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_marginBottomUnitCombo.setEnabled(false);
-				}
-
-				String margin = _marginBottomNumberCombo.getText();
-				if (_marginBottomUnitCombo.isEnabled()) {
-					margin += _marginBottomUnitCombo.getText();
-				}
-
-				_style.setMarginBottom(margin);
-			}
-		});
-
-		_marginBottomUnitCombo = new StyleCombo(marginGroup, SWT.READ_ONLY);
-		_marginBottomUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_marginBottomUnitCombo.setLayoutData(data);
-		_marginBottomUnitCombo.select(0);
-		_marginBottomUnitCombo.setEnabled(false);
-		_marginBottomUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String margin = _marginBottomNumberCombo.getText();
-				if (_marginBottomUnitCombo.isEnabled()) {
-					margin += _marginBottomUnitCombo.getText();
-				}
-
-				_style.setMarginBottom(margin);
-			}
-		});
-
-		Label marginLeftLabel = new Label(marginGroup, SWT.NONE);
-		marginLeftLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Left")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		marginLeftLabel.setLayoutData(data);
-
-		_marginLeftNumberCombo = new StyleCombo(marginGroup, SWT.NONE);
-		_marginLeftNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_marginLeftNumberCombo.setLayoutData(data);
-		_marginLeftNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_marginLeftUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_marginLeftNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_marginLeftUnitCombo.setEnabled(false);
-				}
-
-				String top1 = _marginLeftNumberCombo.getText();
-				if (_marginLeftUnitCombo.isEnabled()) {
-					top1 += _marginLeftUnitCombo.getText();
-				}
-
-				_style.setMarginLeft(top1);
-			}
-		});
-
-		_marginLeftUnitCombo = new StyleCombo(marginGroup, SWT.READ_ONLY);
-		_marginLeftUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_marginLeftUnitCombo.setLayoutData(data);
-		_marginLeftUnitCombo.select(0);
-		_marginLeftUnitCombo.setEnabled(false);
-		_marginLeftUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String top1 = _marginLeftNumberCombo.getText();
-				if (_marginLeftUnitCombo.isEnabled()) {
-					top1 += _marginLeftUnitCombo.getText();
-				}
-
-				_style.setMarginLeft(top1);
-			}
-		});
-
-		initializeControls();
-
-		return top;
-	}
-
-	private void initializeControls() {
-		// width
-		String width = _style.getWidth();
-		if (!isEmptyString(width)) {
-			int index = _widthNumberCombo.indexOf(width);
-			if (index != -1) {
-				_widthNumberCombo.select(index);
-			} else {
-				_widthNumberCombo.setText(width);
-			}
-		}
-
-		// height
-		String height = _style.getHeight();
-		if (!isEmptyString(height)) {
-			int index = _heightNumberCombo.indexOf(height);
-			if (index != -1) {
-				_heightNumberCombo.select(index);
-			} else {
-				_heightNumberCombo.setText(height);
-			}
-		}
-
-		// clear
-		String clear = _style.getClear();
-		if (!isEmptyString(clear)) {
-			int index = _clearCombo.indexOf(clear);
-			if (index != -1) {
-				_clearCombo.select(index);
-			} else {
-				_clearCombo.setText(clear);
-			}
-		}
-
-		// padding
-		String padding = _style.getPaddingTop();
-		if (!isEmptyString(padding)) {
-			_paddingTopNumberText.setText(padding);
-		}
-		padding = _style.getPaddingRight();
-		if (!isEmptyString(padding)) {
-			_paddingRightNumberText.setText(padding);
-		}
-		padding = _style.getPaddingBottom();
-		if (!isEmptyString(padding)) {
-			_paddingBottomNumberText.setText(padding);
-		}
-		padding = _style.getPaddingLeft();
-		if (!isEmptyString(padding)) {
-			_paddingLeftNumberText.setText(padding);
-		}
-
-		// margin
-		String margin = _style.getMarginTop();
-		if (!isEmptyString(margin)) {
-			int index = _marginTopNumberCombo.indexOf(margin);
-			if (index != -1) {
-				_marginTopNumberCombo.select(index);
-			} else {
-				_marginTopNumberCombo.setText(margin);
-			}
-		}
-		margin = _style.getMarginRight();
-		if (!isEmptyString(margin)) {
-			int index = _marginRightNumberCombo.indexOf(margin);
-			if (index != -1) {
-				_marginRightNumberCombo.select(index);
-			} else {
-				_marginRightNumberCombo.setText(margin);
-			}
-		}
-		margin = _style.getMarginBottom();
-		if (!isEmptyString(margin)) {
-			int index = _marginBottomNumberCombo.indexOf(margin);
-			if (index != -1) {
-				_marginBottomNumberCombo.select(index);
-			} else {
-				_marginBottomNumberCombo.setText(margin);
-			}
-		}
-		margin = _style.getMarginLeft();
-		if (!isEmptyString(margin)) {
-			int index = _marginLeftNumberCombo.indexOf(margin);
-			if (index != -1) {
-				_marginLeftNumberCombo.select(index);
-			} else {
-				_marginLeftNumberCombo.setText(margin);
-			}
-		}
-	}
-
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-
-		getApplyButton().setVisible(false);
-		getDefaultsButton().setVisible(false);
-	}
-
-	private boolean isEmptyString(String str) {
-		if (str == null || str.length() == 0) {
-			return true;
-		}
-        return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ColorUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ColorUtil.java
deleted file mode 100644
index 39349a9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ColorUtil.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ColorPalette;
-import org.eclipse.swt.graphics.Color;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ColorUtil extends ColorPalette {
-	private static final Map EXTENDED_COLORS = new HashMap(20);
-
-	private static final Map BASIC_COLORS = new HashMap(143);
-
-	static {
-		BASIC_COLORS.put("Aqua", new Color(null, 0x00, 0xFF, 0xFF));
-		BASIC_COLORS.put("Black", new Color(null, 0x00, 0x00, 0x00));
-		BASIC_COLORS.put("Blue", new Color(null, 0x00, 0x00, 0xFF));
-		BASIC_COLORS.put("Fuchsia", new Color(null, 0xFF, 0x00, 0xFF));
-		BASIC_COLORS.put("Gray", new Color(null, 0x80, 0x80, 0x80));
-		BASIC_COLORS.put("Green", new Color(null, 0x00, 0x80, 0x00));
-		BASIC_COLORS.put("Lime", new Color(null, 0x00, 0xFF, 0x00));
-		BASIC_COLORS.put("Maroon", new Color(null, 0x80, 0x00, 0x00));
-		BASIC_COLORS.put("Navy", new Color(null, 0x00, 0x00, 0x80));
-		BASIC_COLORS.put("Olive", new Color(null, 0x80, 0x80, 0x00));
-		BASIC_COLORS.put("Purple", new Color(null, 0x80, 0x00, 0x80));
-		BASIC_COLORS.put("Red", new Color(null, 0xFF, 0x00, 0x00));
-		BASIC_COLORS.put("Silver", new Color(null, 0xC0, 0xC0, 0xC0));
-		BASIC_COLORS.put("Teal", new Color(null, 0x00, 0x80, 0x80));
-		BASIC_COLORS.put("White", new Color(null, 0xFF, 0xFF, 0xFF));
-		BASIC_COLORS.put("Yellow", new Color(null, 0xFF, 0xFF, 0x00));
-	}
-
-	static {
-		EXTENDED_COLORS.put("AliceBlue", new Color(null, 0xF0, 0xF8, 0xFF));
-		EXTENDED_COLORS.put("AntiqueWhite", new Color(null, 0xFA, 0xEB, 0xD7));
-		EXTENDED_COLORS.put("Aqua", new Color(null, 0x00, 0xFF, 0xFF));
-		EXTENDED_COLORS.put("Aquamarine", new Color(null, 0x7F, 0xFF, 0xD4));
-		EXTENDED_COLORS.put("Azure", new Color(null, 0xF0, 0xFF, 0xFF));
-		EXTENDED_COLORS.put("Beige", new Color(null, 0xF5, 0xF5, 0xDC));
-		EXTENDED_COLORS.put("Bisque", new Color(null, 0xFF, 0xE4, 0xC4));
-		EXTENDED_COLORS.put("Black", new Color(null, 0x00, 0x00, 0x00));
-		EXTENDED_COLORS
-				.put("BlanchedAlmond", new Color(null, 0xFF, 0xEB, 0xCD));
-		EXTENDED_COLORS.put("Blue", new Color(null, 0x00, 0x00, 0xFF));
-		EXTENDED_COLORS.put("BlueViolet", new Color(null, 0x8A, 0x2B, 0xE2));
-		EXTENDED_COLORS.put("Brown", new Color(null, 0xA5, 0x2A, 0x2A));
-		EXTENDED_COLORS.put("BurlyWood", new Color(null, 0xDE, 0xB8, 0x87));
-		EXTENDED_COLORS.put("CadetBlue", new Color(null, 0x5F, 0x9E, 0xA0));
-		EXTENDED_COLORS.put("Chartreuse", new Color(null, 0x7F, 0xFF, 0x00));
-		EXTENDED_COLORS.put("Chocolate", new Color(null, 0xD2, 0x69, 0x1E));
-		EXTENDED_COLORS.put("Coral", new Color(null, 0xFF, 0x7F, 0x50));
-		EXTENDED_COLORS
-				.put("CornflowerBlue", new Color(null, 0x64, 0x95, 0xED));
-		EXTENDED_COLORS.put("Cornsilk", new Color(null, 0xFF, 0xF8, 0xDC));
-		EXTENDED_COLORS.put("Crimson", new Color(null, 0xDC, 0x14, 0x3C));
-		EXTENDED_COLORS.put("Cyan", new Color(null, 0x00, 0xFF, 0xFF));
-		EXTENDED_COLORS.put("DarkBlue", new Color(null, 0x00, 0x00, 0x8B));
-		EXTENDED_COLORS.put("DarkCyan", new Color(null, 0x00, 0x8B, 0x8B));
-		EXTENDED_COLORS.put("DarkGoldenRod", new Color(null, 0xB8, 0x86, 0x0B));
-		EXTENDED_COLORS.put("DarkGray", new Color(null, 0xA9, 0xA9, 0xA9));
-		EXTENDED_COLORS.put("DarkGreen", new Color(null, 0x00, 0x64, 0x00));
-		EXTENDED_COLORS.put("DarkKhaki", new Color(null, 0xBD, 0xB7, 0x6B));
-		EXTENDED_COLORS.put("DarkMagenta", new Color(null, 0x8B, 0x00, 0x8B));
-		EXTENDED_COLORS
-				.put("DarkOliveGreen", new Color(null, 0x55, 0x6B, 0x2F));
-		EXTENDED_COLORS.put("Darkorange", new Color(null, 0xFF, 0x8C, 0x00));
-		EXTENDED_COLORS.put("DarkOrchid", new Color(null, 0x99, 0x32, 0xCC));
-		EXTENDED_COLORS.put("DarkRed", new Color(null, 0x8B, 0x00, 0x00));
-		EXTENDED_COLORS.put("DarkSalmon", new Color(null, 0xE9, 0x96, 0x7A));
-		EXTENDED_COLORS.put("DarkSeaGreen", new Color(null, 0x8F, 0xBC, 0x8F));
-		EXTENDED_COLORS.put("DarkSlateBlue", new Color(null, 0x48, 0x3D, 0x8B));
-		EXTENDED_COLORS.put("DarkSlateGray", new Color(null, 0x2F, 0x4F, 0x4F));
-		EXTENDED_COLORS.put("DarkTurquoise", new Color(null, 0x00, 0xCE, 0xD1));
-		EXTENDED_COLORS.put("DarkViolet", new Color(null, 0x94, 0x00, 0xD3));
-		EXTENDED_COLORS.put("DeepPink", new Color(null, 0xFF, 0x14, 0x93));
-		EXTENDED_COLORS.put("DeepSkyBlue", new Color(null, 0x00, 0xBF, 0xFF));
-		EXTENDED_COLORS.put("DimGray", new Color(null, 0x69, 0x69, 0x69));
-		EXTENDED_COLORS.put("DodgerBlue", new Color(null, 0x1E, 0x90, 0xFF));
-		EXTENDED_COLORS.put("Feldspar", new Color(null, 0xD1, 0x92, 0x75));
-		EXTENDED_COLORS.put("FireBrick", new Color(null, 0xB2, 0x22, 0x22));
-		EXTENDED_COLORS.put("FloralWhite", new Color(null, 0xFF, 0xFA, 0xF0));
-		EXTENDED_COLORS.put("ForestGreen", new Color(null, 0x22, 0x8B, 0x22));
-		EXTENDED_COLORS.put("Fuchsia", new Color(null, 0xFF, 0x00, 0xFF));
-		EXTENDED_COLORS.put("Gainsboro", new Color(null, 0xDC, 0xDC, 0xDC));
-		EXTENDED_COLORS.put("GhostWhite", new Color(null, 0xF8, 0xF8, 0xFF));
-		EXTENDED_COLORS.put("Gold", new Color(null, 0xFF, 0xD7, 0x00));
-		EXTENDED_COLORS.put("GoldenRod", new Color(null, 0xDA, 0xA5, 0x20));
-		EXTENDED_COLORS.put("Gray", new Color(null, 0x80, 0x80, 0x80));
-		EXTENDED_COLORS.put("Green", new Color(null, 0x00, 0x80, 0x00));
-		EXTENDED_COLORS.put("GreenYellow", new Color(null, 0xAD, 0xFF, 0x2F));
-		EXTENDED_COLORS.put("HoneyDew", new Color(null, 0xF0, 0xFF, 0xF0));
-		EXTENDED_COLORS.put("HotPink", new Color(null, 0xFF, 0x69, 0xB4));
-		EXTENDED_COLORS.put("IndianRed", new Color(null, 0xCD, 0x5C, 0x5C));
-		EXTENDED_COLORS.put("Indigo", new Color(null, 0x4B, 0x00, 0x82));
-		EXTENDED_COLORS.put("Ivory", new Color(null, 0xFF, 0xFF, 0xF0));
-		EXTENDED_COLORS.put("Khaki", new Color(null, 0xF0, 0xE6, 0x8C));
-		EXTENDED_COLORS.put("Lavender", new Color(null, 0xE6, 0xE6, 0xFA));
-		EXTENDED_COLORS.put("LavenderBlush", new Color(null, 0xFF, 0xF0, 0xF5));
-		EXTENDED_COLORS.put("LawnGreen", new Color(null, 0x7C, 0xFC, 0x00));
-		EXTENDED_COLORS.put("LemonChiffon", new Color(null, 0xFF, 0xFA, 0xCD));
-		EXTENDED_COLORS.put("LightBlue", new Color(null, 0xAD, 0xD8, 0xE6));
-		EXTENDED_COLORS.put("LightCoral", new Color(null, 0xF0, 0x80, 0x80));
-		EXTENDED_COLORS.put("LightCyan", new Color(null, 0xE0, 0xFF, 0xFF));
-		EXTENDED_COLORS.put("LightGoldenRodYellow", new Color(null, 0xFA, 0xFA,
-				0xD2));
-		EXTENDED_COLORS.put("LightGrey", new Color(null, 0xD3, 0xD3, 0xD3));
-		EXTENDED_COLORS.put("LightGreen", new Color(null, 0x90, 0xEE, 0x90));
-		EXTENDED_COLORS.put("LightPink", new Color(null, 0xFF, 0xB6, 0xC1));
-		EXTENDED_COLORS.put("LightSalmon", new Color(null, 0xFF, 0xA0, 0x7A));
-		EXTENDED_COLORS.put("LightSeaGreen", new Color(null, 0x20, 0xB2, 0xAA));
-		EXTENDED_COLORS.put("LightSkyBlue", new Color(null, 0x87, 0xCE, 0xFA));
-		EXTENDED_COLORS
-				.put("LightSlateBlue", new Color(null, 0x84, 0x70, 0xFF));
-		EXTENDED_COLORS
-				.put("LightSlateGray", new Color(null, 0x77, 0x88, 0x99));
-		EXTENDED_COLORS
-				.put("LightSteelBlue", new Color(null, 0xB0, 0xC4, 0xDE));
-		EXTENDED_COLORS.put("LightYellow", new Color(null, 0xFF, 0xFF, 0xE0));
-		EXTENDED_COLORS.put("Lime", new Color(null, 0x00, 0xFF, 0x00));
-		EXTENDED_COLORS.put("LimeGreen", new Color(null, 0x32, 0xCD, 0x32));
-		EXTENDED_COLORS.put("Linen", new Color(null, 0xFA, 0xF0, 0xE6));
-		EXTENDED_COLORS.put("Magenta", new Color(null, 0xFF, 0x00, 0xFF));
-		EXTENDED_COLORS.put("Maroon", new Color(null, 0x80, 0x00, 0x00));
-		EXTENDED_COLORS.put("MediumAquaMarine", new Color(null, 0x66, 0xCD,
-				0xAA));
-		EXTENDED_COLORS.put("MediumBlue", new Color(null, 0x00, 0x00, 0xCD));
-		EXTENDED_COLORS.put("MediumOrchid", new Color(null, 0xBA, 0x55, 0xD3));
-		EXTENDED_COLORS.put("MediumPurple", new Color(null, 0x93, 0x70, 0xD8));
-		EXTENDED_COLORS
-				.put("MediumSeaGreen", new Color(null, 0x3C, 0xB3, 0x71));
-		EXTENDED_COLORS.put("MediumSlateBlue",
-				new Color(null, 0x7B, 0x68, 0xEE));
-		EXTENDED_COLORS.put("MediumSpringGreen", new Color(null, 0x00, 0xFA,
-				0x9A));
-		EXTENDED_COLORS.put("MediumTurquoise",
-				new Color(null, 0x48, 0xD1, 0xCC));
-		EXTENDED_COLORS.put("MediumVioletRed",
-				new Color(null, 0xC7, 0x15, 0x85));
-		EXTENDED_COLORS.put("MidnightBlue", new Color(null, 0x19, 0x19, 0x70));
-		EXTENDED_COLORS.put("MintCream", new Color(null, 0xF5, 0xFF, 0xFA));
-		EXTENDED_COLORS.put("MistyRose", new Color(null, 0xFF, 0xE4, 0xE1));
-		EXTENDED_COLORS.put("Moccasin", new Color(null, 0xFF, 0xE4, 0xB5));
-		EXTENDED_COLORS.put("NavajoWhite", new Color(null, 0xFF, 0xDE, 0xAD));
-		EXTENDED_COLORS.put("Navy", new Color(null, 0x00, 0x00, 0x80));
-		EXTENDED_COLORS.put("OldLace", new Color(null, 0xFD, 0xF5, 0xE6));
-		EXTENDED_COLORS.put("Olive", new Color(null, 0x80, 0x80, 0x00));
-		EXTENDED_COLORS.put("OliveDrab", new Color(null, 0x6B, 0x8E, 0x23));
-		EXTENDED_COLORS.put("Orange", new Color(null, 0xFF, 0xA5, 0x00));
-		EXTENDED_COLORS.put("OrangeRed", new Color(null, 0xFF, 0x45, 0x00));
-		EXTENDED_COLORS.put("Orchid", new Color(null, 0xDA, 0x70, 0xD6));
-		EXTENDED_COLORS.put("PaleGoldenRod", new Color(null, 0xEE, 0xE8, 0xAA));
-		EXTENDED_COLORS.put("PaleGreen", new Color(null, 0x98, 0xFB, 0x98));
-		EXTENDED_COLORS.put("PaleTurquoise", new Color(null, 0xAF, 0xEE, 0xEE));
-		EXTENDED_COLORS.put("PaleVioletRed", new Color(null, 0xD8, 0x70, 0x93));
-		EXTENDED_COLORS.put("PapayaWhip", new Color(null, 0xFF, 0xEF, 0xD5));
-		EXTENDED_COLORS.put("PeachPuff", new Color(null, 0xFF, 0xDA, 0xB9));
-		EXTENDED_COLORS.put("Peru", new Color(null, 0xCD, 0x85, 0x3F));
-		EXTENDED_COLORS.put("Pink", new Color(null, 0xFF, 0xC0, 0xCB));
-		EXTENDED_COLORS.put("Plum", new Color(null, 0xDD, 0xA0, 0xDD));
-		EXTENDED_COLORS.put("PowderBlue", new Color(null, 0xB0, 0xE0, 0xE6));
-		EXTENDED_COLORS.put("Purple", new Color(null, 0x80, 0x00, 0x80));
-		EXTENDED_COLORS.put("Red", new Color(null, 0xFF, 0x00, 0x00));
-		EXTENDED_COLORS.put("RosyBrown", new Color(null, 0xBC, 0x8F, 0x8F));
-		EXTENDED_COLORS.put("RoyalBlue", new Color(null, 0x41, 0x69, 0xE1));
-		EXTENDED_COLORS.put("SaddleBrown", new Color(null, 0x8B, 0x45, 0x13));
-		EXTENDED_COLORS.put("Salmon", new Color(null, 0xFA, 0x80, 0x72));
-		EXTENDED_COLORS.put("SandyBrown", new Color(null, 0xF4, 0xA4, 0x60));
-		EXTENDED_COLORS.put("SeaGreen", new Color(null, 0x2E, 0x8B, 0x57));
-		EXTENDED_COLORS.put("SeaShell", new Color(null, 0xFF, 0xF5, 0xEE));
-		EXTENDED_COLORS.put("Sienna", new Color(null, 0xA0, 0x52, 0x2D));
-		EXTENDED_COLORS.put("Silver", new Color(null, 0xC0, 0xC0, 0xC0));
-		EXTENDED_COLORS.put("SkyBlue", new Color(null, 0x87, 0xCE, 0xEB));
-		EXTENDED_COLORS.put("SlateBlue", new Color(null, 0x6A, 0x5A, 0xCD));
-		EXTENDED_COLORS.put("SlateGray", new Color(null, 0x70, 0x80, 0x90));
-		EXTENDED_COLORS.put("Snow", new Color(null, 0xFF, 0xFA, 0xFA));
-		EXTENDED_COLORS.put("SpringGreen", new Color(null, 0x00, 0xFF, 0x7F));
-		EXTENDED_COLORS.put("SteelBlue", new Color(null, 0x46, 0x82, 0xB4));
-		EXTENDED_COLORS.put("Tan", new Color(null, 0xD2, 0xB4, 0x8C));
-		EXTENDED_COLORS.put("Teal", new Color(null, 0x00, 0x80, 0x80));
-		EXTENDED_COLORS.put("Thistle", new Color(null, 0xD8, 0xBF, 0xD8));
-		EXTENDED_COLORS.put("Tomato", new Color(null, 0xFF, 0x63, 0x47));
-		EXTENDED_COLORS.put("Turquoise", new Color(null, 0x40, 0xE0, 0xD0));
-		EXTENDED_COLORS.put("Violet", new Color(null, 0xEE, 0x82, 0xEE));
-		EXTENDED_COLORS.put("VioletRed", new Color(null, 0xD0, 0x20, 0x90));
-		EXTENDED_COLORS.put("Wheat", new Color(null, 0xF5, 0xDE, 0xB3));
-		EXTENDED_COLORS.put("White", new Color(null, 0xFF, 0xFF, 0xFF));
-		EXTENDED_COLORS.put("WhiteSmoke", new Color(null, 0xF5, 0xF5, 0xF5));
-		EXTENDED_COLORS.put("Yellow", new Color(null, 0xFF, 0xFF, 0x00));
-		EXTENDED_COLORS.put("YellowGreen", new Color(null, 0x9A, 0xCD, 0x32));
-	}
-
-	public final Map getBasicColorMap() {
-		return Collections.unmodifiableMap(BASIC_COLORS);
-	}
-
-	public final Map getExtendedColorMap() {
-		return Collections.unmodifiableMap(EXTENDED_COLORS);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/DialogsMessages.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/DialogsMessages.java
deleted file mode 100644
index 612d976..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/DialogsMessages.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class DialogsMessages {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.pagedesigner.ui.dialogs.DialogsMessages"; //$NON-NLS-1$
-
-	private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
-			.getBundle(BUNDLE_NAME);
-
-	private DialogsMessages() {
-        // no external instantiation
-	}
-
-	/**
-	 * @param key
-	 * @return the value for key or !!key!! if none
-	 */
-	public static String getString(String key) {
-		try {
-			return RESOURCE_BUNDLE.getString(key);
-		} catch (MissingResourceException e) {
-			return '!' + key + '!';
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/DialogsMessages.properties b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/DialogsMessages.properties
deleted file mode 100644
index 4bf4dd2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/DialogsMessages.properties
+++ /dev/null
@@ -1,93 +0,0 @@
-###############################################################################
-# Copyright (c) 2001, 2007 Oracle Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     Oracle Corporation - initial API and implementation
-###############################################################################
-StyleButtonDialogField.Edit=Edit...
-StyleDialog.Title=CSS Style Definition
-
-TextPreferenceNode.LabelText=Text
-TextPreferencePage.Title=Text
-TextPreferencePage.Font=Font:
-TextPreferencePage.Size=Size:
-TextPreferencePage.Weight=Weight:
-TextPreferencePage.Style=Style:
-TextPreferencePage.Variant=Variant:
-TextPreferencePage.LineHeight=Line Height:
-TextPreferencePage.Case=Case:
-TextPreferencePage.Decoration=Decoration:
-TextPreferencePage.Color=Color:
-
-BackgroundPreferenceNode.LabelText=Background
-BackgroundPreferencePage.Title=Background
-BackgroundBoxPreferencePage.BackgroundColor=Background color:
-BackgroundBoxPreferencePage.BackgroundImage=Background image:
-BackgroundBoxPreferencePage.BackgroundRepeatLabel=Repeat:
-BackgroundBoxPreferencePage.BackgroundAttachmentLabel=Attachment:
-BackgroundBoxPreferencePage.HorizontalLabel=Horizontal position:
-BackgroundBoxPreferencePage.VerticalLabel=Vertical position:
-
-BlockPreferenceNode.LabelText=Block
-BlockPreferencePage.Title=Block
-BlockPreferencePage.WordSpacing=Word spacing:
-BlockPreferencePage.LetterSpacing=Letter spacing:
-BlockPreferencePage.VerticalAlign=Vertical align:
-BlockPreferencePage.TextAlign=Text align:
-BlockPreferencePage.TextIndent=Text indent:
-BlockPreferencePage.WhiteSpace=White space:
-BlockPreferencePage.Display=Display:
-
-BoxPreferenceNode.LabelText=Box
-BoxPreferencePage.Title=Box
-BoxPreferencePage.Width=Width:
-BoxPreferencePage.Clear=Clear:
-BoxPreferencePage.Height=Height:
-BoxPreferencePage.Padding=Padding
-BoxPreferencePage.Margin=Margin
-BoxPreferencePage.Top=Top:
-BoxPreferencePage.Right=Right:
-BoxPreferencePage.Bottom=Bottom:
-BoxPreferencePage.Left=Left:
-
-BorderPreferenceNode.LabelText=Border
-BorderPreferencePage.Title=Border
-BorderPreferencePage.Style=Style
-BorderPreferencePage.Width=Width
-BorderPreferencePage.Color=Color
-BorderPreferencePage.Top=Top:
-BorderPreferencePage.Right=Right:
-BorderPreferencePage.Bottom=Bottom:
-BorderPreferencePage.Left=Left:
-
-ListPreferenceNode.LabelText=List
-ListPreferencePage.Title=List
-ListPreferencePage.Type=Type:
-ListPreferencePage.Image=Bullet image:
-ListPreferencePage.Position=Position:
-
-PositioningPreferenceNode.LabelText=Positioning
-PositioningPreferencePage.Title=Positioning
-PositioningPreferencePage.Type=Type:
-PositioningPreferencePage.Visibility=Visibility:
-PositioningPreferencePage.Width=Width:
-PositioningPreferencePage.ZIndex=Z-Index:
-PositioningPreferencePage.Height=Height:
-PositioningPreferencePage.Overflow=Overflow:
-PositioningPreferencePage.Placement=Placement
-PositioningPreferencePage.Clip=Clip
-PositioningPreferencePage.Right=Right:
-PositioningPreferencePage.Bottom=Bottom:
-PositioningPreferencePage.Left=Left:
-
-ExtensionsPreferenceNode.LabelText=Extensions
-ExtensionsPreferencePage.Title=Extensions
-ExtensionsPreferencePage.PageBreak=Page break
-ExtensionsPreferencePage.Before=Before:
-ExtensionsPreferencePage.After=After:
-ExtensionsPreferencePage.VisualEffect=Visual effect
-ExtensionsPreferencePage.Cursor=Cursor:
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ExtensionsPreferenceNode.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ExtensionsPreferenceNode.java
deleted file mode 100644
index 39eca4f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ExtensionsPreferenceNode.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.IPreferenceNode;
-import org.eclipse.jface.preference.IPreferencePage;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ExtensionsPreferenceNode implements IPreferenceNode {
-	private ExtensionsPreferencePage _page;
-
-	private IDOMElement _element;
-
-	private CSSPropertyContext _style;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public ExtensionsPreferenceNode(IDOMElement element,
-			CSSPropertyContext style) {
-		super();
-		_element = element;
-		_style = style;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#add(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public void add(IPreferenceNode node) {
-        // TODO:
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#createPage()
-	 */
-	public void createPage() {
-		_page = new ExtensionsPreferencePage(_element, _style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#disposeResources()
-	 */
-	public void disposeResources() {
-        // TODO:
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#findSubNode(java.lang.String)
-	 */
-	public IPreferenceNode findSubNode(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getId()
-	 */
-	public String getId() {
-		return "Extensions";
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelImage()
-	 */
-	public Image getLabelImage() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelText()
-	 */
-	public String getLabelText() {
-		return DialogsMessages.getString("ExtensionsPreferenceNode.LabelText");
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getPage()
-	 */
-	public IPreferencePage getPage() {
-		return _page;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getSubNodes()
-	 */
-	public IPreferenceNode[] getSubNodes() {
-		return new IPreferenceNode[0];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(java.lang.String)
-	 */
-	public IPreferenceNode remove(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public boolean remove(IPreferenceNode node) {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ExtensionsPreferencePage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ExtensionsPreferencePage.java
deleted file mode 100644
index 650e7a3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ExtensionsPreferencePage.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ExtensionsPreferencePage extends PreferencePage {
-	private CSSPropertyContext _style;
-
-	private StyleCombo _beforeCombo, _afterCombo, _cursorCombo;
-
-	/**
-	 * Creates an instance.
-	 * 
-	 * @param element IDOMElement instance.
-	 * @param style CSSPropertyContext instance.
-	 */
-	public ExtensionsPreferencePage(IDOMElement element,
-			CSSPropertyContext style) {
-		super();
-		_style = style;
-
-		setTitle(DialogsMessages.getString("ExtensionsPreferencePage.Title")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.
-	 *      PreferencePage#createContents(Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		GridLayout layout;
-		GridData data;
-
-		Composite top = new Composite(parent, SWT.NONE);
-		layout = new GridLayout(1, false);
-		data = new GridData(GridData.FILL_BOTH);
-		top.setLayout(layout);
-		top.setLayoutData(data);
-
-		Group pageGroup = new Group(top, SWT.NONE);
-		pageGroup.setText(DialogsMessages
-				.getString("ExtensionsPreferencePage.PageBreak"));
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		pageGroup.setLayoutData(data);
-		layout = new GridLayout(2, false);
-		pageGroup.setLayout(layout);
-
-		Label beforeLabel = new Label(pageGroup, SWT.NONE);
-		beforeLabel.setText(DialogsMessages
-				.getString("ExtensionsPreferencePage.Before")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		beforeLabel.setLayoutData(data);
-
-		_beforeCombo = new StyleCombo(pageGroup, SWT.NONE);
-		_beforeCombo.setItems(IStyleConstants.PAGE_BREAK);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_beforeCombo.setLayoutData(data);
-		_beforeCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String page = _beforeCombo.getText();
-				_style.setPageBreakBefore(page);
-			}
-		});
-
-		Label afterLabel = new Label(pageGroup, SWT.NONE);
-		afterLabel.setText(DialogsMessages
-				.getString("ExtensionsPreferencePage.After")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		afterLabel.setLayoutData(data);
-
-		_afterCombo = new StyleCombo(pageGroup, SWT.NONE);
-		_afterCombo.setItems(IStyleConstants.PAGE_BREAK);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_afterCombo.setLayoutData(data);
-		_afterCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String page = _afterCombo.getText();
-				_style.setPageBreakAfter(page);
-			}
-		});
-
-		Group visualGroup = new Group(top, SWT.NONE);
-		visualGroup.setText(DialogsMessages
-				.getString("ExtensionsPreferencePage.VisualEffect"));
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		visualGroup.setLayoutData(data);
-		layout = new GridLayout(2, false);
-		visualGroup.setLayout(layout);
-
-		Label cursorLabel = new Label(visualGroup, SWT.NONE);
-		cursorLabel.setText(DialogsMessages
-				.getString("ExtensionsPreferencePage.Cursor")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		cursorLabel.setLayoutData(data);
-
-		_cursorCombo = new StyleCombo(visualGroup, SWT.NONE);
-		_cursorCombo.setItems(IStyleConstants.CURSOR);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_cursorCombo.setLayoutData(data);
-		_cursorCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String cursor = _cursorCombo.getText();
-				_style.setCursor(cursor);
-			}
-		});
-
-		initializeControls();
-
-		return top;
-	}
-
-	private void initializeControls() {
-		// page-break-before
-		String page = _style.getPageBreakBefore();
-		if (!isEmptyString(page)) {
-			int index = _beforeCombo.indexOf(page);
-			if (index != -1) {
-				_beforeCombo.select(index);
-			} else {
-				_beforeCombo.setText(page);
-			}
-		}
-
-		// page-break-after
-		page = _style.getPageBreakAfter();
-		if (!isEmptyString(page)) {
-			int index = _afterCombo.indexOf(page);
-			if (index != -1) {
-				_afterCombo.select(index);
-			} else {
-				_afterCombo.setText(page);
-			}
-		}
-
-		// cursor
-		String cursor = _style.getCursor();
-		if (!isEmptyString(cursor)) {
-			int index = _cursorCombo.indexOf(cursor);
-			if (index != -1) {
-				_cursorCombo.select(index);
-			} else {
-				_cursorCombo.setText(cursor);
-			}
-		}
-	}
-
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-
-		getApplyButton().setVisible(false);
-		getDefaultsButton().setVisible(false);
-	}
-
-	private boolean isEmptyString(String str) {
-		if (str == null || str.length() == 0) {
-			return true;
-		}
-        return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/IStyleConstants.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/IStyleConstants.java
deleted file mode 100644
index 4a840d6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/IStyleConstants.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public interface IStyleConstants {
-	/**
-	 * attachment constants
-	 */
-	final public static String[] ATTACHMENT = { "fixed", "scroll" };
-
-	/**
-	 * auto constants
-	 */
-	final public static String[] AUTO = { "auto" };
-
-	/**
-	 * border style constants
-	 */
-	final public static String[] BORDER_STYLE = { "none", "dotted", "dashed",
-			"solid", "double", "groove", "ridge", "inset", "outset" };
-
-	/**
-	 * border width constants
-	 */
-	final public static String[] BORDER_WIDTH = { "thin", "medium", "thick" };
-
-	/**
-	 * clear constants
-	 */
-	final public static String[] CLEAR = { "left", "right", "both", "none" };
-
-	/**
-	 * color constants
-	 */
-	final public static String[] COLOR = { "black", "blue", "gray", "green",
-			"orange", "red", "white", "yellow", "aqua", "fuchsia", "lime",
-			"maroon", "navy", "olive", "purple", "silver", "teal" };
-
-	/**
-	 * display constants
-	 */
-	final public static String[] DISPLAY = { "none", "inline", "block",
-			"list-item", "run-in", "compact", "marker", "table",
-			"inline-table", "table-row-group", "table-header-group",
-			"table-footer-group", "table-row", "table-column-group",
-			"table-column", "table-cell", "table-caption" };
-
-	/**
-	 * float constants
-	 */
-	final public static String[] FLOAT = { "left", "right", "none" };
-
-	/**
-	 * font family constants
-	 */
-	final public static String[] FONT_FAMILY = { "Verdana, Arial, Sans-Serif",
-			"Tahoma, Verdana, Arial, Sans-Serif", "\"Times New Roman\", Serif",
-			"Georgia, \"Times New Roman\", Serif",
-			"\"Book Antiqua\", \"Times New Roman\", Serif",
-			"\"Comic Sans MS\", Sans-Serif", "\"Courier New\", Courier",
-			"\"Trebuchet MS\", Sans-Serif" };
-
-	/**
-	 * font size constants
-	 */
-	final public static String[] FONT_SIZE_NUMBER = { "9", "10", "12", "14",
-			"16", "18", "24", "36", "xx-small", "x-small", "small", "medium",
-			"large", "x-large", "xx-large", "smaller", "larger" };
-
-	/**
-	 * font style constants
-	 */
-	final public static String[] FONT_STYLE = { "normal", "italic", "oblique" };
-
-	/**
-	 * font transform constants
-	 */
-	final public static String[] FONT_TEXTTRANSFORM = { "capitalize",
-			"uppercase", "lowercase", "none" };
-
-	/**
-	 * font variant constants
-	 */
-	final public static String[] FONT_VARIANT = { "normal", "small-caps" };
-
-	/**
-	 * font weight constants
-	 */
-	final public static String[] FONT_WEIGHT = { "normal", "bold", "bolder",
-			"lighter", "100", "200", "300", "400", "500", "600", "700", "800",
-			"900" };
-
-	/**
-	 * list position constants
-	 */
-	final public static String[] LIST_POSITION = { "inside", "outside" };
-
-	/**
-	 * list type constants
-	 */
-	final public static String[] LIST_TYPE = { "disc", "circle", "sqaure",
-			"decimal", "lower-roman", "upper-roman", "lower-alpha",
-			"upper-alpah", "none" };
-
-	/**
-	 * none
-	 */
-	final public static String[] NONE = { "none" };
-
-	/**
-	 * normal
-	 */
-	final public static String[] NORMAL = { "normal" };
-
-	/**
-	 * percent
-	 */
-	final public static String[] PERCENT = { "%" };
-
-	/**
-	 * position constants
-	 */
-	final public static String[] POSITION = { "left", "center", "right" };
-
-	/**
-	 * positioning type constants
-	 */
-	final public static String[] POSITIONING_TYPE = { "absolute", "relative",
-			"static" };
-
-	/**
-	 * repeat constants
-	 */
-	final public static String[] REPEAT = { "no-repeat", "repeat", "repeat-x",
-			"repeat-y" };
-
-	/**
-	 * unit of size constants
-	 */
-	final public static String[] SIZE_UNIT = { "px", "pt", "in", "cm", "mm",
-			"pc", "em", "ex", "%" };
-
-	/**
-	 * text align constants
-	 */
-	final public static String[] TEXT_ALIGN = { "left", "right", "center",
-			"justify" };
-
-	/**
-	 * text decoration constants
-	 */
-	final public static String[] TEXT_DECORATION = { "underline", "overline",
-			"line-through", "blink", "none" };
-
-	/**
-	 * veritical align constants
-	 */
-	final public static String[] VERTICAL_ALIGN = { "baseline", "sub", "super",
-			"top", "text-top", "middle", "bottom", "text-bottom" };
-
-	/**
-	 * white space constants
-	 */
-	final public static String[] WHITE_SPACE = { "normal", "pre", "nowrap" };
-
-	/**
-	 * visibility constants
-	 */
-	final public static String[] VISIBILITY = { "inherit", "visible", "hidden" };
-
-	/**
-	 * overflow constants
-	 */
-	final public static String[] OVERFLOW = { "visible", "hidden", "scroll",
-			"auto" };
-
-	/**
-	 * page break constants
-	 */
-	final public static String[] PAGE_BREAK = { "auto", "always", "left",
-			"right" };
-
-	/**
-	 * cursor constants
-	 */
-	final public static String[] CURSOR = { "hand", "crosshair", "text",
-			"wait", "default", "help", "e-resize", "ne-resize", "n-resize",
-			"nw-resize", "w-resize", "sw-resize", "s-resize", "se-resize",
-			"auto" };
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ListPreferenceNode.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ListPreferenceNode.java
deleted file mode 100644
index a0cd4a3..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ListPreferenceNode.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.IPreferenceNode;
-import org.eclipse.jface.preference.IPreferencePage;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ListPreferenceNode implements IPreferenceNode {
-	private ListPreferencePage _page;
-
-	private IDOMElement _element;
-
-	private CSSPropertyContext _style;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public ListPreferenceNode(IDOMElement element, CSSPropertyContext style) {
-		super();
-		_element = element;
-		_style = style;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#add(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public void add(IPreferenceNode node) {
-        // TODO:
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#createPage()
-	 */
-	public void createPage() {
-		_page = new ListPreferencePage(_element, _style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#disposeResources()
-	 */
-	public void disposeResources() {
-        // TODO:
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#findSubNode(java.lang.String)
-	 */
-	public IPreferenceNode findSubNode(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getId()
-	 */
-	public String getId() {
-		return "List";
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelImage()
-	 */
-	public Image getLabelImage() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelText()
-	 */
-	public String getLabelText() {
-		return DialogsMessages.getString("ListPreferenceNode.LabelText");
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getPage()
-	 */
-	public IPreferencePage getPage() {
-		return _page;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getSubNodes()
-	 */
-	public IPreferenceNode[] getSubNodes() {
-		return new IPreferenceNode[0];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(java.lang.String)
-	 */
-	public IPreferenceNode remove(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public boolean remove(IPreferenceNode node) {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ListPreferencePage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ListPreferencePage.java
deleted file mode 100644
index eda6fa5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/ListPreferencePage.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ListPreferencePage extends PreferencePage {
-	private CSSPropertyContext _style;
-
-	private StyleCombo _typeCombo, _imageCombo, _positionCombo;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public ListPreferencePage(IDOMElement element, CSSPropertyContext style) {
-		super();
-		_style = style;
-
-		setTitle(DialogsMessages.getString("ListPreferencePage.Title")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.
-	 *      PreferencePage#createContents(Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		GridLayout layout;
-		GridData data;
-
-		Composite top = new Composite(parent, SWT.NONE);
-		layout = new GridLayout(2, false);
-		data = new GridData(GridData.FILL_BOTH);
-		top.setLayout(layout);
-		top.setLayoutData(data);
-
-		Label typeLabel = new Label(top, SWT.NONE);
-		typeLabel.setText(DialogsMessages.getString("ListPreferencePage.Type")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		typeLabel.setLayoutData(data);
-
-		_typeCombo = new StyleCombo(top, SWT.NONE);
-		_typeCombo.setItems(IStyleConstants.LIST_TYPE);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_typeCombo.setLayoutData(data);
-		_typeCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String type = _typeCombo.getText();
-				_style.setListStyleType(type);
-			}
-		});
-
-		Label imageLabel = new Label(top, SWT.NONE);
-		imageLabel.setText(DialogsMessages
-				.getString("ListPreferencePage.Image")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		imageLabel.setLayoutData(data);
-
-		_imageCombo = new StyleCombo(top, SWT.NONE);
-		_imageCombo.setItems(IStyleConstants.NONE);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_imageCombo.setLayoutData(data);
-		_imageCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String image = _imageCombo.getText();
-				_style.setListStyleImage(image);
-			}
-		});
-
-		Label positionLabel = new Label(top, SWT.NONE);
-		positionLabel.setText(DialogsMessages
-				.getString("ListPreferencePage.Position")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		positionLabel.setLayoutData(data);
-
-		_positionCombo = new StyleCombo(top, SWT.NONE);
-		_positionCombo.setItems(IStyleConstants.LIST_POSITION);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_positionCombo.setLayoutData(data);
-		_positionCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String position = _positionCombo.getText();
-				_style.setListStylePosition(position);
-			}
-		});
-
-		initializeControls();
-
-		return top;
-	}
-
-	private void initializeControls() {
-		// list-style-tyle
-		String type = _style.getListStyleType();
-		if (!isEmptyString(type)) {
-			int index = _typeCombo.indexOf(type);
-			if (index != -1) {
-				_typeCombo.select(index);
-			} else {
-				_typeCombo.setText(type);
-			}
-		}
-
-		// list-style-image
-		String image = _style.getListStyleImage();
-		if (!isEmptyString(image)) {
-			int index = _imageCombo.indexOf(image);
-			if (index != -1) {
-				_imageCombo.select(index);
-			} else {
-				_imageCombo.setText(image);
-			}
-		}
-
-		// list-style-position
-		String position = _style.getListStylePosition();
-		if (!isEmptyString(position)) {
-			int index = _positionCombo.indexOf(position);
-			if (index != -1) {
-				_positionCombo.select(index);
-			} else {
-				_positionCombo.setText(position);
-			}
-		}
-	}
-
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-
-		getApplyButton().setVisible(false);
-		getDefaultsButton().setVisible(false);
-	}
-
-	private boolean isEmptyString(String str) {
-		if (str == null || str.length() == 0) {
-			return true;
-		}
-        return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/PositioningPreferenceNode.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/PositioningPreferenceNode.java
deleted file mode 100644
index 78f7576..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/PositioningPreferenceNode.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.IPreferenceNode;
-import org.eclipse.jface.preference.IPreferencePage;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PositioningPreferenceNode implements IPreferenceNode {
-	private PositioningPreferencePage _page;
-
-	private IDOMElement _element;
-
-	private CSSPropertyContext _style;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public PositioningPreferenceNode(IDOMElement element,
-			CSSPropertyContext style) {
-		super();
-		_element = element;
-		_style = style;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#add(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public void add(IPreferenceNode node) {
-        // TODO:
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#createPage()
-	 */
-	public void createPage() {
-		_page = new PositioningPreferencePage(_element, _style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#disposeResources()
-	 */
-	public void disposeResources() {
-        // TODO:
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#findSubNode(java.lang.String)
-	 */
-	public IPreferenceNode findSubNode(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getId()
-	 */
-	public String getId() {
-		return "Positioning";
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelImage()
-	 */
-	public Image getLabelImage() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelText()
-	 */
-	public String getLabelText() {
-		return DialogsMessages.getString("PositioningPreferenceNode.LabelText");
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getPage()
-	 */
-	public IPreferencePage getPage() {
-		return _page;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getSubNodes()
-	 */
-	public IPreferenceNode[] getSubNodes() {
-		return new IPreferenceNode[0];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(java.lang.String)
-	 */
-	public IPreferenceNode remove(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public boolean remove(IPreferenceNode node) {
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/PositioningPreferencePage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/PositioningPreferencePage.java
deleted file mode 100644
index 0d1c494..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/PositioningPreferencePage.java
+++ /dev/null
@@ -1,782 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class PositioningPreferencePage extends PreferencePage {
-	private CSSPropertyContext _style;
-
-	private Combo _typeCombo, _visibilityCombo, _widthNumberCombo,
-			_widthUnitCombo, _zIndexCombo, _heightNumberCombo,
-			_heightUnitCombo, _overflowCombo;
-
-	private Combo _placementTopNumberCombo, _placementRightNumberCombo,
-			_placementBottomNumberCombo, _placementLeftNumberCombo;
-
-	private Combo _placementTopUnitCombo, _placementRightUnitCombo,
-			_placementBottomUnitCombo, _placementLeftUnitCombo;
-
-	private Combo _clipTopNumberCombo, _clipRightNumberCombo,
-			_clipBottomNumberCombo, _clipLeftNumberCombo;
-
-	private Combo _clipTopUnitCombo, _clipRightUnitCombo, _clipBottomUnitCombo,
-			_clipLeftUnitCombo;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public PositioningPreferencePage(IDOMElement element,
-			CSSPropertyContext style) {
-		super();
-		_style = style;
-
-		setTitle(DialogsMessages.getString("PositioningPreferencePage.Title")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.
-	 *      PreferencePage#createContents(Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		GridLayout layout;
-		GridData data;
-
-		Composite top = new Composite(parent, SWT.NONE);
-		layout = new GridLayout(6, false);
-		data = new GridData(GridData.FILL_BOTH);
-		top.setLayout(layout);
-		top.setLayoutData(data);
-
-		Label typeLabel = new Label(top, SWT.NONE);
-		typeLabel.setText(DialogsMessages
-				.getString("PositioningPreferencePage.Type")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		typeLabel.setLayoutData(data);
-
-		_typeCombo = new Combo(top, SWT.NONE);
-		_typeCombo.setItems(IStyleConstants.POSITIONING_TYPE);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		data.horizontalSpan = 2;
-		_typeCombo.setLayoutData(data);
-		_typeCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String type = _typeCombo.getText();
-				_style.setPosition(type);
-			}
-		});
-
-		Label visibilityLabel = new Label(top, SWT.NONE);
-		visibilityLabel.setText(DialogsMessages
-				.getString("PositioningPreferencePage.Visibility")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		visibilityLabel.setLayoutData(data);
-
-		_visibilityCombo = new Combo(top, SWT.NONE);
-		_visibilityCombo.setItems(IStyleConstants.VISIBILITY);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_visibilityCombo.setLayoutData(data);
-		_visibilityCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String visibility = _visibilityCombo.getText();
-				_style.setVisibility(visibility);
-			}
-		});
-
-		new Label(top, SWT.NONE);
-
-		Label widthLabel = new Label(top, SWT.NONE);
-		widthLabel.setText(DialogsMessages
-				.getString("PositioningPreferencePage.Width")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		widthLabel.setLayoutData(data);
-
-		_widthNumberCombo = new Combo(top, SWT.NONE);
-		_widthNumberCombo.setItems(IStyleConstants.LIST_POSITION);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthNumberCombo.setLayoutData(data);
-		_widthNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_widthUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_widthNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_widthUnitCombo.setEnabled(false);
-				}
-
-				String width = _widthNumberCombo.getText();
-				if (_widthUnitCombo.isEnabled()) {
-					width += _widthUnitCombo.getText();
-				}
-
-				_style.setWidth(width);
-			}
-		});
-
-		_widthUnitCombo = new Combo(top, SWT.READ_ONLY);
-		_widthUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_widthUnitCombo.setLayoutData(data);
-		_widthUnitCombo.select(0);
-		_widthUnitCombo.setEnabled(false);
-		_widthUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String width = _widthNumberCombo.getText();
-				if (_widthUnitCombo.isEnabled()) {
-					width += _widthUnitCombo.getText();
-				}
-
-				_style.setWidth(width);
-			}
-		});
-
-		Label zIndexLabel = new Label(top, SWT.NONE);
-		zIndexLabel.setText(DialogsMessages
-				.getString("PositioningPreferencePage.ZIndex")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		zIndexLabel.setLayoutData(data);
-
-		_zIndexCombo = new Combo(top, SWT.NONE);
-		_zIndexCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_zIndexCombo.setLayoutData(data);
-		_zIndexCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String index = _zIndexCombo.getText();
-				_style.setZIndex(index);
-			}
-		});
-
-		new Label(top, SWT.NONE);
-
-		Label heightLabel = new Label(top, SWT.NONE);
-		heightLabel.setText(DialogsMessages
-				.getString("PositioningPreferencePage.Height")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		heightLabel.setLayoutData(data);
-
-		_heightNumberCombo = new Combo(top, SWT.NONE);
-		_heightNumberCombo.setItems(IStyleConstants.LIST_POSITION);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_heightNumberCombo.setLayoutData(data);
-		_heightNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_heightUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_heightNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_heightUnitCombo.setEnabled(false);
-				}
-
-				String height = _heightNumberCombo.getText();
-				if (_heightUnitCombo.isEnabled()) {
-					height += _heightUnitCombo.getText();
-				}
-
-				_style.setHeight(height);
-			}
-		});
-
-		_heightUnitCombo = new Combo(top, SWT.READ_ONLY);
-		_heightUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_heightUnitCombo.setLayoutData(data);
-		_heightUnitCombo.select(0);
-		_heightUnitCombo.setEnabled(false);
-		_heightUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String height = _heightNumberCombo.getText();
-				if (_heightUnitCombo.isEnabled()) {
-					height += _heightUnitCombo.getText();
-				}
-
-				_style.setHeight(height);
-			}
-		});
-
-		Label overflowLabel = new Label(top, SWT.NONE);
-		overflowLabel.setText(DialogsMessages
-				.getString("PositioningPreferencePage.Overflow")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		overflowLabel.setLayoutData(data);
-
-		_overflowCombo = new Combo(top, SWT.NONE);
-		_overflowCombo.setItems(IStyleConstants.OVERFLOW);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_overflowCombo.setLayoutData(data);
-		_overflowCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String overflow = _overflowCombo.getText();
-				_style.setOverflow(overflow);
-			}
-		});
-
-		Group placementGroup = new Group(top, SWT.NONE);
-		placementGroup.setText(DialogsMessages
-				.getString("PositioningPreferencePage.Placement"));
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		data.horizontalSpan = 3;
-		data.verticalSpan = 4;
-		placementGroup.setLayoutData(data);
-		layout = new GridLayout(3, false);
-		placementGroup.setLayout(layout);
-
-		Label placementTopLabel = new Label(placementGroup, SWT.NONE);
-		placementTopLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Top")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		placementTopLabel.setLayoutData(data);
-
-		_placementTopNumberCombo = new Combo(placementGroup, SWT.NONE);
-		_placementTopNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_placementTopNumberCombo.setLayoutData(data);
-		_placementTopNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_placementTopUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_placementTopNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_placementTopUnitCombo.setEnabled(false);
-				}
-
-				String placement = _placementTopNumberCombo.getText();
-				if (_placementTopUnitCombo.isEnabled()) {
-					placement += _placementTopUnitCombo.getText();
-				}
-
-				_style.setTop(placement);
-			}
-		});
-
-		_placementTopUnitCombo = new Combo(placementGroup, SWT.READ_ONLY);
-		_placementTopUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_placementTopUnitCombo.setLayoutData(data);
-		_placementTopUnitCombo.select(0);
-		_placementTopUnitCombo.setEnabled(false);
-		_placementTopUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String placement = _placementTopNumberCombo.getText();
-				if (_placementTopUnitCombo.isEnabled()) {
-					placement += _placementTopUnitCombo.getText();
-				}
-
-				_style.setTop(placement);
-			}
-		});
-
-		Label placementRightLabel = new Label(placementGroup, SWT.NONE);
-		placementRightLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Right")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		placementRightLabel.setLayoutData(data);
-
-		_placementRightNumberCombo = new Combo(placementGroup, SWT.NONE);
-		_placementRightNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_placementRightNumberCombo.setLayoutData(data);
-		_placementRightNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_placementRightUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_placementRightNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_placementRightUnitCombo.setEnabled(false);
-				}
-
-				String placement = _placementRightNumberCombo.getText();
-				if (_placementRightUnitCombo.isEnabled()) {
-					placement += _placementRightUnitCombo.getText();
-				}
-
-				_style.setRight(placement);
-			}
-		});
-
-		_placementRightUnitCombo = new Combo(placementGroup, SWT.READ_ONLY);
-		_placementRightUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_placementRightUnitCombo.setLayoutData(data);
-		_placementRightUnitCombo.select(0);
-		_placementRightUnitCombo.setEnabled(false);
-		_placementRightUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String placement = _placementRightNumberCombo.getText();
-				if (_placementRightUnitCombo.isEnabled()) {
-					placement += _placementRightUnitCombo.getText();
-				}
-
-				_style.setRight(placement);
-			}
-		});
-
-		Label placementBottomLabel = new Label(placementGroup, SWT.NONE);
-		placementBottomLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Bottom")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		placementBottomLabel.setLayoutData(data);
-
-		_placementBottomNumberCombo = new Combo(placementGroup, SWT.NONE);
-		_placementBottomNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_placementBottomNumberCombo.setLayoutData(data);
-		_placementBottomNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_placementBottomUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_placementBottomNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_placementBottomUnitCombo.setEnabled(false);
-				}
-
-				String placement = _placementBottomNumberCombo.getText();
-				if (_placementBottomUnitCombo.isEnabled()) {
-					placement += _placementBottomUnitCombo.getText();
-				}
-
-				_style.setBottom(placement);
-			}
-		});
-
-		_placementBottomUnitCombo = new Combo(placementGroup, SWT.READ_ONLY);
-		_placementBottomUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_placementBottomUnitCombo.setLayoutData(data);
-		_placementBottomUnitCombo.select(0);
-		_placementBottomUnitCombo.setEnabled(false);
-		_placementBottomUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String placement = _placementBottomNumberCombo.getText();
-				if (_placementBottomUnitCombo.isEnabled()) {
-					placement += _placementBottomUnitCombo.getText();
-				}
-
-				_style.setBottom(placement);
-			}
-		});
-
-		Label placementLeftLabel = new Label(placementGroup, SWT.NONE);
-		placementLeftLabel.setText(DialogsMessages
-				.getString("BoxPreferencePage.Left")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		placementLeftLabel.setLayoutData(data);
-
-		_placementLeftNumberCombo = new Combo(placementGroup, SWT.NONE);
-		_placementLeftNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_placementLeftNumberCombo.setLayoutData(data);
-		_placementLeftNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_placementLeftUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_placementLeftNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_placementLeftUnitCombo.setEnabled(false);
-				}
-
-				String top1 = _placementLeftNumberCombo.getText();
-				if (_placementLeftUnitCombo.isEnabled()) {
-					top1 += _placementLeftUnitCombo.getText();
-				}
-
-				_style.setLeft(top1);
-			}
-		});
-
-		_placementLeftUnitCombo = new Combo(placementGroup, SWT.READ_ONLY);
-		_placementLeftUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_placementLeftUnitCombo.setLayoutData(data);
-		_placementLeftUnitCombo.select(0);
-		_placementLeftUnitCombo.setEnabled(false);
-		_placementLeftUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String top1 = _placementLeftNumberCombo.getText();
-				if (_placementLeftUnitCombo.isEnabled()) {
-					top1 += _placementLeftUnitCombo.getText();
-				}
-
-				_style.setLeft(top1);
-			}
-		});
-
-		Group clipGroup = new Group(top, SWT.NONE);
-		clipGroup.setText(DialogsMessages
-				.getString("PositioningPreferencePage.Clip"));
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		data.horizontalSpan = 3;
-		data.verticalSpan = 4;
-		clipGroup.setLayoutData(data);
-		layout = new GridLayout(3, false);
-		clipGroup.setLayout(layout);
-
-		Label clipTopLabel = new Label(clipGroup, SWT.NONE);
-		clipTopLabel
-				.setText(DialogsMessages.getString("BoxPreferencePage.Top")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		clipTopLabel.setLayoutData(data);
-
-		_clipTopNumberCombo = new Combo(clipGroup, SWT.NONE);
-		_clipTopNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_clipTopNumberCombo.setLayoutData(data);
-		_clipTopNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_clipTopUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_clipTopNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_clipTopUnitCombo.setEnabled(false);
-				}
-
-				String clip = _clipTopNumberCombo.getText();
-				if (_clipTopUnitCombo.isEnabled()) {
-					clip += _clipTopUnitCombo.getText();
-				}
-
-				_style.setClipTop(clip);
-			}
-		});
-
-		_clipTopUnitCombo = new Combo(clipGroup, SWT.READ_ONLY);
-		_clipTopUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_clipTopUnitCombo.setLayoutData(data);
-		_clipTopUnitCombo.select(0);
-		_clipTopUnitCombo.setEnabled(false);
-		_clipTopUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String clip = _clipTopNumberCombo.getText();
-				if (_clipTopUnitCombo.isEnabled()) {
-					clip += _clipTopUnitCombo.getText();
-				}
-
-				_style.setClipTop(clip);
-			}
-		});
-
-		Label clipRightLabel = new Label(clipGroup, SWT.NONE);
-		clipRightLabel.setText(DialogsMessages
-				.getString("PositioningPreferencePage.Right")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		clipRightLabel.setLayoutData(data);
-
-		_clipRightNumberCombo = new Combo(clipGroup, SWT.NONE);
-		_clipRightNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_clipRightNumberCombo.setLayoutData(data);
-		_clipRightNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_clipRightUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_clipRightNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_clipRightUnitCombo.setEnabled(false);
-				}
-
-				String clip = _clipRightNumberCombo.getText();
-				if (_clipRightUnitCombo.isEnabled()) {
-					clip += _clipRightUnitCombo.getText();
-				}
-
-				_style.setClipRight(clip);
-			}
-		});
-
-		_clipRightUnitCombo = new Combo(clipGroup, SWT.READ_ONLY);
-		_clipRightUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_clipRightUnitCombo.setLayoutData(data);
-		_clipRightUnitCombo.select(0);
-		_clipRightUnitCombo.setEnabled(false);
-		_clipRightUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String clip = _clipRightNumberCombo.getText();
-				if (_clipRightUnitCombo.isEnabled()) {
-					clip += _clipRightUnitCombo.getText();
-				}
-
-				_style.setClipRight(clip);
-			}
-		});
-
-		Label clipBottomLabel = new Label(clipGroup, SWT.NONE);
-		clipBottomLabel.setText(DialogsMessages
-				.getString("PositioningPreferencePage.Bottom")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		clipBottomLabel.setLayoutData(data);
-
-		_clipBottomNumberCombo = new Combo(clipGroup, SWT.NONE);
-		_clipBottomNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_clipBottomNumberCombo.setLayoutData(data);
-		_clipBottomNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_clipBottomUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_clipBottomNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_clipBottomUnitCombo.setEnabled(false);
-				}
-
-				String clip = _clipBottomNumberCombo.getText();
-				if (_clipBottomUnitCombo.isEnabled()) {
-					clip += _clipBottomUnitCombo.getText();
-				}
-
-				_style.setClipBottom(clip);
-			}
-		});
-
-		_clipBottomUnitCombo = new Combo(clipGroup, SWT.READ_ONLY);
-		_clipBottomUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_clipBottomUnitCombo.setLayoutData(data);
-		_clipBottomUnitCombo.select(0);
-		_clipBottomUnitCombo.setEnabled(false);
-		_clipBottomUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String clip = _clipBottomNumberCombo.getText();
-				if (_clipBottomUnitCombo.isEnabled()) {
-					clip += _clipBottomUnitCombo.getText();
-				}
-
-				_style.setClipBottom(clip);
-			}
-		});
-
-		Label clipLeftLabel = new Label(clipGroup, SWT.NONE);
-		clipLeftLabel.setText(DialogsMessages
-				.getString("PositioningPreferencePage.Left")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		clipLeftLabel.setLayoutData(data);
-
-		_clipLeftNumberCombo = new Combo(clipGroup, SWT.NONE);
-		_clipLeftNumberCombo.setItems(IStyleConstants.AUTO);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_clipLeftNumberCombo.setLayoutData(data);
-		_clipLeftNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_clipLeftUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_clipLeftNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_clipLeftUnitCombo.setEnabled(false);
-				}
-
-				String top1 = _clipLeftNumberCombo.getText();
-				if (_clipLeftUnitCombo.isEnabled()) {
-					top1 += _clipLeftUnitCombo.getText();
-				}
-
-				_style.setClipLeft(top1);
-			}
-		});
-
-		_clipLeftUnitCombo = new Combo(clipGroup, SWT.READ_ONLY);
-		_clipLeftUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_clipLeftUnitCombo.setLayoutData(data);
-		_clipLeftUnitCombo.select(0);
-		_clipLeftUnitCombo.setEnabled(false);
-		_clipLeftUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String top1 = _clipLeftNumberCombo.getText();
-				if (_clipLeftUnitCombo.isEnabled()) {
-					top1 += _clipLeftUnitCombo.getText();
-				}
-
-				_style.setClipLeft(top1);
-			}
-		});
-
-		initializeControls();
-
-		return top;
-	}
-
-	private void initializeControls() {
-		// position
-		String position = _style.getPosition();
-		if (!isEmptyString(position)) {
-			int index = _typeCombo.indexOf(position);
-			if (index != -1) {
-				_typeCombo.select(index);
-			} else {
-				_typeCombo.setText(position);
-			}
-		}
-
-		// visibility
-		String visibility = _style.getVisibility();
-		if (!isEmptyString(visibility)) {
-			int index = _visibilityCombo.indexOf(visibility);
-			if (index != -1) {
-				_visibilityCombo.select(index);
-			} else {
-				_visibilityCombo.setText(visibility);
-			}
-		}
-
-		// width
-		String width = _style.getWidth();
-		if (!isEmptyString(width)) {
-			int index = _widthNumberCombo.indexOf(width);
-			if (index != -1) {
-				_widthNumberCombo.select(index);
-			} else {
-				_widthNumberCombo.setText(width);
-			}
-		}
-
-		// z-index
-		String zindex = _style.getZIndex();
-		if (!isEmptyString(zindex)) {
-			int index = _zIndexCombo.indexOf(zindex);
-			if (index != -1) {
-				_zIndexCombo.select(index);
-			} else {
-				_zIndexCombo.setText(zindex);
-			}
-		}
-
-		// height
-		String height = _style.getHeight();
-		if (!isEmptyString(height)) {
-			int index = _heightNumberCombo.indexOf(height);
-			if (index != -1) {
-				_heightNumberCombo.select(index);
-			} else {
-				_heightNumberCombo.setText(height);
-			}
-		}
-
-		// overflow
-		String overflow = _style.getOverflow();
-		if (!isEmptyString(overflow)) {
-			int index = _overflowCombo.indexOf(overflow);
-			if (index != -1) {
-				_overflowCombo.select(index);
-			} else {
-				_overflowCombo.setText(overflow);
-			}
-		}
-
-		// placement
-		String placement = _style.getTop();
-		if (!isEmptyString(placement)) {
-			int index = _placementTopNumberCombo.indexOf(placement);
-			if (index != -1) {
-				_placementTopNumberCombo.select(index);
-			} else {
-				_placementTopNumberCombo.setText(placement);
-			}
-		}
-		placement = _style.getRight();
-		if (!isEmptyString(placement)) {
-			int index = _placementRightNumberCombo.indexOf(placement);
-			if (index != -1) {
-				_placementRightNumberCombo.select(index);
-			} else {
-				_placementRightNumberCombo.setText(placement);
-			}
-		}
-		placement = _style.getBottom();
-		if (!isEmptyString(placement)) {
-			int index = _placementBottomNumberCombo.indexOf(placement);
-			if (index != -1) {
-				_placementBottomNumberCombo.select(index);
-			} else {
-				_placementBottomNumberCombo.setText(placement);
-			}
-		}
-		placement = _style.getLeft();
-		if (!isEmptyString(placement)) {
-			int index = _placementLeftNumberCombo.indexOf(placement);
-			if (index != -1) {
-				_placementLeftNumberCombo.select(index);
-			} else {
-				_placementLeftNumberCombo.setText(placement);
-			}
-		}
-
-		// clip
-		String clip = _style.getClipTop();
-		if (!isEmptyString(clip)) {
-			int index = _clipTopNumberCombo.indexOf(clip);
-			if (index != -1) {
-				_clipTopNumberCombo.select(index);
-			} else {
-				_clipTopNumberCombo.setText(clip);
-			}
-		}
-		clip = _style.getClipRight();
-		if (!isEmptyString(clip)) {
-			int index = _clipRightNumberCombo.indexOf(clip);
-			if (index != -1) {
-				_clipRightNumberCombo.select(index);
-			} else {
-				_clipRightNumberCombo.setText(clip);
-			}
-		}
-		clip = _style.getClipBottom();
-		if (!isEmptyString(clip)) {
-			int index = _clipBottomNumberCombo.indexOf(clip);
-			if (index != -1) {
-				_clipBottomNumberCombo.select(index);
-			} else {
-				_clipBottomNumberCombo.setText(clip);
-			}
-		}
-		clip = _style.getClipLeft();
-		if (!isEmptyString(clip)) {
-			int index = _clipLeftNumberCombo.indexOf(clip);
-			if (index != -1) {
-				_clipLeftNumberCombo.select(index);
-			} else {
-				_clipLeftNumberCombo.setText(clip);
-			}
-		}
-	}
-
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-
-		getApplyButton().setVisible(false);
-		getDefaultsButton().setVisible(false);
-	}
-
-	private boolean isEmptyString(String str) {
-		if (str == null || str.length() == 0) {
-			return true;
-        }	
-        return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/StyleCombo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/StyleCombo.java
deleted file mode 100644
index e50a885..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/StyleCombo.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.swt.events.ControlAdapter;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class StyleCombo extends Combo {
-
-	/**
-	 * @param parent
-	 * @param style
-	 */
-	public StyleCombo(Composite parent, int style) {
-		super(parent, style);
-		this.addControlListener(new ControlAdapter() {
-			public void controlResized(ControlEvent e) {
-				Combo combo = (Combo) e.widget;
-				combo.setSelection(new Point(0, 0));
-			}
-		});
-	}
-
-	protected void checkSubclass() {
-        // override subclass validation, otherwise Widget.isValidSubclass
-        // will throw an error
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/StyleDialog.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/StyleDialog.java
deleted file mode 100644
index ee269aa..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/StyleDialog.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.PreferenceDialog;
-import org.eclipse.jface.preference.PreferenceManager;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class StyleDialog extends PreferenceDialog {
-	/**
-	 * @param parentShell
-	 * @param manager
-	 * @param element 
-	 * @param style 
-	 */
-	public StyleDialog(Shell parentShell, PreferenceManager manager,
-			IDOMElement element, CSSPropertyContext style) {
-		super(parentShell, manager);
-		manager.addToRoot(new TextPreferenceNode(element, style));
-		manager.addToRoot(new BackgroudPreferenceNode(element, style));
-		manager.addToRoot(new BlockPreferenceNode(element, style));
-		manager.addToRoot(new BoxPreferenceNode(element, style));
-		manager.addToRoot(new BorderPreferenceNode(element, style));
-		manager.addToRoot(new ListPreferenceNode(element, style));
-		manager.addToRoot(new PositioningPreferenceNode(element, style));
-		manager.addToRoot(new ExtensionsPreferenceNode(element, style));
-	}
-
-	protected Control createDialogArea(Composite parent) {
-		Control control = super.createDialogArea(parent);
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(control,
-				PDPlugin.getResourceString("StyleDialog.help.id"));
-		PlatformUI.getWorkbench().getHelpSystem().setHelp(
-				getTreeViewer().getControl(),
-				PDPlugin.getResourceString("StyleDialog.help.id"));
-		return control;
-	}
-
-	protected void update() {
-		super.update();
-		getShell().setText(DialogsMessages.getString("StyleDialog.Title"));
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/TextPreferenceNode.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/TextPreferenceNode.java
deleted file mode 100644
index f01913e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/TextPreferenceNode.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.IPreferenceNode;
-import org.eclipse.jface.preference.IPreferencePage;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TextPreferenceNode implements IPreferenceNode {
-	private TextPreferencePage _page;
-
-	private CSSPropertyContext _style;
-
-	private IDOMElement _element;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public TextPreferenceNode(IDOMElement element, CSSPropertyContext style) {
-		super();
-		_element = element;
-		_style = style;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#add(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public void add(IPreferenceNode node) {
-        // TODO:
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#createPage()
-	 */
-	public void createPage() {
-		_page = new TextPreferencePage(_element, _style);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#disposeResources()
-	 */
-	public void disposeResources() {
-        // TODO:
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#findSubNode(java.lang.String)
-	 */
-	public IPreferenceNode findSubNode(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getId()
-	 */
-	public String getId() {
-		return "Text";
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelImage()
-	 */
-	public Image getLabelImage() {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getLabelText()
-	 */
-	public String getLabelText() {
-		return DialogsMessages.getString("TextPreferenceNode.LabelText");
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getPage()
-	 */
-	public IPreferencePage getPage() {
-		return _page;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#getSubNodes()
-	 */
-	public IPreferenceNode[] getSubNodes() {
-		return new IPreferenceNode[0];
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(java.lang.String)
-	 */
-	public IPreferenceNode remove(String id) {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.preference.IPreferenceNode#remove(org.eclipse.jface.preference.IPreferenceNode)
-	 */
-	public boolean remove(IPreferenceNode node) {
-		return false;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/TextPreferencePage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/TextPreferencePage.java
deleted file mode 100644
index abb291d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/ui/dialogs/TextPreferencePage.java
+++ /dev/null
@@ -1,525 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.ui.dialogs;
-
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ColorButtonDialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.DialogField;
-import org.eclipse.jst.jsf.common.ui.internal.dialogfield.IDialogFieldApplyListener;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.wst.css.core.internal.util.declaration.CSSPropertyContext;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class TextPreferencePage extends PreferencePage {
-	private CSSPropertyContext _style;
-
-	private StyleCombo _fontFamilyCombo, _fontSizeNumberCombo,
-			_fontSizeUnitCombo, _fontWeightCombo, _fontStyleCombo,
-			_fontVariantCombo, _fontLineHeightNumberCombo,
-			_fontLineHeightUnitCombo, _textTransformCombo;
-
-	private ColorButtonDialogField _colorField;
-
-	private Button _textDecorationUnderlineButton,
-			_textDecorationOverlineButton, _textDecorationLineThroughButton,
-			_textDecorationBlinkButton, _textDecorationNoneButton;
-
-	/**
-	 * @param element
-	 * @param style
-	 */
-	public TextPreferencePage(IDOMElement element, CSSPropertyContext style) {
-		super();
-		_style = style;
-
-		// Set the preference store for the preference page.
-		// IPreferenceStore store =
-		// JMTIntegrationPlugin.getDefault().getPreferenceStore();
-		// setPreferenceStore(store);
-		setTitle(DialogsMessages.getString("TextPreferencePage.Title")); //$NON-NLS-1$
-	}
-
-	/**
-	 * @see org.eclipse.jface.preference.
-	 *      PreferencePage#createContents(Composite)
-	 */
-	protected Control createContents(Composite parent) {
-		GridLayout layout;
-		GridData data;
-
-		Composite top = new Composite(parent, SWT.NONE);
-		layout = new GridLayout(5, false);
-		data = new GridData(GridData.FILL_BOTH);
-		top.setLayout(layout);
-		top.setLayoutData(data);
-
-		Label fontLabel = new Label(top, SWT.NONE);
-		fontLabel.setText(DialogsMessages.getString("TextPreferencePage.Font")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		fontLabel.setLayoutData(data);
-
-		_fontFamilyCombo = new StyleCombo(top, SWT.NONE);
-		_fontFamilyCombo.setItems(IStyleConstants.FONT_FAMILY);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		data.horizontalSpan = 4;
-		_fontFamilyCombo.setLayoutData(data);
-		_fontFamilyCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_style.setFontFamily(_fontFamilyCombo.getText());
-			}
-		});
-
-		Label sizeLabel = new Label(top, SWT.NONE);
-		sizeLabel.setText(DialogsMessages.getString("TextPreferencePage.Size")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		sizeLabel.setLayoutData(data);
-
-		_fontSizeNumberCombo = new StyleCombo(top, SWT.NONE);
-		_fontSizeNumberCombo.setItems(IStyleConstants.FONT_SIZE_NUMBER);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_fontSizeNumberCombo.setLayoutData(data);
-		_fontSizeNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_fontSizeUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_fontSizeNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_fontSizeUnitCombo.setEnabled(false);
-				}
-
-				String size = _fontSizeNumberCombo.getText();
-				if (_fontSizeUnitCombo.isEnabled()) {
-					size += _fontSizeUnitCombo.getText();
-				}
-
-				_style.setFontSize(size);
-			}
-		});
-
-		_fontSizeUnitCombo = new StyleCombo(top, SWT.READ_ONLY);
-		_fontSizeUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_fontSizeUnitCombo.setLayoutData(data);
-		_fontSizeUnitCombo.select(0);
-		_fontSizeUnitCombo.setEnabled(false);
-		_fontSizeUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String size = _fontSizeNumberCombo.getText();
-				if (_fontSizeUnitCombo.isEnabled()) {
-					size += _fontSizeUnitCombo.getText();
-				}
-
-				_style.setFontSize(size);
-			}
-		});
-
-		Label weightLabel = new Label(top, SWT.NONE);
-		weightLabel.setText(DialogsMessages
-				.getString("TextPreferencePage.Weight")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		weightLabel.setLayoutData(data);
-
-		_fontWeightCombo = new StyleCombo(top, SWT.NONE);
-		_fontWeightCombo.setItems(IStyleConstants.FONT_WEIGHT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_fontWeightCombo.setLayoutData(data);
-		_fontWeightCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String weight = _fontWeightCombo.getText();
-				_style.setFontWeight(weight);
-			}
-		});
-
-		Label stylesLabel = new Label(top, SWT.NONE);
-		stylesLabel.setText(DialogsMessages
-				.getString("TextPreferencePage.Style")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		stylesLabel.setLayoutData(data);
-
-		_fontStyleCombo = new StyleCombo(top, SWT.NONE);
-		_fontStyleCombo.setItems(IStyleConstants.FONT_STYLE);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_fontStyleCombo.setLayoutData(data);
-		_fontStyleCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String style = _fontStyleCombo.getText();
-				_style.setFontStyle(style);
-			}
-		});
-
-		new Label(top, SWT.NONE);
-
-		Label variantLabel = new Label(top, SWT.NONE);
-		variantLabel.setText(DialogsMessages
-				.getString("TextPreferencePage.Variant")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		variantLabel.setLayoutData(data);
-
-		_fontVariantCombo = new StyleCombo(top, SWT.NONE);
-		_fontVariantCombo.setItems(IStyleConstants.FONT_VARIANT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_fontVariantCombo.setLayoutData(data);
-		_fontVariantCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String variant = _fontVariantCombo.getText();
-				_style.setFontVariant(variant);
-			}
-		});
-
-		Label lineHeightLabel = new Label(top, SWT.NONE);
-		lineHeightLabel.setText(DialogsMessages
-				.getString("TextPreferencePage.LineHeight")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		lineHeightLabel.setLayoutData(data);
-
-		_fontLineHeightNumberCombo = new StyleCombo(top, SWT.NONE);
-		_fontLineHeightNumberCombo.setItems(IStyleConstants.NORMAL);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_fontLineHeightNumberCombo.setLayoutData(data);
-		_fontLineHeightNumberCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				_fontLineHeightUnitCombo.setEnabled(true);
-				try {
-					Integer.valueOf(_fontLineHeightNumberCombo.getText());
-				} catch (NumberFormatException ex) {
-					_fontLineHeightUnitCombo.setEnabled(false);
-				}
-
-				String height = _fontLineHeightNumberCombo.getText();
-				if (_fontLineHeightUnitCombo.isEnabled()) {
-					height += _fontLineHeightUnitCombo.getText();
-				}
-
-				_style.setLineHeight(height);
-			}
-		});
-
-		_fontLineHeightUnitCombo = new StyleCombo(top, SWT.READ_ONLY);
-		_fontLineHeightUnitCombo.setItems(IStyleConstants.SIZE_UNIT);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_fontLineHeightUnitCombo.setLayoutData(data);
-		_fontLineHeightUnitCombo.select(0);
-		_fontLineHeightUnitCombo.setEnabled(false);
-		_fontLineHeightUnitCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String height = _fontLineHeightNumberCombo.getText();
-				if (_fontLineHeightUnitCombo.isEnabled()) {
-					height += _fontLineHeightUnitCombo.getText();
-				}
-
-				_style.setLineHeight(height);
-			}
-		});
-
-		Label caseLabel = new Label(top, SWT.NONE);
-		caseLabel.setText(DialogsMessages.getString("TextPreferencePage.Case")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		caseLabel.setLayoutData(data);
-
-		_textTransformCombo = new StyleCombo(top, SWT.NONE);
-		_textTransformCombo.setItems(IStyleConstants.FONT_TEXTTRANSFORM);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		_textTransformCombo.setLayoutData(data);
-		_textTransformCombo.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String textTransform = _textTransformCombo.getText();
-				_style.setTextTransform(textTransform);
-			}
-		});
-
-		Label decorationLabel = new Label(top, SWT.NONE);
-		decorationLabel.setText(DialogsMessages
-				.getString("TextPreferencePage.Decoration")); //$NON-NLS-1$
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		decorationLabel.setLayoutData(data);
-
-		Composite decorationComposite = new Composite(top, SWT.NONE);
-		data = new GridData(GridData.FILL_HORIZONTAL);
-		data.horizontalSpan = 4;
-		decorationComposite.setLayoutData(data);
-		layout = new GridLayout(5, true);
-		layout.marginWidth = 0;
-		decorationComposite.setLayout(layout);
-
-		_textDecorationUnderlineButton = new Button(decorationComposite,
-				SWT.CHECK);
-		_textDecorationUnderlineButton
-				.setText(IStyleConstants.TEXT_DECORATION[0]);
-		_textDecorationUnderlineButton
-				.addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						if (_textDecorationUnderlineButton.getSelection()) {
-							_textDecorationNoneButton.setSelection(false);
-						}
-						_style.setTextDecoration(getTextDecoration());
-					}
-				});
-
-		_textDecorationOverlineButton = new Button(decorationComposite,
-				SWT.CHECK);
-		_textDecorationOverlineButton
-				.setText(IStyleConstants.TEXT_DECORATION[1]);
-		_textDecorationOverlineButton
-				.addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						if (_textDecorationOverlineButton.getSelection()) {
-							_textDecorationNoneButton.setSelection(false);
-						}
-						_style.setTextDecoration(getTextDecoration());
-					}
-				});
-
-		_textDecorationLineThroughButton = new Button(decorationComposite,
-				SWT.CHECK);
-		_textDecorationLineThroughButton
-				.setText(IStyleConstants.TEXT_DECORATION[2]);
-		_textDecorationLineThroughButton
-				.addSelectionListener(new SelectionAdapter() {
-					public void widgetSelected(SelectionEvent e) {
-						if (_textDecorationLineThroughButton.getSelection()) {
-							_textDecorationNoneButton.setSelection(false);
-						}
-						_style.setTextDecoration(getTextDecoration());
-					}
-				});
-
-		_textDecorationBlinkButton = new Button(decorationComposite, SWT.CHECK);
-		_textDecorationBlinkButton.setText(IStyleConstants.TEXT_DECORATION[3]);
-		_textDecorationBlinkButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				if (_textDecorationBlinkButton.getSelection()) {
-					_textDecorationNoneButton.setSelection(false);
-				}
-				_style.setTextDecoration(getTextDecoration());
-			}
-		});
-
-		_textDecorationNoneButton = new Button(decorationComposite, SWT.CHECK);
-		_textDecorationNoneButton.setText(IStyleConstants.TEXT_DECORATION[4]);
-		_textDecorationNoneButton.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				if (_textDecorationNoneButton.getSelection()) {
-					_textDecorationUnderlineButton.setSelection(false);
-					_textDecorationOverlineButton.setSelection(false);
-					_textDecorationLineThroughButton.setSelection(false);
-					_textDecorationBlinkButton.setSelection(false);
-				}
-				_style.setTextDecoration(getTextDecoration());
-			}
-		});
-
-		_colorField = new ColorButtonDialogField(SWT.BORDER, new ColorUtil());
-		_colorField.setLabelText(DialogsMessages
-				.getString("TextPreferencePage.Color"));
-
-		data = new GridData(GridData.HORIZONTAL_ALIGN_END);
-		_colorField.getLabelControl(null, top).setLayoutData(data);
-
-		data = new GridData();
-		data.horizontalAlignment = GridData.FILL;
-		data.grabExcessHorizontalSpace = false;
-		_colorField.getComboControl(null, top).setLayoutData(data);
-
-		data = new GridData();
-		_colorField.getChangeControl(null, top).setLayoutData(data);
-		_colorField
-				.setDialogFieldApplyListener(new IDialogFieldApplyListener() {
-					public void dialogFieldApplied(DialogField field) {
-						String color = _colorField.getText();
-						_style.setColor(color);
-					}
-				});
-
-		initializeControls();
-
-		return top;
-	}
-
-	private void initializeControls() {
-		// font-family
-		String fontFamily = _style.getFontFamily();
-		if (!isEmptyString(fontFamily)) {
-			int index = _fontFamilyCombo.indexOf(fontFamily);
-			if (index != -1) {
-				_fontFamilyCombo.select(index);
-			} else {
-				_fontFamilyCombo.setText(fontFamily);
-			}
-		}
-
-		// font-size
-		String fontSize = _style.getFontSize();
-		if (!isEmptyString(fontSize)) {
-			int index = _fontSizeNumberCombo.indexOf(fontSize);
-			if (index != -1) {
-				_fontSizeNumberCombo.select(index);
-			} else {
-				_fontSizeNumberCombo.setText(fontSize);
-			}
-		}
-
-		// font-weight
-		String fontWeight = _style.getFontWeight();
-		if (!isEmptyString(fontWeight)) {
-			int index = _fontWeightCombo.indexOf(fontWeight);
-			if (index != -1) {
-				_fontWeightCombo.select(index);
-			} else {
-				_fontWeightCombo.setText(fontWeight);
-			}
-		}
-
-		// font-style
-		String fontStyle = _style.getFontStyle();
-		if (!isEmptyString(fontStyle)) {
-			int index = _fontStyleCombo.indexOf(fontStyle);
-			if (index != -1) {
-				_fontStyleCombo.select(index);
-			} else {
-				_fontStyleCombo.setText(fontStyle);
-			}
-		}
-
-		// font-variant
-		String fontVariant = _style.getFontVariant();
-		if (!isEmptyString(fontVariant)) {
-			int index = _fontVariantCombo.indexOf(fontVariant);
-			if (index != -1) {
-				_fontVariantCombo.select(index);
-			} else {
-				_fontVariantCombo.setText(fontVariant);
-			}
-		}
-
-		// line-height
-		String lineHeight = _style.getLineHeight();
-		if (!isEmptyString(lineHeight)) {
-			int index = _fontLineHeightNumberCombo.indexOf(lineHeight);
-			if (index != -1) {
-				_fontLineHeightNumberCombo.select(index);
-			} else {
-				_fontLineHeightNumberCombo.setText(lineHeight);
-			}
-		}
-
-		// text-transform
-		String textTransform = _style.getTextTransform();
-		if (!isEmptyString(textTransform)) {
-			int index = _textTransformCombo.indexOf(textTransform);
-			if (index != -1) {
-				_textTransformCombo.select(index);
-			} else {
-				_textTransformCombo.setText(textTransform);
-			}
-		}
-
-		// text-decoration
-		String textDecoration = _style.getTextDecoration();
-		if (!isEmptyString(textDecoration)) {
-			int index = textDecoration
-					.indexOf(IStyleConstants.TEXT_DECORATION[0]);
-			if (index != -1) {
-				_textDecorationUnderlineButton.setSelection(true);
-			} else {
-				_textDecorationUnderlineButton.setSelection(false);
-			}
-
-			index = textDecoration.indexOf(IStyleConstants.TEXT_DECORATION[1]);
-			if (index != -1) {
-				_textDecorationOverlineButton.setSelection(true);
-			} else {
-				_textDecorationOverlineButton.setSelection(false);
-			}
-
-			index = textDecoration.indexOf(IStyleConstants.TEXT_DECORATION[2]);
-			if (index != -1) {
-				_textDecorationLineThroughButton.setSelection(true);
-			} else {
-				_textDecorationLineThroughButton.setSelection(false);
-			}
-
-			index = textDecoration.indexOf(IStyleConstants.TEXT_DECORATION[3]);
-			if (index != -1) {
-				_textDecorationBlinkButton.setSelection(true);
-			} else {
-				_textDecorationBlinkButton.setSelection(false);
-			}
-
-			index = textDecoration.indexOf(IStyleConstants.TEXT_DECORATION[4]);
-			if (index != -1) {
-				_textDecorationNoneButton.setSelection(true);
-			} else {
-				_textDecorationNoneButton.setSelection(false);
-			}
-		}
-
-		// color
-		String color = _style.getColor();
-		if (!isEmptyString(color)) {
-			_colorField.setTextWithoutUpdate(color);
-		}
-	}
-
-	private String getTextDecoration() {
-		StringBuffer textDecoration = new StringBuffer();
-		if (_textDecorationUnderlineButton.getSelection()) {
-			textDecoration.append(_textDecorationUnderlineButton.getText())
-					.append(' ');
-		}
-		if (_textDecorationOverlineButton.getSelection()) {
-			textDecoration.append(_textDecorationOverlineButton.getText())
-					.append(' ');
-		}
-		if (_textDecorationLineThroughButton.getSelection()) {
-			textDecoration.append(_textDecorationLineThroughButton.getText())
-					.append(' ');
-		}
-		if (_textDecorationBlinkButton.getSelection()) {
-			textDecoration.append(_textDecorationBlinkButton.getText()).append(
-					' ');
-		}
-		if (_textDecorationNoneButton.getSelection()) {
-			textDecoration.append(_textDecorationNoneButton.getText()).append(
-					' ');
-		}
-
-		return textDecoration.toString().trim();
-	}
-
-	public void setVisible(boolean visible) {
-		super.setVisible(visible);
-
-		getApplyButton().setVisible(false);
-		getDefaultsButton().setVisible(false);
-	}
-
-	private boolean isEmptyString(String str) {
-		if (str == null || str.length() == 0) {
-			return true;
-		}
-        return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/BodyHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/BodyHelper.java
deleted file mode 100644
index 2a20b1a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/BodyHelper.java
+++ /dev/null
@@ -1,345 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import java.util.ArrayList;
-import java.util.Comparator;
-
-import javax.xml.namespace.QName;
-
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.adapters.IBodyInfo;
-import org.eclipse.jst.pagedesigner.adapters.internal.BodyInfo;
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition2;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMText;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * This class helps location insertion position to inside correct body or doc
- * prefix. NOTE: this class only doing limited support on doc level position
- * validation. Element specific position validation will be done in other
- * places.
- * 
- * @author mengbo
- */
-public class BodyHelper {
-	// bit flags used for child skipping.
-	/**
-	 * Bit flag for empty text node
-	 */
-	public static final int EMPTY_TEXT = 1;
-
-	/**
-	 * Bit flag for comment node
-	 */
-	public static final int COMMENT = 2;
-
-	/**
-	 * Bit flag for HEAD node
-	 */
-	public static final int HEADER = 3;
-
-	/**
-	 * 
-	 * @param child
-	 * @return boolean
-	 */
-	private static boolean isSkippableChild(Node parent, Node child, int flag) {
-		if ((flag & COMMENT) != 0 && child.getNodeType() == Node.COMMENT_NODE)
-			return true;
-		if ((flag & EMPTY_TEXT) != 0 && child instanceof IDOMText
-				&& ((IDOMText) child).isElementContentWhitespace())
-			return true;
-
-		if ((flag & HEADER) != 0 && child.getNodeType() == Node.ELEMENT_NODE) {
-			String uri = CMUtil.getElementNamespaceURI((Element) child);
-			IBodyInfo parentInfo = getBodyInfo((IDOMNode) parent);
-			if (parentInfo != null
-					&& parentInfo.isBodyHeader((IDOMNode) parent, uri,
-							((Element) child).getLocalName()))
-				return true;
-		}
-		return false;
-	}
-
-	/**
-	 * check whether uri/tag should be header of any body container that is
-	 * ancester of the start node.
-	 * 
-	 * @param start
-	 * @param uri
-	 * @param tag
-	 * @return IDOMNode
-	 */
-	public static IDOMNode findHeaderContainer(IDOMNode start, String uri,
-			String tag) {
-		while (start != null) {
-			IBodyInfo designInfo = getBodyInfo(start);
-			if (designInfo != null && designInfo.isBodyContainer(start)) {
-				if (designInfo.isBodyHeader(start, uri, tag))
-					return start;
-			}
-			start = (IDOMNode) start.getParentNode();
-		}
-		return null;
-	}
-
-	/**
-	 * find the closest body insertion point, to make it as deep as possible.
-	 * (Move into as more body as possible)
-	 * @param position 
-	 * @return IDOMPosition
-	 */
-	public static IDOMPosition findBodyInsertLocation(IDOMPosition position) {
-		// forward first.
-		Node reference = position.getNextSiblingNode();
-		Node container = position.getContainerNode();
-		while (reference != null) {
-			IBodyInfo info = getBodyInfo((IDOMNode) reference);
-			if (info != null && info.isBodyContainer((IDOMNode) reference)) {
-				// good, we find a body!
-				position = new DOMPosition(reference, 0);
-				return findBodyInsertLocation(position);
-			}
-			if (isSkippableChild(container, reference, EMPTY_TEXT | COMMENT
-					| HEADER)) {
-				reference = reference.getNextSibling();
-				continue;
-			}
-            break;
-		}
-
-		// backward
-		reference = position.getPreviousSiblingNode();
-		while (reference != null) {
-			IBodyInfo info = getBodyInfo((IDOMNode) reference);
-			if (info != null && info.isBodyContainer((IDOMNode) reference)) {
-				// good, we find a body!
-				position = new DOMPosition(reference, reference.getChildNodes()
-						.getLength());
-				return findBodyInsertLocation(position);
-			}
-			// XXX: not skip header here. So if there is some header with wrong
-			// location, we will respect user.
-			if (isSkippableChild(container, reference, EMPTY_TEXT | COMMENT)) {
-				reference = reference.getPreviousSibling();
-				continue;
-			}
-            break;
-		}
-
-		// not find any body at same level as the insertion point.
-		return position;
-	}
-
-	/**
-	 * The element type identified by "uri" and "tag" is going to be inserted
-	 * into the document. This method is used to adjust the insert position so
-	 * it can be put into correct body or header section.
-	 * @param uri 
-	 * @param tag 
-	 * @param position 
-	 * @return IDOMPosition
-	 * 
-	 */
-	public static IDOMPosition adjustInsertPosition(String uri, String tag,
-			IDOMPosition position) {
-		IDOMNode parent = (IDOMNode) position.getContainerNode();
-		IBodyInfo designInfo = getBodyInfo(parent);
-		if (designInfo == null) {
-			return position; // should not happen.
-		}
-
-		IDOMNode headerContainer = findHeaderContainer(parent, uri, tag);
-
-		if (headerContainer == null) {
-			// the new node is not header.
-			if (shouldIgnoreAdjust(uri, tag)) {
-				return position;
-			}
-
-			// new node is not body header. So should place inside the inner most
-			// body.
-			if (!designInfo.isBodyContainer(parent)) {
-				return position; // it's parent is not body, so we suggest
-				// it's parent already correctly located, and respect user's
-				// choice.
-			}
-
-			// ok, we are inside some body, but we don't know whether we are in
-			// the inner most body.
-			// try to find a body container at same level and see whether we can
-			// move into that body.
-			return findBodyInsertLocation(position);
-		}
-        // good, we find a body container and the new node should be header
-        // of it.
-        Node child = headerContainer.getFirstChild();
-
-        // if parent is different from headerContainer, then
-        // child!=referenceHolder[0] will always be true
-        while (child != null) // && child != refNode)
-        {
-        	Comparator comp = NodeLocationComparator.getInstance();
-        	// Currently the comparator deels with tags like taglib and
-        	// loadbundle particularly, comparasion result 0
-        	// means it didn't compare the tags.
-        	if (comp.compare(child, tag) < 0
-        			|| (comp.compare(child, tag) == 0 && isSkippableChild(
-        					headerContainer, child, COMMENT | EMPTY_TEXT
-        							| HEADER))) {
-        		child = child.getNextSibling();
-        	} else {
-        		break;
-        	}
-        }
-        if (child != null) {
-        	return new DOMRefPosition(child, false);
-        }
-        return new DOMPosition(parent, parent.getChildNodes()
-        		.getLength());
-	}
-
-	/**
-	 * Find the position to insert a header element into the specified parent.
-	 * 
-	 * @param uri
-	 * @param tag
-	 * @param parent
-	 * @param ref 
-	 */
-	public static void findHeaderInsertPosition(String uri, String tag,
-			Node parent, Node[] ref) {
-		Node child = parent.getFirstChild();
-		while (child != null) {
-			Comparator comp = NodeLocationComparator.getInstance();
-			if (comp.compare(child, tag) < 0
-					|| (comp.compare(child, tag) == 0 && isSkippableChild(
-							parent, child, COMMENT | EMPTY_TEXT | HEADER))) {
-				child = child.getNextSibling();
-			} else {
-				break;
-			}
-		}
-		ref[0] = child;
-		return;
-	}
-
-	/**
-	 * @param position
-	 * @param body
-	 * @param defaultPrefix
-	 * @return the new dom position based on the insert.  May return null if
-	 * insert fails.
-	 */
-	public static IDOMPosition insertBody(IDOMPosition position, QName body,
-			String defaultPrefix) {
-		IBodyInfo bodyInfo = getBodyInfo((IDOMNode) position.getContainerNode());
-
-		Node node = position.getContainerNode();
-		final Node originalContainer = node;
-		final Node nextSibling = position.getNextSiblingNode();
-
-		// create the body element first.
-		Document ownerDoc;
-		if (node instanceof Document) {
-			ownerDoc = (Document) node;
-		} else {
-			ownerDoc = node.getOwnerDocument();
-		}
-		if (ownerDoc == null) {
-			return null; // should not happen
-		}
-
-		final String prefix = JSPUtil.getOrCreatePrefix(((IDOMNode) node).getModel(),
-				body.getNamespaceURI(), defaultPrefix);
-		final Element ele = ownerDoc.createElement((prefix == null ? ""
-				: (prefix + ":"))
-				+ body.getLocalPart());
-
-		// need to find out the insertion point
-		while (node instanceof IDOMNode) {
-			if (bodyInfo.isBodyContainer((IDOMNode) node)) {
-				// ok, node is a body container.
-				// we could create the new node as child of node and move all
-				// node's none header children
-				// as children of the new node.
-
-				NodeList nl = node.getChildNodes();
-				ArrayList list = new ArrayList();
-				for (int i = 0; i < nl.getLength(); i++) {
-					Node child = nl.item(i);
-					if (isSkippableChild(node, child, HEADER | COMMENT
-							| EMPTY_TEXT)) {
-						continue;
-					}
-					list.add(nl.item(i));
-				}
-				for (int i = 0; i < list.size(); i++) {
-					ele.appendChild((Node) list.get(i));
-				}
-				node.appendChild(ele);
-
-				if (node == originalContainer) {
-					if (nextSibling == null) {
-						return new DOMRefPosition2(ele, true);
-					} else if (nextSibling.getParentNode() == ele) {
-						// next sibling is not in header part
-						return new DOMRefPosition(nextSibling, false);
-					} else {
-						return new DOMPosition(ele, 0);
-					}
-				}
-                return position;
-			}
-			node = node.getParentNode();
-		}
-		// should not happen, because document and documentfragment node will
-		// always be body node
-		// so if reach here, means the position is not in document.
-		return null;
-	}
-
-	/**
-	 * For certain special tags, do not following the "header"/"body" separation
-	 * and can't fit into the relocation process.
-	 * 
-	 * @param uri
-	 * @param tag
-	 * @return true if tag is an element that should be moved in response to 
-	 * body insert.
-	 */
-	public static boolean shouldIgnoreAdjust(String uri, String tag) {
-		// FIXME:
-		return (ITLDConstants.URI_HTML.equalsIgnoreCase(uri) && "script"
-				.equalsIgnoreCase(tag))
-				|| (ITLDConstants.URI_JSP.equals(uri));
-	}
-
-	/**
-	 * @param node
-	 * @return the body info corresponding to node (should we use a node adapter?)
-	 */
-	public static IBodyInfo getBodyInfo(IDOMNode node) {
-		// TODO: in the future, when bodyinfo is no longer singleton, we'll use
-		// adapter mechanism.
-		return BodyInfo.getInstance();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/CacheManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/CacheManager.java
deleted file mode 100644
index 5483281..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/CacheManager.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.Map;
-
-/**
- * This is a cache manager. It will use the ICacheEntryCreator interface to
- * manage creating new item and dispose old item.
- * 
- * @author mengbo
- * @version 1.5
- */
-public class CacheManager {
-	ICacheEntryCreator _creator;
-
-	int _maxSize;
-
-	// key --> value
-	Map _map = new HashMap();
-
-	// keep track of LRU
-	LinkedList _keys = new LinkedList();
-
-	/**
-	 * @param creator
-	 * @param maxSize
-	 */
-	public CacheManager(ICacheEntryCreator creator, int maxSize) {
-		_creator = creator;
-		_maxSize = maxSize;
-		if (_maxSize <= 0) {
-			_maxSize = 10;
-		}
-	}
-
-	/**
-	 * @param key
-	 * @return the cache entry for key
-	 */
-	public Object getEntry(Object key) {
-		Object result = _map.get(key);
-		if (result == null) {
-			// not existed yet.
-			if (_map.size() >= _maxSize) {
-				// we need to remove the oldest one.
-				Object keyRemove = _keys.removeFirst();
-				Object objToRemove = _map.remove(keyRemove);
-				_creator.dispose(keyRemove, objToRemove);
-			}
-			result = _creator.createEntry(key);
-			_keys.addLast(key);
-			_map.put(key, result);
-			return result;
-		}
-        _keys.remove(key);
-        _keys.addLast(key);
-        return result;
-	}
-
-	/**
-	 * Dispose the cache
-	 */
-	public void disposeAll() {
-		_keys.clear();
-		for (Iterator iter = _map.keySet().iterator(); iter.hasNext();) {
-			Object key = iter.next();
-			Object entry = _map.get(key);
-			_creator.dispose(key, entry);
-		}
-		_map.clear();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/CommandUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/CommandUtil.java
deleted file mode 100644
index b86284f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/CommandUtil.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
-import org.eclipse.jst.jsf.common.metadata.query.TaglibDomainMetaDataQueryHelper;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.editors.palette.TagToolPaletteEntry;
-import org.eclipse.jst.pagedesigner.itemcreation.CreationData;
-import org.eclipse.jst.pagedesigner.itemcreation.ITagCreator;
-import org.eclipse.jst.pagedesigner.itemcreation.internal.TagCreationFactory;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class CommandUtil {
-	private static final Logger _log = PDPlugin.getLogger(CommandUtil.class);
-
-	/**
-	 * @param tagItem
-	 * @param model
-	 * @param domPosition
-	 * @param customizationData 
-	 * @return the element inserted or null if failed
-	 */
-	public static Element excuteInsertion(TagToolPaletteEntry tagItem,
-			IDOMModel model, IDOMPosition domPosition, IAdaptable customizationData) {
-		try 
-		{	
-		    IStructuredDocument doc = model.getDocument().getStructuredDocument();
-		    
-		    IStructuredDocumentContext context =
-		        IStructuredDocumentContextFactory.INSTANCE.getContext(doc, -1);
-		    IWorkspaceContextResolver  resolver =
-		        IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver(context);
-		    
-		    IProject project = resolver.getProject();
-		    
-            final ITaglibDomainMetaDataModelContext modelContext = 
-                TaglibDomainMetaDataQueryHelper
-                    .createMetaDataModelContext(project, tagItem.getURI());
-
-            // TODO: note that the constructor currently causes the prefix defn
-            // to be added to the target doc.  This should be moved into
-            // an ensure method in the AbstractTagCreator
-            final CreationData creationData = 
-                new CreationData(tagItem, model, domPosition, modelContext, customizationData);
-
-		    ITagCreator tagCreator = 
-			    TagCreationFactory.getInstance().createTagCreator(creationData.getTagId());
-			
-			if (tagCreator == null)
-			{
-				return null;//should never get here!
-			}
-
-			return tagCreator.createTag(creationData);
-		} catch (Exception e) {
-			_log.error("Problem creating tag "+tagItem.getTagName()+" at:" + domPosition + "\n", e);
-		}
-        return null;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/DOMUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/DOMUtil.java
deleted file mode 100644
index 098d285..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/DOMUtil.java
+++ /dev/null
@@ -1,260 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.wst.xml.core.internal.document.ElementImpl;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public class DOMUtil {
-	/**
-	 * @param parent
-	 * @param tag
-	 * @return the list of child elements  of parent that are Elements
-	 * and that have name 'tag' ignoring case
-	 */
-	public static List getChildElementsByTagIgnoreCase(Element parent,
-			String tag) {
-		List ret = new ArrayList();
-		NodeList nodeList = parent.getChildNodes();
-		for (int i = 0, size = nodeList.getLength(); i < size; i++) {
-			Node node = nodeList.item(i);
-			if (node.getNodeType() == Node.ELEMENT_NODE) {
-				String t = node.getNodeName();
-				if (tag.equalsIgnoreCase(t)) {
-					ret.add(node);
-				}
-			}
-		}
-		return ret;
-	}
-
-	/**
-	 * @param ele
-	 * @return the element value of the TEXT_NODE children of element
-	 * concat'd together
-	 */
-	public static String getTextElementValue(Element ele) {
-		StringBuffer buffer = new StringBuffer();
-		Node node = ele.getFirstChild();
-		while (node != null) {
-			if (node.getNodeType() == Node.TEXT_NODE) {
-				buffer.append(node.getNodeValue());
-			} else if (node.getNodeType() == Node.CDATA_SECTION_NODE) {
-				buffer.append(node.getNodeValue());
-			}
-			node = node.getNextSibling();
-		}
-		return buffer.toString();
-	}
-
-	/**
-	 * @param element
-	 * @param string
-	 * @return the attribute named string on element ignoring case in the comparison
-	 * or null if not found
-	 */
-	public static String getAttributeIgnoreCase(Element element, String string) {
-		NamedNodeMap map = element.getAttributes();
-		for (int i = 0; i < map.getLength(); i++) {
-			Node attr = map.item(i);
-			if (string.equalsIgnoreCase(attr.getNodeName())) {
-				return attr.getNodeValue();
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param parent
-	 * @param tags
-	 * @return the list of children of parent with name in tags ignoring case
-	 */
-	public static List getChildrenByTagsIgnoreCase(Element parent, String[] tags) {
-		List result = new ArrayList();
-		NodeList nodeList = parent.getChildNodes();
-		for (int i = 0, size = nodeList.getLength(); i < size; i++) {
-			Node node = nodeList.item(i);
-			if (node.getNodeType() == Node.ELEMENT_NODE) {
-				String t = node.getNodeName();
-				for (int k = 0; k < tags.length; k++) {
-					if (tags[k].equalsIgnoreCase(t)) {
-						result.add(node);
-						break;
-					}
-				}
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @param ele
-	 */
-	public static void removeAllChildren(Element ele) {
-		((ElementImpl) ele).removeChildNodes();
-	}
-
-	/**
-	 * @param ele
-	 * @param value
-	 */
-	public static void setTextElementValue(Element ele, String value) {
-		removeAllChildren(ele);
-		Text txt = ele.getOwnerDocument().createTextNode(value);
-		ele.appendChild(txt);
-	}
-
-	/**
-	 * @param ele 
-	 * @param attr 
-	 * @param defaultvalue 
-	 * @return the integer attribute of ele called attr.  Default value
-	 * is returned if the attribute is not found.
-	 */
-	public static int getIntAttributeIgnoreCase(Element ele, String attr,
-			int defaultvalue) {
-		if (ele == null) {
-			return defaultvalue;
-		}
-		String attrvalue = getAttributeIgnoreCase(ele, attr);
-		if (attrvalue == null) {
-			return defaultvalue;
-		}
-        try {
-        	return Integer.parseInt(attrvalue);
-        } catch (NumberFormatException  ex) {
-        	return defaultvalue;
-        }
-	}
-
-	/**
-	 * get all child elements
-	 * 
-	 * @param ele
-	 * @return the list of element children of type ELEMENT_NODE
-	 */
-	public static List getElementChildren(Element ele) {
-		List ret = new ArrayList();
-		NodeList nodeList = ele.getChildNodes();
-		for (int i = 0, size = nodeList.getLength(); i < size; i++) {
-			Node node = nodeList.item(i);
-			if (node.getNodeType() == Node.ELEMENT_NODE) {
-				ret.add(node);
-			}
-		}
-		return ret;
-	}
-
-	/**
-	 * judge whether element has an attribute named attrName
-	 * 
-	 * @param ele
-	 * @param attrName
-	 * @return true if element has attribute called attrName ignoring
-	 * case  in the comparison.
-	 */
-	public static boolean hasAttribute(Element ele, String attrName) {
-		NamedNodeMap map = ele.getAttributes();
-		for (int i = 0; i < map.getLength(); i++) {
-			Node attr = map.item(i);
-			if (attr.getNodeName().equalsIgnoreCase(attrName)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @param node
-	 * @param sb
-	 */
-	public static void nodeToString(Node node, StringBuffer sb) {
-		int type = node.getNodeType();
-		switch (type) {
-		case Node.DOCUMENT_NODE:
-			sb.append("<?xml version=\"1.0\" ?>");
-			nodeToString(((Document) node).getDocumentElement(), sb);
-			break;
-
-		case Node.ELEMENT_NODE:
-			sb.append("<");
-			sb.append(node.getNodeName());
-			NamedNodeMap attrs = node.getAttributes();
-			for (int i = 0; i < attrs.getLength(); i++) {
-				Node attr = attrs.item(i);
-				sb.append(" " + attr.getNodeName() + "=\""
-						+ attr.getNodeValue() + "\"");
-			}
-
-			NodeList children = node.getChildNodes();
-			if (children != null) {
-				int len = children.getLength();
-				if (len != 0) {
-					sb.append(">");
-				}
-				for (int i = 0; i < len; i++) {
-					nodeToString(children.item(i), sb);
-				}
-			}
-			break;
-
-		case Node.ENTITY_REFERENCE_NODE:
-			sb.append("&");
-			sb.append(node.getNodeName());
-			sb.append(";");
-			break;
-
-		case Node.CDATA_SECTION_NODE:
-			sb.append("<![CDATA[");
-			sb.append(node.getNodeValue());
-			sb.append("]]>");
-			break;
-
-		case Node.TEXT_NODE:
-			sb.append(node.getNodeValue());
-			break;
-
-		case Node.PROCESSING_INSTRUCTION_NODE:
-			sb.append("<?");
-			sb.append(node.getNodeName());
-			String data = node.getNodeValue();
-			{
-				sb.append(" ");
-				sb.append(data);
-			}
-			sb.append("?>");
-			break;
-		}
-
-		if (type == Node.ELEMENT_NODE) {
-			if (node.getFirstChild() != null) {
-				sb.append("</");
-				sb.append(node.getNodeName());
-				sb.append(">");
-			} else {
-				sb.append("/>");
-			}
-
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/EntityMap.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/EntityMap.java
deleted file mode 100644
index 0b68bad..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/EntityMap.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-
-/**
- * @author mengbo
- */
-public class EntityMap {
-	private static Logger _log = PDPlugin.getLogger(EntityMap.class);
-
-	/**
-	 * @param s
-	 * @return s translated for HTML entities.
-	 */
-	public static String translate(String s) {
-		char[] array = s.toCharArray();
-		StringBuffer buffer = new StringBuffer();
-		int posi = 0;
-		int len = array.length;
-		while (posi < len) {
-			if (array[posi] != '&') {
-				buffer.append(replaceBadEntity(array[posi++]));
-				continue;
-			}
-
-			// now array[posi] == '&'
-			int lastPosi = posi;
-			posi++;
-			if (posi < len && array[posi] == '#') {
-				posi++;
-			}
-			while (posi < len) {
-				if (!Character.isLetterOrDigit(array[posi]))
-                {
-					break;
-                }
-				posi++;
-			}
-			// now posi>=array.length or array[posi] is non letter or digit
-			String str = new String(array, lastPosi, posi - lastPosi);
-			if (translateEntity(str, buffer)) {
-				// translated, skip the ';'
-				if (posi < len && array[posi] == ';') {
-					posi++;
-				}
-			}
-
-			if (posi == len) {
-				return buffer.toString();
-			}
-		}
-		return buffer.toString();
-	}
-
-	/**
-	 * Translate entity maps and compact whitespace. For heading and training
-	 * space, will not trim, only compact (making multiple whitespace to become
-	 * a single ' ' char).
-	 * @param s 
-	 * @return the result string.
-	 */
-	public static String translateAndCompact(String s) {
-		char[] array = s.toCharArray();
-		StringBuffer buffer = new StringBuffer();
-		int posi = 0;
-		int len = array.length;
-		while (posi < len) {
-			if (HTMLUtil.isHTMLWhitespace(array[posi])) {
-				while (++posi < len && HTMLUtil.isHTMLWhitespace(array[posi]))
-                {
-                    // no body
-                    // loop until we have find non-whitepspace or endof array
-                }
-
-                buffer.append(' ');
-				continue;
-			}
-			if (array[posi] != '&') {
-				buffer.append(replaceBadEntity(array[posi++]));
-				continue;
-			}
-
-			// now array[posi] == '&'
-			int lastPosi = posi;
-			posi++;
-			if (posi < len && array[posi] == '#') {
-				posi++;
-			}
-			while (posi < len) {
-				if (!Character.isLetterOrDigit(array[posi])) {
-					break;
-				}
-                posi++;
-			}
-			// now posi>=array.length or array[posi] is non letter or digit
-			String str = new String(array, lastPosi, posi - lastPosi);
-
-			if (translateEntity(str, buffer)) {
-				// translated, skip the ';'
-				if (posi < len && array[posi] == ';') {
-					posi++;
-				}
-			}
-
-			if (posi == len) {
-				return buffer.toString();
-			}
-		}
-		return buffer.toString();
-	}
-
-	/**
-	 * if can translate will return true and append the result string if can't
-	 * translate will return false and append original string
-	 * 
-	 * @param s
-	 *            the form &#number or &letterordigit without the trailing ";"
-	 * @param strBuf 
-	 * @return true  the translation can be done
-	 */
-	public static boolean translateEntity(String s, StringBuffer strBuf) {
-		int i = HTMLSpecialCharHelper.getSpecial(s); // HTMLSpecialCharHelper
-		// support without
-		// traning ';'
-		if (i != -1) {
-			strBuf.append((char) i);
-			return true;
-		}
-		if (s.length() > 2 && s.charAt(1) == '#') {
-			String number;
-			number = s.substring(2);
-			try {
-				int n;
-				if (number.length() > 0
-						&& (number.charAt(0) == 'x' || number.charAt(0) == 'X')) {
-					n = Integer.parseInt(number.substring(1), 16);
-				} else {
-					n = Integer.parseInt(number);
-				}
-				strBuf.append(replaceBadEntity((char) n));
-				return true;
-			} catch (Exception ex) {
-				// Error in integer formating
-				_log.info("Error occurred in integer formatting", ex); //$NON-NLS-1$
-				strBuf.append(s);
-				return false;
-			}
-		}
-        strBuf.append(s);
-        return false;
-	}
-
-	/**
-	 * In HTML &#149; is sometimes used (mostly based on CP 1252), but is
-	 * illegal, because it does not exist in Unicode
-	 * 
-	 * @param n
-	 * @return
-	 * see http://www.w3.org/Talks/1999/0830-tutorial-unicode-mjd/slide27-0.html
-	 */
-	private static char replaceBadEntity(char n) {
-		if (n < 132 || n > 156)
-			return n;
-		switch (n) {
-		case 132:
-			return (char) 8222;
-		case 133:
-			return (char) 8230;
-		case 134:
-			return (char) 8224;
-		case 135:
-			return (char) 8225;
-		case 139:
-			return (char) 8249;
-		case 140:
-			return (char) 338;
-		case 145:
-			return (char) 8216;
-		case 146:
-			return (char) 8217;
-		case 147:
-			return (char) 8220;
-		case 148:
-			return (char) 8221;
-		case 149:
-			return (char) 8226;
-		case 151:
-			return (char) 8212;
-		case 153:
-			return (char) 8482;
-		case 155:
-			return (char) 8250;
-		case 156:
-			return (char) 339;
-		default:
-			return n;
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/HTMLSpecialCharHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/HTMLSpecialCharHelper.java
deleted file mode 100644
index 4959198..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/HTMLSpecialCharHelper.java
+++ /dev/null
@@ -1,464 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import java.io.IOException;
-import java.io.Writer;
-import java.util.Enumeration;
-import java.util.Hashtable;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-
-/**
- * entity map support.
- * 
- * @author mengbo
- */
-public class HTMLSpecialCharHelper {
-	private static Logger _log = PDPlugin
-			.getLogger(HTMLSpecialCharHelper.class);
-
-	private static Hashtable _table;
-
-	private static Hashtable _reverse;
-	static {
-		_table = new Hashtable(256);
-
-		_table.put(Integer.valueOf(34), "&quot;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(38), "&amp;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(60), "&lt;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(62), "&gt;"); //$NON-NLS-1$
-
-		_table.put(Integer.valueOf(160), "&nbsp;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(161), "&iexcl;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(162), "&cent;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(163), "&pound;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(164), "&curren;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(165), "&yen;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(166), "&brvbar;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(167), "&sect;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(168), "&uml;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(169), "&copy;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(170), "&ordf;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(171), "&laquo;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(172), "&not;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(173), "&shy;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(174), "&reg;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(175), "&macr;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(176), "&deg;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(177), "&plusmn;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(178), "&sup2;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(179), "&sup3;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(180), "&acute;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(181), "&micro;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(182), "&para;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(183), "&middot;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(184), "&cedil;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(185), "&sup1;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(186), "&ordm;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(187), "&raquo;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(188), "&frac14;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(189), "&frac12;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(190), "&frac34;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(191), "&iquest;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(192), "&Agrave;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(193), "&Aacute;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(194), "&Acirc;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(195), "&Atilde;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(196), "&Auml;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(197), "&Aring;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(198), "&AElig;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(199), "&Ccedil;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(200), "&Egrave;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(201), "&Eacute;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(202), "&Ecirc;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(203), "&Euml;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(204), "&Igrave;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(205), "&Iacute;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(206), "&Icirc;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(207), "&Iuml;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(208), "&ETH;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(209), "&Ntilde;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(210), "&Ograve;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(211), "&Oacute;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(212), "&Ocirc;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(213), "&Otilde;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(214), "&Ouml;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(215), "&times;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(216), "&Oslash;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(217), "&Ugrave;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(218), "&Uacute;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(219), "&Ucirc;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(220), "&Uuml;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(221), "&Yacute;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(222), "&THORN;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(223), "&szlig;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(224), "&agrave;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(225), "&aacute;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(226), "&acirc;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(227), "&atilde;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(228), "&auml;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(229), "&aring;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(230), "&aelig;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(231), "&ccedil;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(232), "&egrave;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(233), "&eacute;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(234), "&ecirc;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(235), "&euml;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(236), "&igrave;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(237), "&iacute;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(238), "&icirc;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(239), "&iuml;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(240), "&eth;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(241), "&ntilde;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(242), "&ograve;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(243), "&oacute;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(244), "&ocirc;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(245), "&otilde;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(246), "&ouml;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(247), "&divide;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(248), "&oslash;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(249), "&ugrave;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(250), "&uacute;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(251), "&ucirc;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(252), "&uuml;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(253), "&yacute;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(254), "&thorn;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(255), "&yuml;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(402), "&fnof;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(913), "&Alpha;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(914), "&Beta;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(915), "&Gamma;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(916), "&Delta;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(917), "&Epsilon;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(918), "&Zeta;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(919), "&Eta;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(920), "&Theta;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(921), "&Iota;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(922), "&Kappa;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(923), "&Lambda;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(924), "&Mu;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(925), "&Nu;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(926), "&Xi;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(927), "&Omicron;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(928), "&Pi;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(929), "&Rho;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(931), "&Sigma;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(932), "&Tau;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(933), "&Upsilon;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(934), "&Phi;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(935), "&Chi;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(936), "&Psi;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(937), "&Omega;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(945), "&alpha;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(946), "&beta;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(947), "&gamma;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(948), "&delta;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(949), "&epsilon;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(950), "&zeta;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(951), "&eta;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(952), "&theta;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(953), "&iota;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(954), "&kappa;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(955), "&lambda;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(956), "&mu;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(957), "&nu;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(958), "&xi;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(959), "&omicron;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(960), "&pi;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(961), "&rho;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(962), "&sigmaf;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(963), "&sigma;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(964), "&tau;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(965), "&upsilon;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(966), "&phi;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(967), "&chi;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(968), "&psi;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(969), "&omega;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(977), "&thetasym;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(978), "&upsih;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(982), "&piv;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8226), "&bull;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8230), "&hellip;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8242), "&prime;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8243), "&Prime;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8254), "&oline;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8260), "&frasl;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8472), "&weierp;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8465), "&image;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8476), "&real;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8482), "&trade;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8501), "&alefsym;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8592), "&larr;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8593), "&uarr;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8594), "&rarr;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8595), "&darr;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8596), "&harr;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8629), "&crarr;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8656), "&lArr;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8657), "&uArr;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8658), "&rArr;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8659), "&dArr;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8660), "&hArr;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8704), "&forall;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8706), "&part;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8707), "&exist;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8709), "&empty;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8711), "&nabla;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8712), "&isin;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8713), "&notin;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8715), "&ni;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8719), "&prod;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8722), "&sum;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8722), "&minus;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8727), "&lowast;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8730), "&radic;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8733), "&prop;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8734), "&infin;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8736), "&ang;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8869), "&and;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8870), "&or;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8745), "&cap;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8746), "&cup;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8747), "&int;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8756), "&there4;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8764), "&sim;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8773), "&cong;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8773), "&asymp;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8800), "&ne;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8801), "&equiv;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8804), "&le;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8805), "&ge;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8834), "&sub;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8835), "&sup;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8836), "&nsub;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8838), "&sube;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8839), "&supe;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8853), "&oplus;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8855), "&otimes;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8869), "&perp;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8901), "&sdot;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8968), "&lceil;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8969), "&rceil;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8970), "&lfloor;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8971), "&rfloor;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(9001), "&lang;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(9002), "&rang;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(9674), "&loz;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(9824), "&spades;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(9827), "&clubs;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(9829), "&hearts;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(9830), "&diams;"); //$NON-NLS-1$
-
-		_table.put(Integer.valueOf(338), "&OElig;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(339), "&oelig;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(352), "&Scaron;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(353), "&scaron;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(376), "&Yuml;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(710), "&circ;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(732), "&tilde;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8194), "&ensp;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8195), "&emsp;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8201), "&thinsp;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8204), "&zwnj;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8205), "&zwj;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8206), "&lrm;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8207), "&rlm;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8211), "&ndash;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(151), "&mdash;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8216), "&lsquo;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8217), "&rsquo;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8218), "&sbquo;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8220), "&ldquo;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8221), "&rdquo;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8222), "&bdquo;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8224), "&dagger;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8225), "&Dagger;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8240), "&permil;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8249), "&lsaquo;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8250), "&rsaquo;"); //$NON-NLS-1$
-		_table.put(Integer.valueOf(8364), "&euro;"); //$NON-NLS-1$
-
-		_reverse = new Hashtable(256);
-		for (Enumeration e = _table.keys(); e.hasMoreElements();) {
-			Object key = e.nextElement();
-			String value = (String) _table.get(key);
-			_reverse.put(value, key);
-			// also support without the training ';'
-			_reverse.put(value.substring(0, value.length() - 1), key);
-		}
-	}
-
-	/**
-	 * @param ch 
-	 * @return if not in the special list
-	 */
-	public static String getSpecial(int ch) {
-		return (String) _table.get(Integer.valueOf(ch));
-	}
-
-	/**
-	 * @param str
-	 * @return the code value corresponding to the string or null
-	 * if string is unknown
-	 */
-	public static int getSpecial(String str) {
-		Integer result = (Integer) _reverse.get(str);
-		if (result == null) {
-			return -1;
-		}
-        return result.intValue();
-	}
-
-	/**
-	 * @param str
-	 * @param start
-	 * @param end
-	 * @param writer
-	 * @throws IOException
-	 */
-	public static void encode(String str, int start, int end, Writer writer)
-			throws IOException {
-		for (int i = start; i < end; i++) {
-			char ch = str.charAt(i);
-			String special = getSpecial(ch);
-			if (special != null) {
-				writer.write(special);
-			} else {
-				if ((ch & 0xff) != 0) {
-					writer.write("&#"); //$NON-NLS-1$
-					writer.write(Integer.toString(ch));
-					writer.write(";"); //$NON-NLS-1$
-				} else {
-					writer.write(ch);
-				}
-			}
-		}
-	}
-
-	/**
-	 * @param str
-	 * @param result
-	 * @return the encoded string buffer
-	 */
-	public static StringBuffer encode(String str, StringBuffer result) {
-		return encode(str, 0, str.length(), result);
-	}
-
-	/**
-	 * @param str
-	 * @param start
-	 * @param end
-	 * @param result
-	 * @return the encoded string buffer
-	 */
-	public static StringBuffer encode(String str, int start, int end,
-			StringBuffer result) {
-		for (int i = start; i < end; i++) {
-			char ch = str.charAt(i);
-			String special = getSpecial(ch);
-			if (special != null) {
-				result.append(special);
-			} else {
-				if ((ch & 0xff00) != 0) {
-					result.append("&#"); //$NON-NLS-1$
-					result.append(Integer.toString(ch));
-					result.append(";"); //$NON-NLS-1$
-				} else {
-					result.append(ch);
-				}
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @param str
-	 * @param buffer
-	 * @return the decoded string buffer
-	 * @throws RuntimeException
-	 */
-	public static StringBuffer decode(String str, StringBuffer buffer)
-			throws RuntimeException {
-		return decode(str, 0, str.length(), buffer);
-	}
-
-	/**
-	 * @param str
-	 * @param start
-	 * @param end
-	 * @param buffer
-	 * @return the decoded string buffer
-	 * @throws RuntimeException
-	 */
-	public static StringBuffer decode(String str, int start, int end,
-			StringBuffer buffer) throws RuntimeException {
-		int pos = start;
-		do {
-			char ch = str.charAt(pos);
-			if (ch == '&') {
-				int stop = str.indexOf(';', pos + 1);
-				if (stop < 0 || stop >= end) {
-					_log.error("HTMLSpecialCharHelper.3"); //$NON-NLS-1$
-					throw new RuntimeException("HTMLSpecialCharHelper.2"); //$NON-NLS-1$
-				}
-				String sp = str.substring(pos, stop + 1);
-				int special = getSpecial(sp);
-				if (special != -1) {
-					buffer.append((char) special);
-				} else {
-					ch = sp.charAt(1);
-					if (ch != '#')
-						throw new RuntimeException("HTMLSpecialCharHelper.1"); //$NON-NLS-1$
-					try {
-						buffer.append((char) Integer.parseInt(sp.substring(2,
-								sp.length() - 1)));
-					} catch (NumberFormatException ex) {
-						_log.info("HTMLSpecialCharHelper.0", ex); //$NON-NLS-1$
-						throw new RuntimeException("illegal: " + sp); //$NON-NLS-1$
-					}
-				}
-				pos = stop + 1;
-			} else {
-				buffer.append(ch);
-				pos++;
-			}
-		} while (pos < end);
-		return buffer;
-	}
-
-	/**
-	 * @param entityRef
-	 * @return the code for the decoded entity reference
-	 */
-	public static int decodeEntity(String entityRef) {
-		Integer result = (Integer) _reverse.get(entityRef);
-		if (result != null) {
-			return result.intValue();
-		}
-		if (entityRef.length() >= 2 && entityRef.charAt(1) == '#') {
-			String s = entityRef.substring(2);
-			if (s.endsWith(";")) {
-				s = s.substring(0, s.length() - 1);
-			}
-			try {
-				return Integer.parseInt(s);
-			} catch (Exception ex) {
-				// ignore
-			}
-		}
-		return -1;
-	}
-}
-
-// FIXME: will it better to use Character instead of Integer ? (yang)
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/HTMLUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/HTMLUtil.java
deleted file mode 100644
index a4400d2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/HTMLUtil.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.utils;
-
-import java.util.Arrays;
-
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public class HTMLUtil {
-	/**
-	 * check whether a char is a HTML whitespace.
-	 * 
-	 * @param ch
-	 * @return true if ch is considered to be HTML whitespace
-	 * @see <a href="http://www.w3.org/TR/html4/struct/text.html#h-9.1">white
-	 *      space </a>
-	 */
-	public static boolean isHTMLWhitespace(char ch) {
-		return ch == ' ' || ch == 0x09 || ch == 0x0c || ch == 0x0d
-				|| ch == 0x0a || ch == 0x200b;
-	}
-
-	/**
-	 * @param text
-	 * @return true if the entire string is considered to be HTML whitespace
-	 */
-	public static boolean isHTMLWhitespaceString(String text) {
-		for (int i = 0, size = text.length(); i < size; i++) {
-			if (!isHTMLWhitespace(text.charAt(i))) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	/**
-	 * the HTML tags considered to be hidden
-	 */
-	static final String[] HiddenTags = new String[] {
-			IHTMLConstants.TAG_APPLET, IHTMLConstants.TAG_AREA,
-			IHTMLConstants.TAG_BASE, IHTMLConstants.TAG_BASEFONT,
-			IHTMLConstants.TAG_HEAD, IHTMLConstants.TAG_IFRAME,
-			IHTMLConstants.TAG_ISINDEX, IHTMLConstants.TAG_META,
-			IHTMLConstants.TAG_NOEMBED, IHTMLConstants.TAG_NOFRAMES,
-			IHTMLConstants.TAG_NOSCRIPT, IHTMLConstants.TAG_SCRIPT,
-			IHTMLConstants.TAG_STYLE, IHTMLConstants.TAG_TITLE,
-			IHTMLConstants.TAG_PARAM };
-
-	/**
-	 * @param tag
-	 * @return true if the tag name is not in the list of hidden tags
-	 */
-	public static boolean isVisualHtmlElement(String tag) {
-		return !Arrays.asList(HiddenTags).contains(tag.toLowerCase());
-	}
-
-	/**
-	 * Handling white space. Basically, for leading and trailing whitespace,
-	 * will handle according whether the text is just after tag start or before
-	 * tag close.
-	 * <p>
-	 * For consequent whitespace, will compact them.
-	 * @param textNode 
-	 * @param s 
-	 * @return the compacted string
-	 * see http://www.w3.org/TR/html4/struct/text.html#h-9.1
-	 */
-	// XXX: currently, the whitespace handling is in this class, in the future
-	// may consider move it
-	// into lower layer (display/CSS layer)
-	public static String compactWhitespaces(Text textNode, String s) {
-		char[] array = s.toCharArray();
-		StringBuffer buffer = new StringBuffer(array.length);
-		int posi = 0;
-		int len = array.length;
-
-		while (posi < len) {
-			if (HTMLUtil.isHTMLWhitespace(array[posi])) {
-				while (++posi < len && HTMLUtil.isHTMLWhitespace(array[posi]))
-                {
-                    // no body
-                    // loop until we have find non-whitepspace or endof array
-                }
-
-				buffer.append(' ');
-				continue;
-			}
-			buffer.append(array[posi++]);
-			continue;
-		}
-		return buffer.toString();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/ICacheEntryCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/ICacheEntryCreator.java
deleted file mode 100644
index a63faee..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/ICacheEntryCreator.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-/**
- * Identifies a factory/dispose advisor for cache entries
- * @param <KEY> 
- * @param <ENTRY> 
- */
-public interface ICacheEntryCreator<KEY,ENTRY> {
-	/**
-	 * @param key
-	 * @return the created entry
-	 */
-	public ENTRY createEntry(KEY key);
-
-	/**
-	 * @param key
-	 * @param entry
-	 */
-	public void dispose(KEY key, ENTRY entry);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/ImageResolver.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/ImageResolver.java
deleted file mode 100644
index 29305bf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/ImageResolver.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.SWTException;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.sse.core.internal.util.URIResolver;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class ImageResolver {
-	/**
-	 * 
-	 * @param element
-	 * @param attrName
-	 * @return
-	 */
-	static String getResolvedURL(Element element, String attrName) {
-		URIResolver resolver = null;
-		if (element instanceof IDOMNode) {
-			resolver = ((IDOMNode) element).getModel().getResolver();
-		}
-		if (null == resolver) {
-			return null;
-		}
-		String src = DOMUtil.getAttributeIgnoreCase(element, attrName);
-		if (src != null && src.length() > 0) {
-			return resolver.getLocationByURI(src);
-		}
-		return null;
-	}
-
-	/**
-	 * given the element and an attribute name identifying the src of the image,
-	 * create a image.
-	 * 
-	 * @param element
-	 * @param attrName
-	 * @return the new image
-	 */
-	public static Image initializeImage(Element element, String attrName) {
-		String url = getResolvedURL(element, attrName);
-		if (url == null) {
-			return null;
-		}
-		Image img = null;
-		int colonIndex = url.indexOf(":");
-		int slashIndex = url.indexOf("/");
-		if (colonIndex != -1 && (slashIndex != -1 && colonIndex < slashIndex)) {
-			//the url seems to have a protocol, so try to load it as a URL
-			try {
-				URL urlObj = new URL(url);
-				ImageDescriptor imgDesc = ImageDescriptor.createFromURL(urlObj);
-				img = imgDesc.createImage(false);
-			} catch(MalformedURLException mfe) {
-				//attempt to load as a file
-				try {
-					img = new Image(null, url);
-				} catch(SWTException se) {
-					//img remains null on return
-				}
-			} catch(SWTException se) {
-				//img remains null on return
-			}
-		} else {
-			//no protocol, so load it as a file
-			try {
-				img = new Image(null, url);
-			} catch(SWTException se) {
-				//img remains null on return
-			}
-		}
-		return img;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/IntFlexArray.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/IntFlexArray.java
deleted file mode 100644
index 4c50dcf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/IntFlexArray.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-/**
- * Flexible int array. You can set/get of any index value. The array size will
- * be automatically adjusted.
- * 
- * @author mengbo
- */
-public class IntFlexArray {
-	int[] array;
-
-	int size = 0;
-
-	/**
-	 * Create a new flex array with default capacity
-	 */
-	public IntFlexArray() {
-		this(10);
-	}
-
-	/**
-	 * @param initCapacity
-	 */
-	public IntFlexArray(int initCapacity) {
-		if (initCapacity <= 0)
-			initCapacity = 10;
-		array = new int[initCapacity];
-	}
-
-	/**
-	 * @param idx
-	 * @param obj
-	 */
-	public void setAt(int idx, int obj) {
-		ensureCapacity(idx + 1);
-		array[idx] = obj;
-		if (idx + 1 > size)
-			size = idx + 1;
-	}
-
-	/**
-	 * @param idx
-	 * @return the value at idx or 0 if idx is out of bounds
-	 */
-	public int getAt(int idx) {
-		if (idx < array.length)
-			return array[idx];
-        return 0;
-	}
-
-	/**
-	 * @return the current size of the array
-	 */
-	public int getSize() {
-		return size;
-	}
-
-	private void ensureCapacity(int size1) {
-		if (size1 <= array.length)
-			return;
-		int[] temp = array;
-		array = new int[2 * temp.length];
-		System.arraycopy(temp, 0, array, 0, temp.length);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/JSPUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/JSPUtil.java
deleted file mode 100644
index b3b5a37..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/JSPUtil.java
+++ /dev/null
@@ -1,288 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.jsp.core.internal.contentmodel.TaglibController;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.TLDCMDocumentManager;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.TaglibTracker;
-import org.eclipse.jst.jsp.core.internal.contentmodel.tld.provisional.TLDDocument;
-import org.eclipse.jst.jsp.core.taglib.TaglibIndex;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.wst.html.core.internal.format.HTMLFormatProcessorImpl;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMDocument;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-
-/**
- * utility class for JSP related information.
- * 
- * @author mengbo
- */
-public class JSPUtil {
-	/**
-	 * find out whether the specified taglib has been defined in the IDOMModel.
-	 * If found, then return the prefix. If can't find, then will try to add a
-	 * taglib declaration into the model, and try to use the specified default
-	 * prefix
-	 * 
-	 * @param model
-	 * @param uri
-	 * @param defaultPrefix 
-	 * @return prefix
-	 */
-	public static String getOrCreatePrefix(IDOMModel model, String uri,
-			String defaultPrefix) {
-		return getOrCreatePrefix(model, uri, defaultPrefix, null);
-	}
-
-	/**
-	 * 
-	 * @param model
-	 * @param uri
-	 * @param defaultPrefix
-	 * @param nodes
-	 *            if a taglib node is created, then the created tag lib node is
-	 *            returned in this.  In the case of xml format, it is the attribute node on
-	 *            jsp:root
-	 * @return prefix
-	 */
-	public static String getOrCreatePrefix(IDOMModel model, String uri,
-			String defaultPrefix, Node[] nodes) {
-	
-		String prefix = getPrefix(model, uri);
-		if (prefix != null) {
-			return prefix;
-		}
-
-		prefix = findUnusedPrefix(model, defaultPrefix);
-
-		//need proper API to determine xml type... this may need to change in future
-		if (! model.getDocument().isXMLType()){
-			// TODO: should create the taglib inside the IDOMModel
-			Node[] ref = new Node[1];
-			BodyHelper.findHeaderInsertPosition(ITLDConstants.URI_JSP, "taglib",
-					model.getDocument(), ref);
-			
-			Element ele = model.getDocument().createElement("jsp:directive.taglib");
-			((IDOMElement) ele).setJSPTag(true);
-			ele.setAttribute(ICSSPropertyID.ATTR_URI, uri);
-			ele.setAttribute(ICSSPropertyID.ATTR_PREFIX, prefix);
-			if (nodes != null && nodes.length > 0) {
-				nodes[0] = ele;
-			}
-			model.getDocument().insertBefore(ele, ref[0]);
-			new HTMLFormatProcessorImpl().formatNode(ele);
-		}
-		else {//xml format
-			//find root element
-			boolean tldRefExists = false;
-			Element root = getRootElement(model);
-			if (root != null){				
-				NamedNodeMap attrs = root.getAttributes();
-				for (int i=0;i<attrs.getLength();i++){
-					Attr a = (Attr)attrs.item(i);
-					//is the taglib uri already declared?
-					if (a.getValue().equals(uri)){
-						tldRefExists = true;
-						break;
-					}
-				}
-				if (!tldRefExists){
-					//create attribute
-					Attr a = model.getDocument().createAttribute("xmlns:"+prefix);
-					a.setValue(uri);
-					root.setAttributeNode(a);
-					new HTMLFormatProcessorImpl().formatNode(root);
-					
-					//duplicating what non-xml case does... no callerd making use of this currently
-					if (nodes != null && nodes.length > 0) {
-						nodes[0] = a;
-					}
-				}
-			}				
-		}
-		return prefix;
-	}
-
-	private static Element getRootElement(IDOMModel model) {
-		Document docNode = EditModelQuery.getDocumentNode(model.getDocument());
-		return docNode.getDocumentElement();
-	}
-
-	/**
-	 * Return prefix for taglib if declared in jsp file
-	 * @param model
-	 * @param uri
-	 * @return null means this is tld is not declared in the jsp file
-	 */
-	public static String getPrefix(IDOMModel model, String uri) {
-		TLDCMDocumentManager m = TaglibController.getTLDCMDocumentManager(model
-				.getStructuredDocument());
-		if (m == null) {
-		    // if the doc manager has nothing but the type is XML,
-		    // then see if the prefix is encoded as a namespace in
-		    // the doc root
-		    if (model.getDocument().isXMLType())
-		    {
-		        Element root = getRootElement(model);
-	            if (root != null){              
-	                NamedNodeMap attrs = root.getAttributes();
-	                for (int i=0;i<attrs.getLength();i++){
-	                    Attr a = (Attr)attrs.item(i);
-	                    //is the taglib uri already declared?
-	                    if (a.getValue().equals(uri)
-	                            && a.getName().startsWith("xmlns:"))
-	                    {
-	                        String prefix =  a.getNodeName().substring("xmlns:".length());
-	                        
-	                        if ("".equals(prefix))
-	                        {
-	                            prefix = null;
-	                        }
-	                        return prefix;
-	                    }
-	                }
-	            }
-		    }
-			return null;
-		}
-		List trackers = m.getTaglibTrackers();
-		for (Iterator iter = trackers.iterator(); iter.hasNext();) {
-			TaglibTracker tracker = (TaglibTracker) iter.next();
-			if (uri.equals(tracker.getURI())) {
-				return tracker.getPrefix();
-			}
-            CMDocument cmdoc = tracker.getDocument();
-            if (cmdoc instanceof TLDDocument
-            		&& uri.equals(((TLDDocument) cmdoc).getUri())) {
-            	return tracker.getPrefix();
-            }
-		}
-		return null;
-	}
-
-	/**
-	 * create specified taglib declaration as jsp directive element
-	 * 
-	 * @param model
-	 * @param uri
-	 * @param prefix
-	 * @return Element
-	 */
-	public static Element createTaglibDeclaration(IDOMModel model, String uri,
-			String prefix) {
-		Node[] ref = new Node[1];
-		BodyHelper.findHeaderInsertPosition(ITLDConstants.URI_JSP, "taglib",
-				model.getDocument(), ref);
-		Element ele = model.getDocument().createElement("jsp:directive.taglib");
-		((IDOMElement) ele).setJSPTag(true);
-		ele.setAttribute("uri", uri);
-		ele.setAttribute("prefix", prefix);
-		model.getDocument().insertBefore(ele, ref[0]);
-		return ele;
-	}
-
-	/**
-	 * Return prefix to use based upon the suggestion.   
-	 * Appends an integer until unique, if suggestion was used.
-	 * @param model
-	 * @param suggestion
-	 * @return prefix
-	 */
-	public static String findUnusedPrefix(IDOMModel model, String suggestion) {
-		if (suggestion == null) {
-			suggestion = "p";
-		}
-		TLDCMDocumentManager m = TaglibController.getTLDCMDocumentManager(model
-				.getStructuredDocument());
-		if (m == null) {
-			return suggestion;
-		}
-		List trackers = m.getTaglibTrackers();
-		Set map = new HashSet();
-		for (Iterator iter = trackers.iterator(); iter.hasNext();) {
-			TaglibTracker tracker = (TaglibTracker) iter.next();
-			map.add(tracker.getPrefix());
-		}
-		if (!map.contains(suggestion)) {
-			return suggestion;
-		}
-		for (int i = 1;; i++) {
-			if (!map.contains(suggestion + i)) {
-				return suggestion + i;
-			}
-		}
-	}
-
-	/**
-	 * given the prefix, find the corresponding jsp tld URI.
-	 * 
-	 * @param model
-	 * @param prefix
-	 * @return prefix
-	 */
-	public static String findURIForPrefix(IDOMModel model, String prefix) {
-		if (prefix == null || model == null) {
-			return null;
-		}
-		TLDCMDocumentManager m = TaglibController.getTLDCMDocumentManager(model
-				.getStructuredDocument());
-		if (m == null) {
-			return null;
-		}
-		List trackers = m.getTaglibTrackers();
-		for (Iterator iter = trackers.iterator(); iter.hasNext();) {
-			TaglibTracker tracker = (TaglibTracker) iter.next();
-			if (prefix.equals(tracker.getPrefix())) {
-				CMDocument cmdoc = tracker.getDocument();
-				if (cmdoc instanceof TLDDocument) {
-					return ((TLDDocument) cmdoc).getUri();
-				}
-                break; // fall out and return null
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * judge whether the the baseFile belonged project can support uri specified
-	 * tag lib
-	 * 
-	 * @param uri
-	 *            tag lib uri
-	 * @param baseFile
-	 * @return boolean
-	 */
-	public static boolean supportTaglib(String uri, IFile baseFile) {
-		 //IPath location = baseFile.getLocation();
-		//Bug  https://bugs.eclipse.org/bugs/show_bug.cgi?id=221197 
-		 IPath location = baseFile.getFullPath();
-		if (location != null) {
-			return TaglibIndex.resolve(location.toString(), uri, false) != null;
-		}
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/JavaUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/JavaUtil.java
deleted file mode 100644
index 7d554c6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/JavaUtil.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJarEntryResource;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-
-/**
- * @author mengbo
- */
-public class JavaUtil {
-	/**
-	 * 
-	 * @param javaProject
-	 * @param parent
-	 * @return the path in javaProject or new Path("") if not found on a class path
-	 * @author mengbo
-	 */
-	public static IPath getPathOnClasspath(IJavaProject javaProject,
-			Object parent) {
-		IPath result = null;
-		if (javaProject == null || parent == null) {
-			return new Path("");
-		}
-		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
-							machings = entries[i].getPath()
-									.matchingFirstSegments(elementPath);
-							if (machings > 0) {
-								// Get package name
-								classPath = elementPath.removeFirstSegments(
-										machings).removeLastSegments(1);
-								break;
-							}
-						}
-						// Not on the classpath?
-						if (classPath == null) {
-							return null;
-						} else if (classPath.segmentCount() > 0)
-							result = javaProject.findElement(classPath)
-									.getPath().removeFirstSegments(machings)
-									.append(((IFile) parent).getName());
-						else
-							result = ((IFile) parent).getFullPath()
-									.removeFirstSegments(machings);
-					} catch (Exception e) {
-						// Error.DesignerPropertyTool.NatureQuerying = Error in
-						// project java nature querying
-						PDPlugin.getLogger(JavaUtil.class).error(
-								"Error.DesignerPropertyTool.NatureQuerying", e);
-						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("");
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/NodeLocationComparator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/NodeLocationComparator.java
deleted file mode 100644
index 571819a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/NodeLocationComparator.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.runtime.Assert;
-import org.w3c.dom.Node;
-
-/**
- * To sort the location of tags, this comparator is used to compare tags' order.
- * 
- * @author mengbo
- */
-public class NodeLocationComparator implements Comparator {
-	private final static Map orders = new HashMap();
-
-	private final static Integer DEFAULT_ORDER = Integer.valueOf(Integer.MAX_VALUE);
-
-	private static NodeLocationComparator _instance = new NodeLocationComparator();
-	static {
-		orders.put("taglib", Integer.valueOf(0));
-		orders.put("directive.taglib", Integer.valueOf(0));
-		orders.put("head", Integer.valueOf(1));
-	}
-
-	private NodeLocationComparator() {
-        // no external instantiation
-	}
-
-	/**
-	 * @return the singleton
-	 */
-	public static NodeLocationComparator getInstance() {
-		return _instance;
-	}
-
-	/**
-	 * The object to be compared could be Node or tag name.
-	 * 
-	 * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
-	 */
-	public int compare(Object o1, Object o2) {
-		Assert.isTrue((o1 instanceof Node || o1 instanceof String)
-				&& (o2 instanceof Node || o2 instanceof String));
-		Integer i1 = getOrder(o1);
-		Integer i2 = getOrder(o2);
-		return i1.compareTo(i2);
-	}
-
-	private Integer getOrder(Object n) {
-		String name = null;
-		if (n instanceof Node) {
-			name = ((Node) n).getLocalName();
-		} else {
-			name = (String) n;
-		}
-		if (name != null) {
-			Object order = orders.get(name);
-			if (order != null) {
-				return (Integer) order;
-			}
-		}
-		return DEFAULT_ORDER;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/PreviewUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/PreviewUtil.java
deleted file mode 100644
index ef48056..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/PreviewUtil.java
+++ /dev/null
@@ -1,412 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.PrintStream;
-import java.io.StringReader;
-import java.nio.charset.Charset;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.MissingResourceException;
-import java.util.PropertyResourceBundle;
-import java.util.Map.Entry;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.content.IContentDescription;
-import org.eclipse.core.runtime.content.IContentType;
-import org.eclipse.core.runtime.content.IContentTypeManager;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.PathUtil;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.ui.IEditorInput;
-import org.w3c.dom.Attr;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- */
-public class PreviewUtil {
-	/** Create the logger for this class */
-	private static Logger _log = PDPlugin.getLogger(PreviewUtil.class);
-
-	/** line separator */
-	public static final String LINE_SEPARATOR = System
-			.getProperty("line.separator"); //$NON-NLS-1$
-
-	/** web root path */
-	private final static String WEBROOT_PATH = null;
-
-	/** the file being previewed */
-	private static IFile CURRENT_FILE = null;
-
-	/** the property bundel */
-	private static PropertyResourceBundle BUNDLE = null;
-
-	/** the property bundel map used for loadbundle preview action */
-	private static Map BUNDLE_MAP = null;
-
-	/** the variable name used for loadbundel preview action */
-	private static String VAR = null;
-
-	/** key is prefix value is uri */
-	private static Map _taglibMap = new HashMap();
-
-
-	/**
-	 * @return the current bundle
-	 */
-	public static final PropertyResourceBundle getBUNDLE() {
-        return BUNDLE;
-    }
-
-    /**
-     * @param bundle
-     */
-    public static final void setBUNDLE(PropertyResourceBundle bundle) {
-        BUNDLE = bundle;
-    }
-
-    /**
-     * @return the current bundle map
-     */
-    public static final Map getBUNDLE_MAP() {
-        return BUNDLE_MAP;
-    }
-
-    /**
-     * @param bundle_map
-     */
-    public static final void setBUNDLE_MAP(Map bundle_map) {
-        BUNDLE_MAP = bundle_map;
-    }
-
-    /**
-     * @return the current variable
-     */
-    public static final String getVAR() {
-        return VAR;
-    }
-
-    /**
-     * @param var
-     */
-    public static final void setVAR(String var) {
-        VAR = var;
-    }
-
-    /**
-	 * @return Returns the _taglibMap.
-	 */
-	public static Map getTaglibMap() {
-		return _taglibMap;
-	}
-
-	/**
-	 * @param map
-	 *            The _taglibMap to set.
-	 */
-	public static void setTaglibMap(Map map) {
-		_taglibMap = map;
-	}
-
-	/**
-	 * Get tag attribute string from attribute map
-	 * 
-	 * @param map
-	 *            tag attribute map
-	 * @return the attribute string
-	 */
-	public static String getAttributesAsString(Map map) {
-		return getAttributesAsString(map, true);
-	}
-
-	/**
-	 * Get file path from uri
-	 * 
-	 * @param uri
-	 *            taglib uri
-	 * @return the path as a string
-	 */
-	public static String getPathFromURI(String uri) {
-		if (uri == null) {
-			return uri;
-		}
-
-		if (uri.startsWith(IFileFolderConstants.PATH_SEPARATOR)) {
-			return PreviewUtil.WEBROOT_PATH + uri;
-		}
-		IFile curFile = PreviewUtil.CURRENT_FILE;
-		if (curFile != null) {
-			IContainer con = curFile.getParent();
-			if (con != null) {
-				IPath path = con.getLocation();
-				if (path != null) {
-					String aPath = path.toString() + File.separator + uri;
-
-					aPath = aPath.replace('/', File.separatorChar);
-					aPath = aPath.replace('\\', File.separatorChar);
-					if (aPath.endsWith(File.separator)) {
-						aPath += File.separator;
-					}
-					File file = new File(aPath);
-					if (file.exists()) {
-						return aPath;
-					}
-                    return uri;
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Get bundle value for expression
-	 * 
-	 * @param attrValue
-	 *            expression
-	 * @return the value
-	 */
-	public static String getValueOFEP(String attrValue) {
-		if (attrValue != null) {
-			if (attrValue.startsWith("#{")) //$NON-NLS-1$
-			{
-				String key, value = null;
-				int i = attrValue.lastIndexOf("."); //$NON-NLS-1$
-				if (i > 0) {
-					key = attrValue.substring(i + 1, attrValue.length() - 1)
-							.trim();
-					String bundleVariable = attrValue.substring(2, i).trim();
-					if (BUNDLE_MAP == null) {
-						return attrValue; //$NON-NLS-1$
-					}
-					PropertyResourceBundle bundle = (PropertyResourceBundle) BUNDLE_MAP
-							.get(bundleVariable);
-
-					if (bundle != null) {
-						try {
-							value = bundle.getString(key);
-							if (value != null) {
-								return value;
-							}
-                            return attrValue; //$NON-NLS-1$
-						} catch (MissingResourceException e1) {
-							// "Error in resource bundle processing:"
-							_log.info("PreviewUtil.Error.0", e1); //$NON-NLS-1$
-						}
-					}
-				}
-			}
-		}
-		return attrValue;
-	}
-
-	/**
-	 * Get tag attribute string from attribute map
-	 * 
-	 * @param map
-	 *            tag attribute map
-	 * @param flag
-	 *            state
-	 * @return the attributes as a single string
-	 */
-	private static String getAttributesAsString(Map<String, String> map, boolean flag) {
-		if (map == null) {
-			return null;
-		}
-
-		StringBuffer stringbuffer = new StringBuffer();
-		for (Iterator<Entry<String, String>> e = map.entrySet().iterator(); e.hasNext();) {
-		    Map.Entry<String,String> entry = e.next();
-			String attrName = entry.getKey();
-			String attrValue = entry.getValue();
-			attrValue = getValueOFEP(attrValue);
-			if (ICSSPropertyID.ATTR_SRC.equalsIgnoreCase(attrName)
-					|| ICSSPropertyID.ATTR_HREF.equalsIgnoreCase(attrName)
-					|| ICSSPropertyID.ATTR_URI.equalsIgnoreCase(attrName)
-					|| ICSSPropertyID.ATTR_BINDING.equalsIgnoreCase(attrName)
-					|| ICSSPropertyID.ATTR_PAGE.equalsIgnoreCase(attrName)) {
-				if (PreviewUtil.WEBROOT_PATH != null && attrValue != null
-						&& !attrValue.startsWith("http") //$NON-NLS-1$
-						&& !attrValue.startsWith("file")) //$NON-NLS-1$
-				{
-					attrValue = getPathFromURI(attrValue);
-				}
-			}
-			if (attrValue != null) {
-				stringbuffer.append(" ").append(attrName); //$NON-NLS-1$
-				if (attrValue.indexOf(34) != -1) {
-					StringBuffer stringbuffer1 = new StringBuffer();
-					for (int j = 0; j < attrValue.length(); j++) {
-						char c = attrValue.charAt(j);
-						if (c != '"') {
-							stringbuffer1.append(c);
-						}
-					}
-
-					attrValue = stringbuffer1.toString();
-				}
-				if (attrValue != null && attrValue.startsWith("#{")) //$NON-NLS-1$
-				{
-					attrValue = ""; //$NON-NLS-1$
-				}
-				stringbuffer.append("=\"").append(attrValue).append('"'); //$NON-NLS-1$
-			}
-		}
-		// System.out.println("BBBB:" +stringbuffer.toString());
-
-		return stringbuffer.toString();
-	}
-
-	/**
-	 * Change NamedNodeMap type to Map type
-	 * 
-	 * @param nodeMap
-	 *            NamedNodeMap type
-	 * @return the map
-	 */
-	public static Map getAttributeMap(NamedNodeMap nodeMap) {
-		if (nodeMap != null) {
-			int len = nodeMap.getLength();
-			HashMap map = new HashMap();
-			for (int i = 0; i < len; i++) {
-				Node node = nodeMap.item(i);
-				String name = node.getNodeName();
-				String value = node.getNodeValue();
-				if (name != null
-						&& !name.trim().equalsIgnoreCase("") && value != null) //$NON-NLS-1$
-				{
-					map.put(name, value);
-				}
-			}
-			return map;
-		}
-		return null;
-	}
-
-	/**
-	 * @param result
-	 * @param editorInput
-	 * @return the file
-	 */
-	public static File toFile(StringBuffer result, IEditorInput editorInput) {
-		try {
-			File file = File.createTempFile("previewtmp", ".html"); //$NON-NLS-1$ //$NON-NLS-2$
-			if (!file.exists()) {
-				file.createNewFile();
-			}
-			
-			//fix for https://bugs.eclipse.org/bugs/show_bug.cgi?id=202613 kindly contributed by Eiji Morito. 
-			IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
-			IContentType contentType = contentTypeManager.getContentType("org.eclipse.wst.html.core.htmlsource"); //$NON-NLS-1$
-			IContentDescription contentDescription = contentType.getDescriptionFor(new StringReader(result.toString()), null);
-			String charset = contentDescription.getCharset();
-			
-			if (charset == null || !Charset.isSupported(charset)) {
-				charset = ResourcesPlugin.getEncoding();
-				if (charset == null)
-					charset = "UTF-8"; //$NON-NLS-1$
-			}
-
-			FileOutputStream fos = new FileOutputStream(file);
-			PrintStream ps = new PrintStream(fos, true, charset);
-			ps.print(result.toString());
-			ps.close();
-			fos.close();
-			return file;
-		} catch (IOException e) {
-			// "Error in file open:"
-			_log.info("PreviewUtil.Error.3", e); //$NON-NLS-1$
-			return null;
-		}
-	}
-
-
-	/**
-	 * do preivew on Node recursively translate escape char for Node and Node's
-	 * child translate relative path for Node and Node's child
-	 * 
-	 * @param node
-	 *            root node that will be previewed
-	 */
-	public static void previewNode(Node node) {
-		if (node == null) {
-			return;
-		}
-		NodeList nodeList = node.getChildNodes();
-		if (nodeList == null) {
-			return;
-		}
-		NamedNodeMap attrMap = node.getAttributes();
-
-		if (attrMap != null) {
-			for (int i = 0, n = attrMap.getLength(); i < n; i++) {
-				Node attrNode = attrMap.item(i);
-				if (attrNode instanceof Attr) {
-					Attr attr = (Attr) attrNode;
-					attr.setNodeValue(getValueOFEP(attr.getNodeValue()));
-					attr.setNodeValue(PathUtil.convertToAbsolutePath(attr
-							.getNodeValue(), null));
-                    //TODO: dead?
-//					StringBuffer buf = new StringBuffer();
-//					String attrValue = attr.getNodeValue();
-				}
-			}
-		}
-		for (int i = 0, n = nodeList.getLength(); i < n; i++) {
-			previewNode(nodeList.item(i));
-		}
-	}
-
-	// /**
-	// * handle escape attebute of tag
-	// *
-	// * @param node
-	// * @return
-	// */
-	// public static boolean escapeFoeNode(Node node)
-	// {
-	// if (node == null)
-	// {
-	// return false;
-	// }
-	// NamedNodeMap attrMap = node.getAttributes();
-	// if (attrMap != null)
-	// {
-	// for (int i = 0, n = attrMap.getLength(); i < n; i++)
-	// {
-	// Node attrNode = attrMap.item(i);
-	// if (attrNode != null && attrNode instanceof Attr)
-	// {
-	// if ("escape".equalsIgnoreCase(attrNode.getNodeName())
-	// && "true".equalsIgnoreCase(attrNode.getNodeValue()))
-	// {
-	// return true;
-	// }
-	// }
-	// }
-	// }
-	// return false;
-	// }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/ProjectResolver.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/ProjectResolver.java
deleted file mode 100644
index e18044d..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/ProjectResolver.java
+++ /dev/null
@@ -1,521 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.StringTokenizer;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.jsf.common.ui.internal.utils.ResourceUtils;
-import org.eclipse.jst.jsf.common.ui.internal.utils.WebrootUtil;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.wst.common.uriresolver.internal.util.URIHelper;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
-import org.eclipse.wst.sse.core.internal.util.URIResolver;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.w3c.dom.DOMException;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * A URIResolver implementation
- *
- */
-public class ProjectResolver implements URIResolver {
-	private static final String TLD_TAG_URI = "uri";
-
-	private static final String URI_PREFIX_HTTP = "http";
-
-	private static final String FILE_PROTOCOL = "file";
-
-	/** Create the logger for this class */
-	private static Logger _log = PDPlugin.getLogger(ProjectResolver.class);
-
-	private IProject _project = null;
-
-	private String _fileBaseLocation = null;
-
-	private static Map _uriMap = null;
-
-	/**
-	 * It is strongly recommended that clients use
-	 * project.getAdapter(URIResolver.class) to obtain a URIResolver aware of
-	 * the Project's special requirements. Note that a URIResolver may not be
-	 * returned at all so manually creating this object may still be required.
-	 * @param project
-	 */
-	public ProjectResolver(IProject project) {
-		super();
-		_project = project;
-	}
-
-	/**
-	 * @param path
-	 */
-	public void seekTld(IFolder path) {
-		if (path == null) {
-			return;
-		}
-		if (_uriMap == null) {
-			_uriMap = new HashMap();
-		}
-
-		try {
-			IResource[] res = path.members();
-			if (null == res) {
-				return;
-			}
-			for (int i = 0; i < res.length; i++) {
-				if (res[i] instanceof IFolder) {
-					seekTld((IFolder) res[i]);
-				}
-				String ext = res[i].getFileExtension();
-				if (IFileFolderConstants.EXT_TAGLIB.equalsIgnoreCase(ext)) {
-					IFile tldFile = (IFile) res[i];
-					String uri = getURIfromTLD(tldFile);
-					String locate = tldFile.getLocation().toOSString();
-					if (uri != null && _uriMap.get(uri) == null) {
-						_uriMap.put(uri, locate);
-					}
-				}
-			}
-		} catch (CoreException e) {
-			_log.error("Error.ProjectResolver.GetlocationByURI.0", e);
-		}
-	}
-
-	/**
-	 * @param path
-	 */
-	public void seekTld(File path) {
-		if (path == null || !path.isDirectory()) {
-			return;
-		}
-		if (_uriMap == null) {
-			_uriMap = new HashMap();
-		}
-
-		try {
-			File[] res = path.listFiles();
-			if (null == res) {
-				return;
-			}
-			for (int i = 0; i < res.length; i++) {
-				if (res[i] instanceof IFolder) {
-					seekTld(res[i]);
-				}
-
-				if (res[i].getName().endsWith(
-						IFileFolderConstants.DOT
-								+ IFileFolderConstants.EXT_TAGLIB)) {
-					String uri = getURIfromTLD(res[i]);
-					String locate;
-
-					locate = res[i].getCanonicalPath();
-
-					if (uri != null && _uriMap.get(uri) == null) {
-						_uriMap.put(uri, locate);
-					}
-				}
-			}
-		} catch (IOException e1) {
-			_log.error("Error.ProjectResolver.GetlocationByURI.0", e1);
-		}
-	}
-
-	/**
-	 * @param tldFile
-	 * @return the uri for the tld in tldFile or null
-	 */
-	public String getURIfromTLD(File tldFile) {
-
-		if (tldFile == null) {
-			return null;
-		}
-		IDOMModel tldModel = null;
-
-		InputStream in = null;
-		try {
-			in = new FileInputStream(tldFile);
-		} catch (FileNotFoundException e) {
-			_log.error("RenderingTraverser.Error.FileNotFound", e);
-			return null;
-		}
-//		IDOMModel xmlModel = null;
-
-		try {
-			tldModel = (IDOMModel) StructuredModelManager.getModelManager().getModelForRead(
-					tldFile.getAbsolutePath(), in, null);
-			NodeList uriList = tldModel.getDocument().getElementsByTagName(
-					TLD_TAG_URI);
-			for (int i = 0, n = uriList.getLength(); i < n; i++) {
-				Node uri = uriList.item(i);
-				return uri.getChildNodes().item(0).getNodeValue();
-			}
-		} catch (UnsupportedEncodingException e1) {
-			_log.error("RenderingTraverser.Error.UnsupportedEncoding", e1);
-		} catch (IOException e1) {
-			_log.error("RenderingTraverser.Error.IO", e1);
-		} finally {
-			ResourceUtils.ensureClosed(in);
-			
-			if (tldModel != null)
-			{
-			    tldModel.releaseFromRead();
-			}
-		}
-
-		return null;
-	}
-
-	/**
-	 * @param tldFile
-	 * @return the URI for the TLD in tldFile or null
-	 */
-	public String getURIfromTLD(IFile tldFile) {
-		if (tldFile == null) {
-			return null;
-		}
-		IDOMModel tldModel;
-
-		try {
-			tldModel = (IDOMModel) getModelManager().getModelForRead(tldFile);
-			NodeList uriList = tldModel.getDocument().getElementsByTagName(
-					TLD_TAG_URI);
-			for (int i = 0, n = uriList.getLength(); i < n; i++) {
-				Node uri = uriList.item(i);
-				return uri.getChildNodes().item(0).getNodeValue();
-			}
-		} catch (IOException e) {
-			// Error in taglib locating.
-			_log.error("Error.ProjectResolver.GetlocationByURI.0", e); //$NON-NLS-1$
-		} catch (CoreException e1) {
-			_log.error("Error.ProjectResolver.GetlocationByURI.0", e1);
-		}
-		return null;
-	}
-
-	/**
-	 * initialize the map of tlds
-	 */
-	public void initTldMap() {
-		if (_uriMap == null) {
-			_uriMap = new HashMap();
-		}
-		if (_project == null) {
-			return;
-		}
-		if (WebrootUtil.getWebContentFolder(_project) == null) {
-			return;
-		}
-		IFolder webinf = WebrootUtil.getWebContentFolder(_project).getFolder(
-				IFileFolderConstants.FOLDER_WEBINF);
-		if (webinf != null && webinf.exists()) {
-			seekTld(webinf);
-		}
-
-		String locate = PDPlugin.getInstallLocation().append("/jsf-tld")
-				.toString();
-		File jsfDir = new File(locate);
-		seekTld(jsfDir);
-
-	}
-
-	public java.lang.String getFileBaseLocation() {
-		return _fileBaseLocation;
-	}
-
-	public java.lang.String getLocationByURI(String uri) {
-		// System.out.println(getLocationByURI(uri, getFileBaseLocation()));
-		return getLocationByURI(uri, getFileBaseLocation());
-	}
-
-	private IModelManager getModelManager() {
-		return StructuredModelManager.getModelManager();
-	}
-
-	private String getLocationFromWEBXML(String uri, String baseReference) {
-		if (uri == null) {
-			return null;
-		}
-		try {
-			// if (_project.hasNature(ICommonConstants.NATURE_WEBAPP))
-			// {
-			if (uri.startsWith(IFileFolderConstants.PATH_SEPARATOR)) {
-				uri = _project.getProject().getLocation().toString()
-						+ IFileFolderConstants.PATH_SEPARATOR
-						+ WebrootUtil.getWebContentFolderName(_project) + uri;
-			}
-			if (uri.startsWith(URI_PREFIX_HTTP)) {
-				IFile webxml = WebrootUtil.getWebContentFolder(_project)
-						.getFolder(IFileFolderConstants.FOLDER_WEBINF).getFile(
-								IFileFolderConstants.FILE_WEB_XML);
-				IDOMModel xmlModel;
-
-				if (webxml.exists()) {
-					try {
-						xmlModel = (IDOMModel) getModelManager()
-								.getModelForRead(webxml);
-
-						NodeList taglibNodeList = xmlModel
-								.getDocument()
-								.getElementsByTagName(ICSSPropertyID.TAG_TAGLIB);
-
-						for (int i = 0, size = taglibNodeList.getLength(); i < size; i++) {
-							Node taglibNode = taglibNodeList.item(i);
-
-							NodeList childList = taglibNode.getChildNodes();
-							String taguri = "";
-							String taglocation = "";
-							for (int j = 0, childSize = childList.getLength(); j < childSize; j++) {
-								Node childTaglibNode = childList.item(j);
-								if (ICSSPropertyID.ATTR_TAGLIB_URI
-										.equalsIgnoreCase(childTaglibNode
-												.getNodeName())) {
-									taguri = childTaglibNode.getChildNodes()
-											.item(0).getNodeValue();
-								}
-								if (ICSSPropertyID.ATTR_TAGLIB_LOCATION
-										.equalsIgnoreCase(childTaglibNode
-												.getNodeName())) {
-									taglocation = childTaglibNode
-											.getChildNodes().item(0)
-											.getNodeValue();
-								}
-
-							}
-							if (uri.equalsIgnoreCase(taguri))
-								uri = _project.getProject().getLocation()
-										.toString()
-										+ IFileFolderConstants.PATH_SEPARATOR
-										+ WebrootUtil
-												.getWebContentFolderName(_project)
-										+ taglocation;
-						}
-						xmlModel.releaseFromRead();
-					} catch (IOException e) {
-
-						// Error in taglib locating.
-						_log.error(
-								"Error.ProjectResolver.GetlocationByURI.0", e); //$NON-NLS-1$
-					} catch (CoreException e1) {
-						e1.printStackTrace();
-						_log.error("Error.ProjectResolver.GetlocationByURI.0",
-								e1);
-					}
-
-				}
-			}
-			// }
-		} catch (DOMException e1) {
-			// Error in taglib locating.
-			_log.error("Error.ProjectResolver.GetlocationByURI.0", e1); //$NON-NLS-1$
-		}
-		// catch (CoreException e1)
-		// {
-		//
-		// _log.error("Error.ProjectResolver.GetlocationByURI.0", e1);
-		// }
-
-		if (isFileURL(uri)) {
-			try {
-				URL url = new URL(uri);
-				return getPath(url);
-			} catch (MalformedURLException e) {
-				_log.error("Error.ProjectResolver.GetlocationByURI.0", e);
-			}
-		}
-		// defect 244817 end
-		return URIHelper.normalize(uri, baseReference, getRootLocationString());
-
-	}
-
-	public String getLocationByURI(String uri, String baseReference) {
-		// DataWindow may generate URL like "d:\somefile" (dos path). We may
-		// need some
-		// special support. (lium)
-		int columnIndex = uri.indexOf(":");
-		int slashIndex = uri.indexOf("/");
-		if (columnIndex != -1 && (slashIndex == -1 || columnIndex < slashIndex)) {
-			return uri;
-		}
-
-		String result = getLocationFromWEBXML(uri, baseReference);
-		if (result != null && !result.equals(uri)) {
-			return result;
-		}
-		if (_uriMap == null) {
-			initTldMap();
-		}
-		if (_uriMap != null) {
-			return (String) _uriMap.get(uri);
-		}
-		return null;
-	}
-
-	// defect 244817 start
-	/**
-	 * @param passedSpec
-	 * @return boolean
-	 */
-	private boolean isFileURL(String passedSpec) {
-		if (passedSpec == null) {
-			return false;
-		}
-		final String spec = passedSpec.trim();
-		if (spec.length() == 0) {
-			return false;
-		}
-		String newProtocol = null;
-		for (int index = 0, limit = spec.length(); index < limit; index++) {
-			final char p = spec.charAt(index);
-			if (p == '/') {
-				//$NON-NLS-1$
-				break;
-			}
-			if (p == ':') {
-				//$NON-NLS-1$
-				newProtocol = spec.substring(0, index);
-				break;
-			}
-		}
-		return (newProtocol != null && newProtocol
-				.compareToIgnoreCase(FILE_PROTOCOL) == 0); //$NON-NLS-1$
-	}
-
-	/**
-	 * @param url
-	 * @return String
-	 */
-	private String getPath(URL url) {
-		String ref = url.getRef() == null ? "" : "#" + url.getRef(); //$NON-NLS-1$ //$NON-NLS-2$
-		String strPath = url.getFile() + ref;
-		IPath path;
-		if (strPath.length() == 0) {
-			path = Path.ROOT;
-		} else {
-			path = new Path(strPath);
-			String query = null;
-			StringTokenizer parser = new StringTokenizer(strPath, "?"); //$NON-NLS-1$
-			int tokenCount = parser.countTokens();
-			if (tokenCount == 2) {
-				path = new Path((String) parser.nextElement());
-				query = (String) parser.nextElement();
-			}
-			if (query == null) {
-				parser = new StringTokenizer(path.toString(), "#"); //$NON-NLS-1$
-				tokenCount = parser.countTokens();
-				if (tokenCount == 2) {
-					path = new Path((String) parser.nextElement());
-				}
-			}
-		}
-		return getPath(path, url.getHost());
-	}
-
-	/**
-	 * @param path
-	 * @param host
-	 * @return String
-	 */
-	private String getPath(IPath path, String host) {
-		IPath newPath = path;
-		// They are potentially for only Windows operating system.
-		// a.) if path has a device, and if it begins with IPath.SEPARATOR,
-		// remove it
-		final String device = path.getDevice();
-		if (device != null && device.length() > 0) {
-			if (device.charAt(0) == IPath.SEPARATOR) {
-				final String newDevice = device.substring(1);
-				newPath = path.setDevice(newDevice);
-			}
-		}
-		// b.) if it has a hostname, it is UNC name... Any java or eclipse api
-		// helps it ??
-		if (newPath != null && host != null && host.length() != 0) {
-			IPath uncPath = new Path(host);
-			uncPath = uncPath.append(path);
-			newPath = uncPath.makeUNC(true);
-		}
-		
-		if (newPath != null)
-		{
-		    return newPath.toString();
-		}
-		return path.toString();
-	}
-
-	/**
-	 * Resolve the (possibly relative) URI acording to RFC1808 using the default
-	 * file base location. Resolves resource references into absolute resource
-	 * locations without ensuring that the resource actually exists. Note:
-	 * currently resolveCrossProjectLinks is ignored in this implementation.
-	 */
-	public java.lang.String getLocationByURI(String uri,
-			boolean resolveCrossProjectLinks) {
-		return getLocationByURI(uri, getFileBaseLocation(),
-				resolveCrossProjectLinks);
-	}
-
-	/**
-	 * Perform the getLocationByURI action using the baseReference as the point
-	 * of reference instead of the default for this resolver Note: currently
-	 * resolveCrossProjectLinks is ignored in this implementation.
-	 */
-	public java.lang.String getLocationByURI(String uri, String baseReference,
-			boolean resolveCrossProjectLinks) {
-		return getLocationByURI(uri, baseReference);
-	}
-
-	public org.eclipse.core.resources.IProject getProject() {
-		return _project;
-	}
-
-	public org.eclipse.core.resources.IContainer getRootLocation() {
-		return _project;
-	}
-
-	private String getRootLocationString() {
-		return null;
-	}
-
-	public void setFileBaseLocation(java.lang.String newFileBaseLocation) {
-		_fileBaseLocation = newFileBaseLocation;
-	}
-
-	public void setProject(org.eclipse.core.resources.IProject newProject) {
-		_project = newProject;
-	}
-
-	public InputStream getURIStream(String uri) {
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/SelectManyHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/SelectManyHelper.java
deleted file mode 100644
index a7f3ff6..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/SelectManyHelper.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * @author mengbo
- */
-public class SelectManyHelper {
-
-	private final static Set<String> JSF_SELECT_TAGS, HTML_SELECT_TAGS;
-
-
-	static {
-		Set<String> tempSet = new HashSet<String>(4);
-		tempSet.add(IHTMLConstants.TAG_SELECT);
-		tempSet.add(IHTMLConstants.TAG_OPTGROUP);
-		HTML_SELECT_TAGS = Collections.unmodifiableSet(tempSet);
-		
-		tempSet = new HashSet(8);
-		tempSet.add(IJSFConstants.TAG_SELECTONELISTBOX);
-		tempSet.add(IJSFConstants.TAG_SELECTONEMENU);
-		tempSet.add(IJSFConstants.TAG_SELECTMANYLISTBOX);//
-		tempSet.add(IJSFConstants.TAG_SELECTMANYMENU);//
-		tempSet.add(IJSFConstants.TAG_SELECTMANYCHECKBOX);
-		JSF_SELECT_TAGS = Collections.unmodifiableSet(tempSet);
-	}
-
-	/**
-	 * @param node
-	 * @return the select option children of node
-	 */
-	public static Object[] getSelectOptions(Element node) {
-		if (node == null) {
-			return null;
-		}
-		IDOMModel xmlModel = null;
-		if (node instanceof IDOMNode) {
-			xmlModel = ((IDOMNode) node).getModel();
-		}
-		if (xmlModel == null) {
-			return null;
-		}
-		// TODO: this query is not cached.
-		String prefixNode = JSPUtil.getPrefix(xmlModel,
-				ITLDConstants.URI_JSF_HTML);
-		if (prefixNode != null && node.getPrefix() != null
-				&& node.getPrefix().equals(prefixNode)) {
-			if (JSF_SELECT_TAGS.contains(node.getLocalName())) {
-				String prefixItem = JSPUtil.getPrefix(xmlModel,
-						ITLDConstants.URI_JSF_CORE);
-				List result = new ArrayList();
-				NodeList items = node.getElementsByTagName(prefixItem
-						+ ":" + IJSFConstants.TAG_SELECTITEM); //$NON-NLS-1$
-				for (int i = 0, n = items.getLength(); i < n; i++) {
-					result.add(items.item(i));
-				}
-				items = node.getElementsByTagName(prefixItem
-						+ ":" + IJSFConstants.TAG_SELECTITEMS); //$NON-NLS-1$
-				for (int i = 0, n = items.getLength(); i < n; i++) {
-					result.add(items.item(i));
-				}
-				return result.size() > 0 ? result.toArray(new Node[result
-						.size()]) : null;
-			}
-		}
-		if (node.getPrefix() == null) {
-			if (HTML_SELECT_TAGS.contains(node.getNodeName().toLowerCase())) {
-				List result = new ArrayList();
-				NodeList options = node
-						.getElementsByTagName(IHTMLConstants.TAG_OPTION);
-				NodeList optionGroups = node
-						.getElementsByTagName(IHTMLConstants.TAG_OPTGROUP);
-				for (int i = 0, n = options.getLength(); i < n; i++) {
-					result.add(options.item(i));
-				}
-				for (int i = 0, n = optionGroups.getLength(); i < n; i++) {
-					result.add(optionGroups.item(i));
-				}
-				return result.toArray(new Node[result.size()]);
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @param node
-	 * @return the selection option children of node as strings
-	 */
-	public static String[] getSelectOptionsString(Element node) {
-		if (node == null) {
-			return null;
-		}
-		Object[] options = getSelectOptions(node);
-		if (null == options || options[0] == null) {
-			return null;
-		}
-		List result = new ArrayList();
-		for (int i = 0, n = options.length; i < n; i++) {
-			if (options[i] instanceof Element) {
-				Element element = (Element) options[i];
-				Node value = null;
-				if (element.getNodeName()
-						.indexOf(IJSFConstants.TAG_SELECTITEMS) >= 0) {
-					value = element.getAttributeNode(IJSFConstants.ATTR_VALUE);
-				} else if (element.getNodeName().indexOf(
-						IJSFConstants.TAG_SELECTITEM) >= 0) {
-					value = element
-							.getAttributeNode(ICSSPropertyID.ATTR_ITEMLABEL);
-				}
-				if (value != null) {
-					result.add(value.getNodeValue());
-				}
-			}
-		}
-		return (String[]) result.toArray(new String[] {});
-	}
-
-	/**
-	 * @param node
-	 * @return true if node has select option children
-	 */
-	public static boolean hasSelectOptions(Element node) {
-		if (node == null) {
-			return false;
-		}
-		String uri = CMUtil.getElementNamespaceURI(node);
-		if (ITLDConstants.URI_JSF_HTML.equals(uri)) {
-
-			if (JSF_SELECT_TAGS.contains(node.getLocalName())) {
-				IDOMModel model = ((IDOMElement) node).getModel();
-				String jsfcorePrefix = JSPUtil.getPrefix(model,
-						ITLDConstants.URI_JSF_CORE);
-				if (jsfcorePrefix != null) {
-					NodeList nl = node.getElementsByTagName(jsfcorePrefix + ":"
-							+ IJSFConstants.TAG_SELECTITEM);
-					NodeList nl1 = node.getElementsByTagName(jsfcorePrefix
-							+ ":" + IJSFConstants.TAG_SELECTITEMS);
-					return nl.getLength() > 0 || nl1.getLength() > 0;
-				}
-                return false;
-			}
-		}
-		if (ITLDConstants.URI_HTML.equals(uri)) {
-			if (HTML_SELECT_TAGS.contains(node.getNodeName().toLowerCase())) {
-				NodeList nl = node
-						.getElementsByTagName(IHTMLConstants.TAG_OPTION);
-				NodeList nl1 = node
-						.getElementsByTagName(IHTMLConstants.TAG_OPTGROUP);
-				return nl.getLength() > 0 || nl1.getLength() > 0;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @param node
-	 * @return true if node is a core or HTML select tag
-	 */
-	public static boolean supportSections(Element node) {
-		String uri = CMUtil.getElementNamespaceURI(node);
-		if (ITLDConstants.URI_JSF_HTML.equals(uri)) {
-			return JSF_SELECT_TAGS.contains(node.getLocalName());
-		}
-		if (ITLDConstants.URI_HTML.equals(uri)) {
-			return HTML_SELECT_TAGS.contains(node.getNodeName().toLowerCase());
-		}
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/SelectionHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/SelectionHelper.java
deleted file mode 100644
index ee93b58..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/SelectionHelper.java
+++ /dev/null
@@ -1,384 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.text.TextSelection;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition2;
-import org.eclipse.jst.pagedesigner.dom.DOMUtil;
-import org.eclipse.jst.pagedesigner.dom.EditValidateUtil;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-import org.eclipse.wst.sse.core.internal.provisional.IndexedRegion;
-import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
-import org.w3c.dom.CharacterData;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class SelectionHelper {
-	/**
-	 * convert the text selection to a Node. Will use the start offset of the
-	 * text selection.
-	 * 
-	 * @param model
-	 * @param textSel
-	 * @return the node for the text selectin in model or null
-	 */
-	public static Node toNode(IStructuredModel model, ITextSelection textSel) {
-		// FIXME: currently always normalize to a single node. should also
-		// consider change into DesignRange
-		// on text selection, find the appropriate Node
-		Object inode = model.getIndexedRegion(textSel.getOffset());
-		if (inode instanceof Node) {
-			return (Node) inode;
-		}
-        return null;
-	}
-
-	/**
-	 * convert a structured selection of NodeEditPart or Node into the first
-	 * node.
-	 * 
-	 * @param selection
-	 * @return the node for the selection or null
-	 */
-	public static Node toNode(IStructuredSelection selection) {
-		if (selection.isEmpty()) {
-			return null;
-		}
-		Object first = selection.getFirstElement();
-		if (first instanceof Node) {
-			return (Node) first;
-		} else if (first instanceof NodeEditPart) {
-			return ((NodeEditPart) first).getIDOMNode();
-		} else {
-			return null;
-		}
-	}
-
-	/**
-	 * convert a DesignRange into a single node.
-	 * 
-	 * @param range
-	 * @return the node for the design range or null
-	 */
-	public static Node toNode(DesignRange range) {
-		if (range.isValid()) {
-			Node node1 = range.getStartPosition().getContainerNode();
-			Node node2 = range.getEndPosition().getContainerNode();
-			return DOMUtil.findCommonAncester(node1, node2);
-		}
-        return null;
-	}
-
-	/**
-	 * @param model
-	 * @param region
-	 *            if null, then will calculate it using offset.
-	 * @param offset
-	 *            offset in source.
-	 * @return a dom position for the region and offset
-	 */
-	public static IDOMPosition toDOMPosition(IDOMModel model,
-			IndexedRegion region, int offset) {
-		if (region == null) {
-			region = model.getIndexedRegion(offset);
-		}
-		if (region == null && offset > 0) {
-			// in case this is at end of file.
-			offset = offset - 1;
-			region = model.getIndexedRegion(offset);
-			if (region != null) {
-				if (region.getEndOffset() >= offset + 1) {
-					offset += 1; // restore offset.
-				}
-			}
-		}
-		if (region == null) {
-			return new DOMPosition(model.getDocument(), 0);
-		}
-		IDOMNode node = (IDOMNode) region;
-		int start = node.getStartOffset();
-		if (offset <= start) {
-			return new DOMRefPosition(node, false);
-		}
-		int end = node.getEndOffset();
-		if (offset >= end) {
-			return new DOMRefPosition(node, true);
-		}
-		if (node instanceof CharacterData) {
-			String data = ((CharacterData) node).getData();
-			String source = node.getSource();
-			if (data.equals(source)) {
-				return new DOMPosition(node, offset - start);
-			}
-			IStructuredDocumentRegion r = node
-					.getFirstStructuredDocumentRegion();
-			int countedData = 0;
-			// TODO: dead? int offsetInNode = offset - start;
-			while (r != null) {
-				if (DOMRegionContext.XML_CHAR_REFERENCE.equals(r.getType())
-						|| DOMRegionContext.XML_ENTITY_REFERENCE.equals(r
-								.getType())) {
-					countedData += 1; // FIXME: what if the entity reference's
-					// corresponding data is more than 1
-					// char?
-					// where can we get that information?
-					if (r.getEnd() >= offset) {
-						return new DOMPosition(node, countedData);
-					}
-				} else {
-					if (r.getEnd() >= offset) {
-						return new DOMPosition(node, countedData + offset
-								- r.getStart());
-					}
-					countedData += r.getLength();
-				}
-				r = r.getNext();
-			}
-			return new DOMRefPosition(node, true);
-		} else if (node instanceof Element) {
-			CMElementDeclaration cm = CMUtil
-					.getElementDeclaration((Element) node);
-			if (cm != null && cm.getContentType() == CMElementDeclaration.EMPTY) {
-				// this node can't have children.
-				return new DOMRefPosition(node, true);
-			}
-			IStructuredDocumentRegion startRegion = node
-					.getStartStructuredDocumentRegion();
-			if (startRegion == null) {
-				return new DOMRefPosition(node, true);
-			}
-            int startRegionEnd = node.getStartStructuredDocumentRegion()
-            		.getEnd();
-            if (offset <= startRegionEnd) {
-            	// it is in the start tag region. So put position at first
-            	// child position.
-            	return new DOMRefPosition2(node, false);
-            }
-            return new DOMRefPosition2(node, true);
-		} else {
-			return new DOMRefPosition(node, true);
-		}
-		// XXX: the implementation in EditModelQuery seemed to be very complex.
-		// Need revisit that
-		// and refactor the implementation to this class later. (lium)
-	}
-
-	/**
-	 * Give a text selection with offset and length, convert it into a Designer
-	 * selection (IStrucuturedSelection of editpart or DesignerRange). If the
-	 * text selection include just a single element node, we'll create a
-	 * IStructuredSelection, otherwise we'll create a DesignerRange.
-	 * 
-	 * @param graphicViewer
-	 * @param offset
-	 * @param length
-	 * @return a selection
-	 */
-	public static ISelection convertToDesignerSelection(
-			IHTMLGraphicalViewer graphicViewer, int offset, int length) {
-		IDOMModel model = graphicViewer.getModel();
-		IndexedRegion region1 = model.getIndexedRegion(offset);
-		IndexedRegion region2 = model.getIndexedRegion(offset + length);
-		IDOMNode node1 = (IDOMNode) region1;
-
-		if (node1 == null) {
-			IDOMPosition endOfDoc = new DOMRefPosition2(model.getDocument(),
-					true);
-			DesignPosition p = DOMPositionHelper.toDesignPosition(endOfDoc);
-			return new DesignRange(p, p);
-		}
-
-		if ((region1 == region2 || node1.getEndOffset() == offset + length)
-				&& !(node1 instanceof Text)) {
-			// ok, we selected a single node.
-			EditPart part = (EditPart) node1.getAdapterFor(EditPart.class);
-			if (part != null) {
-				return new StructuredSelection(part);
-			}
-		}
-
-		// when we reach here, we'll create a DesignerRange
-		IDOMPosition position1 = toDOMPosition(model, region1, offset);
-		IDOMPosition position2 = (length == 0 ? position1 : toDOMPosition(
-				model, region2, offset + length));
-
-		if (position1 == null || position2 == null) {
-			return new DesignRange(null, null);
-		}
-		DesignPosition p1 = DOMPositionHelper.toDesignPosition(position1);
-		DesignPosition p2 = (length == 0 ? p1 : DOMPositionHelper
-				.toDesignPosition(position2));
-		if (p1 == null || p2 == null) {
-			return new DesignRange(null, null);
-		}
-
-		return new DesignRange(p1, p2);
-
-	}
-
-	/**
-	 * convert a IDOMPosition into index in the source.
-	 * 
-	 * @param p
-	 * @return
-	 */
-	private static int getIndexedRegionLocation(IDOMPosition p) {
-		if (!EditValidateUtil.validPosition(p)) {
-			return 0;
-		}
-
-		IDOMNode parent = (IDOMNode) p.getContainerNode();
-		if (p.isText()) {
-			String text = ((CharacterData) parent).getData();
-			String source = parent.getSource();
-			if (text.length() == source.length()) {
-				// no entity reference.
-				return parent.getStartOffset() + p.getOffset();
-			}
-			// CR404708. Need to handle entity reference in the text.
-			int offset = p.getOffset();
-			int counted = 0;
-			IStructuredDocumentRegion r = parent
-					.getFirstStructuredDocumentRegion();
-			while (r != null && counted < offset) {
-				if (DOMRegionContext.XML_CHAR_REFERENCE.equals(r.getType())
-						|| DOMRegionContext.XML_ENTITY_REFERENCE.equals(r
-								.getType())) {
-					counted++;
-					if (counted >= offset) {
-						return r.getEndOffset();
-					}
-				} else {
-					int length = r.getLength();
-					if (counted + length >= offset) {
-						return r.getStartOffset() + offset - counted;
-					}
-					counted += length;
-				}
-				r = r.getNext();
-			}
-			return parent.getStartOffset() + p.getOffset();
-		}
-        IDOMNode previous = (IDOMNode) p.getPreviousSiblingNode();
-        if (previous != null) {
-        	return previous.getEndOffset();
-        }
-        IDOMNode next = (IDOMNode) p.getNextSiblingNode();
-        if (next != null) {
-        	return next.getStartOffset();
-        }
-        IStructuredDocumentRegion r = parent
-        		.getStartStructuredDocumentRegion();
-        if (r != null) {
-        	return r.getEnd();
-        }
-        // r == null normally means the parent is the document node.
-        return parent.getEndOffset();
-	}
-
-	/**
-	 * convert design selection of structured selection of NodeEditPart into
-	 * structured selection of Node
-	 * 
-	 * @param sel
-	 * @return a structured selectino
-	 */
-	public static IStructuredSelection convertFromDesignSelection(
-			IStructuredSelection sel) {
-		List list = sel.toList();
-		if (list != null) {
-			List result = new ArrayList(list.size());
-			for (int i = 0, size = list.size(); i < size; i++) {
-				NodeEditPart part = (NodeEditPart) list.get(i);
-				result.add(part.getIDOMNode());
-			}
-			return new StructuredSelection(result);
-		}
-        return new StructuredSelection();
-	}
-
-	/**
-	 * 
-	 * @param range
-	 *            selection from designer, could be IStructuredSelection of
-	 *            NodeEditPart, or DesignRange.
-	 * @return a text selection
-	 */
-	public static ITextSelection convertFromDesignSelection(DesignRange range) {
-		if (range.isValid()) {
-			IDOMPosition start = DOMPositionHelper.toDOMPosition(range
-					.getStartPosition());
-			IDOMPosition end = DOMPositionHelper.toDOMPosition(range
-					.getEndPosition());
-			// We should not encounter invalid position.
-			if (EditValidateUtil.validPosition(start)
-					&& EditValidateUtil.validPosition(end)) {
-				int offset = getIndexedRegionLocation(start);
-				int endoffset = getIndexedRegionLocation(end);
-				if (offset > endoffset) {
-					int temp = offset;
-					offset = endoffset;
-					endoffset = temp;
-				}
-				return new TextSelection(offset, endoffset - offset);
-			} 
-		}
-        return new TextSelection(0, 0);
-	}
-
-	/**
-	 * @param selection
-	 * @return a text selection for the selection or TextSelection(0,0)
-	 * if nothing can be determined
-	 */
-	public static ITextSelection convertFromDesignSelectionToTextSelection(
-			ISelection selection) {
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection nodes = convertFromDesignSelection((IStructuredSelection) selection);
-			IDOMNode node = (IDOMNode) nodes.getFirstElement();
-			if (node != null && node.getNodeType() != Node.DOCUMENT_NODE) {
-				return new TextSelection(node.getStartOffset(), node
-						.getEndOffset()
-						- node.getStartOffset());
-			}
-		} else if (selection instanceof DesignRange) {
-			return convertFromDesignSelection((DesignRange) selection);
-		}
-        return new TextSelection(0, 0);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/StructuredModelUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/StructuredModelUtil.java
deleted file mode 100644
index 8853975..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/StructuredModelUtil.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
-
-/**
- * @author mengbo
- */
-public class StructuredModelUtil {
-
-	/**
-	 * this method is copied from ModelManagerImpl of wtp. Because it is
-	 * internal.
-	 * 
-	 * @param model
-	 * @return null if can't get file.
-	 */
-	// TODO: replace (or supplement) this is a "model info" association to the
-	// IFile that created the model
-	public static IFile getFileFor(IStructuredModel model) {
-		if (model == null)
-			return null;
-		String path = model.getBaseLocation();
-		if (path == null || path.length() == 0) {
-			Object id = model.getId();
-			if (id == null)
-				return null;
-			path = id.toString();
-		}
-		// TODO needs rework for linked resources
-		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-		try {
-			IFile file = root.getFile(new Path(path));
-			// IFile file = root.getFileForLocation(new Path(path));
-			return file;
-		} catch (Exception ex) {
-			return null;
-		}
-	}
-
-	/**
-	 * 
-	 * @param model
-	 * @return null if can't find project for the model
-	 */
-	public static IProject getProjectFor(IStructuredModel model) {
-		IProject project = null;
-
-		IFile file = getFileFor(model);
-		if (file != null) {
-			project = file.getProject();
-		}
-		return project;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/UriAdapterFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/UriAdapterFactory.java
deleted file mode 100644
index 4bad85a..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/UriAdapterFactory.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IAdapterFactory;
-import org.eclipse.wst.sse.core.internal.util.URIResolver;
-
-/**
- * @author mengbo comment go to Window - Preferences - Java - Code Style - Code
- *         Templates
- */
-public class UriAdapterFactory implements IAdapterFactory {
-	/** Create the logger for this class */
-	//private static Logger _log = PDPlugin.getLogger(UriAdapterFactory.class);
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapter(java.lang.Object,
-	 *      java.lang.Class)
-	 */
-	public Object getAdapter(Object adaptableObject, Class adapterType) {
-		if (URIResolver.class.equals(adapterType)) {
-			IProject project = (IProject) adaptableObject;
-			URIResolver fProjectResolver = new ProjectResolver(project);
-			return fProjectResolver;
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IAdapterFactory#getAdapterList()
-	 */
-	public Class[] getAdapterList() {
-		Class[] classes = new Class[1];
-		classes[0] = URIResolver.class;
-		return classes;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/WebAppUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/WebAppUtil.java
deleted file mode 100644
index d3971e2..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/WebAppUtil.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.jst.j2ee.internal.web.deployables.WebDeployableArtifactUtil;
-import org.eclipse.jst.jsf.common.ui.IFileFolderConstants;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.wst.common.componentcore.ComponentCore;
-import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
-import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class WebAppUtil {
-	private final static String FACES_SERVLET_NAME = "javax.faces.webapp.FacesServlet";
-
-	/**
-	 * @param url
-	 * @param openedFile
-	 * @return the transformed url
-	 */
-	public static String transformJSPURL(String url, IFile openedFile) {
-		boolean canSupportJSF = JSPUtil.supportTaglib(
-				ITLDConstants.URI_JSF_HTML, openedFile);
-		if (canSupportJSF
-				&& url != null
-				&& url.endsWith(IFileFolderConstants.DOT
-						+ IFileFolderConstants.EXT_JSP)) {
-			String urlPattern = "";
-			IVirtualResource[] resources = ComponentCore
-					.createResources(openedFile);
-			IVirtualComponent component = null;
-			if (resources[0] != null) {
-				component = resources[0].getComponent();
-			}
-			if (component != null) {
-				urlPattern = WebDeployableArtifactUtil.getServletMapping(
-						openedFile.getProject(), true, FACES_SERVLET_NAME,
-						component.getName());
-			}
-			if (urlPattern.lastIndexOf(IFileFolderConstants.DOT) != -1) {
-				String extension = urlPattern.substring(urlPattern
-						.lastIndexOf(IFileFolderConstants.DOT));
-				url = url.substring(0, url.lastIndexOf(IFileFolderConstants.DOT
-						+ IFileFolderConstants.EXT_JSP))
-						+ extension;
-			}
-		}
-		return url;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/XMLUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/XMLUtil.java
deleted file mode 100644
index 7638cd4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/XMLUtil.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.utils;
-
-/**
- * @author mengbo
- */
-
-import java.io.IOException;
-import java.io.OutputStream;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.OutputKeys;
-import javax.xml.transform.Source;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.TransformerFactoryConfigurationError;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
-
-import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
-import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.w3c.dom.Document;
-
-/**
- * 
- *
- */
-public class XMLUtil {
-	private static Logger _log = PDPlugin.getLogger(XMLUtil.class);
-
-	/**
-	 * Returns a DocumentBuilder capable of creating a DOM Document from input.
-	 * 
-	 * @return a new instance of a document builder or null if an exception
-	 * occurs on creation
-	 */
-	public synchronized static DocumentBuilder getDocumentBuilder() {
-		DocumentBuilder result = null;
-		try {
-			result = DocumentBuilderFactory.newInstance().newDocumentBuilder();
-		} catch (ParserConfigurationException e) {
-			// "Error in create documentBuilder"
-			_log.info("XMLUtil.Error.0", e); //$NON-NLS-1$
-		}
-		return result;
-	}
-
-	/**
-	 * Transforms a DOM document into a lightly-formatted UTF-8 represntation
-	 * and outputs it to an outputstream
-	 * 
-	 * @param document
-	 * @param ostream
-	 * @throws IOException
-	 */
-	public static void serialize(Document document, OutputStream ostream)
-			throws IOException {
-		Source domSource = new DOMSource(document);
-		try {
-			Transformer serializer = TransformerFactory.newInstance()
-					.newTransformer();
-			try {
-				serializer.setOutputProperty(OutputKeys.INDENT, "yes"); //$NON-NLS-1$
-				serializer.setOutputProperty(
-						"{http://xml.apache.org/xslt}indent-amount", "4"); //$NON-NLS-1$ //$NON-NLS-2$
-				serializer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); //$NON-NLS-1$
-			} catch (IllegalArgumentException e) {
-				// "Error in object persistance:"
-				_log.info("XMLUtil.Error.2", e); //$NON-NLS-1$
-			}
-			serializer.transform(domSource, new StreamResult(ostream));
-		} catch (TransformerConfigurationException e) {
-			// "Error in object persistance:"
-			_log.info("XMLUtil.Error.2", e); //$NON-NLS-1$
-			throw new IOException(e.getMessage());
-		} catch (TransformerFactoryConfigurationError e) {
-			// "Error in object persistance:"
-			_log.info("XMLUtil.Error.2", e); //$NON-NLS-1$
-			throw new IOException(e.getMessage());
-		} catch (TransformerException e) {
-			// "Error in object persistance:"
-			_log.info("XMLUtil.Error.2", e); //$NON-NLS-1$
-			throw new IOException(e.getMessage());
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/ActionData.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/ActionData.java
deleted file mode 100644
index e0c1afa..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/ActionData.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-/**
- * This method represents a user action, the 'data' could be any related
- * data that will be referenced later in the action processing. For example.
- * when user does a DnD, the localData will be referenced as _data.
- * 
- * @author mengbo
- */
-public class ActionData {
-	/**
-	 * Action type for palette drag and drop
-	 */
-	public static final int PALETTE_DND = 1;
-
-	/**
-	 * Action type for databinding drag and drop
-	 */
-	public static final int DATABINDING_DND = 2;
-
-	/**
-	 * Action type for other drag and  drop
-	 */
-	public static final int OTHER_DND = 3;
-
-	/**
-	 * Action type for key board navigation
-	 */
-	public static final int KEYBOARD_NAVAGATION = 4;
-
-	/**
-	 * Action type for inline editing
-	 */
-	public static final int INLINE_EDIT = 5;
-
-	/**
-	 * Action type for component move
-	 */
-	public static final int COMPONENT_MOVE = 6;
-
-	/**
-	 * Unknown action type (?)
-	 */
-	public static final int UNKNOWN = 0;
-
-	private final int _actionType;
-
-	private final Object _data;
-
-	/**
-	 * @param action 
-	 * @param data 
-	 */
-	public ActionData(int action, Object data) {
-		_actionType = action;
-		if (data != null) {
-			_data = data;
-		} else {
-			_data = new Object();
-		}
-	}
-
-	/**
-	 * @return Returns the _actionType.
-	 */
-	public final int getActionType() {
-		return _actionType;
-	}
-
-	/**
-	 * @return Returns the _data.
-	 */
-	public final Object getData() {
-		return _data;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/BasicMovementRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/BasicMovementRule.java
deleted file mode 100644
index f1306ce..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/BasicMovementRule.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-/*package*/ class BasicMovementRule extends DefaultMovementRule {
-
-	/**
-	 * @param actionData
-	 */
-	public BasicMovementRule(ActionData actionData) {
-		super(actionData);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.validation.caret.IMovementRule#allowsMoveIn(org.eclipse.jst.pagedesigner.validation.caret.Target)
-	 */
-	public boolean allowsMoveIn(Target target) {
-		if (_actionData.getActionType() == ActionData.INLINE_EDIT) {
-			Node node = target.getNode();
-			return EditModelQuery.isText(node) || node.hasChildNodes();
-		}
-		return super.allowsMoveIn(target);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/BasicPositionRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/BasicPositionRule.java
deleted file mode 100644
index 3eaa5f0..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/BasicPositionRule.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.EditValidateUtil;
-import org.w3c.dom.Node;
-
-/**
- * Deal with widget.
- * 
- * @author mengbo
- */
-/*package*/ class BasicPositionRule extends DefaultPositionRule 
-{
-    private final IPositionMediator _mediator;
-
-	/**
-	 * @param mediator
-	 * @param actionData 
-	 */
-	public BasicPositionRule(IPositionMediator mediator, ActionData actionData) {
-	    super(actionData);
-        _mediator = mediator;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IPositionRule#hasEditableArea(org.eclipse.gef.EditPart)
-	 */
-	public boolean hasEditableArea(Target target) {
-		if (target == null || target.getPart() == null) {
-			return false;
-		}
-		if (!EditValidateUtil.validNode(target.getNode())) {
-			return false;
-		}
-		if (DefaultPositionRule.isWidget(target.getPart())) {
-			return false;
-		}
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IPositionRule#isEditable(org.eclipse.gef.EditPart)
-	 */
-	public boolean isEditable(Target target) {
-		if (target.getPart() == null) {
-			return false;
-		}
-		Node node = target.getNode();
-
-		// text is depending on parent.
-		if (EditModelQuery.isText(node)) {
-			return _mediator.isEditable(new Target(node.getParentNode()));
-		}
-		String name = node.getLocalName();
-		// Name is null, the node should not be Element
-		if (name == null && !EditModelQuery.isDocument(node)
-				&& !EditModelQuery.isText(node)) {
-			return false;
-		}
-		// if is widget, return false;
-		if (DefaultPositionRule.isWidget(target.getPart())) {
-			return false;
-		}
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IPositionRule#canStopHere(org.w3c.dom.Node)
-	 */
-	public boolean canReference(Target target, boolean atRight) {
-		Node node = target.getNode();
-		if (target.getPart() == null || node.getNodeType() != Node.ELEMENT_NODE
-				&& !EditModelQuery.isText(node)) {
-			return false;
-		}
-		return true;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/ContainerMoveInAndOutRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/ContainerMoveInAndOutRule.java
deleted file mode 100644
index c953334..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/ContainerMoveInAndOutRule.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import java.util.Arrays;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-/*package*/ class ContainerMoveInAndOutRule extends DefaultMovementRule {
-	private static final String[] HTML_CONTAINERS = { IHTMLConstants.TAG_TABLE };
-
-	private static final String[] NONE_HTML_CONTAINERS = {};
-
-	private static final String[] SPECIAL_HTML_CONTAINERS = {
-			IJSFConstants.TAG_OUTPUTLINK, IJSFConstants.TAG_COMMANDLINK,
-			IJSFConstants.TAG_FACET, IJSFConstants.TAG_VERBATIM };
-
-	/**
-	 * @param actionData
-	 */
-	public ContainerMoveInAndOutRule(ActionData actionData) {
-		super(actionData);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IMovementRule#canEnter(org.w3c.dom.Node)
-	 */
-	public boolean allowsMoveIn(Target target) {
-		Node node = target.getNode();
-		if (node.getLocalName() != null && //
-				(Arrays.asList(HTML_CONTAINERS).contains(node.getLocalName()
-						.toLowerCase())) || //
-				Arrays.asList(NONE_HTML_CONTAINERS).contains(
-						node.getLocalName()) || //
-				Arrays.asList(SPECIAL_HTML_CONTAINERS).contains(
-						node.getLocalName())) {
-			return false;
-		}
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IMovementRule#canMoveOut(org.eclipse.gef.EditPart)
-	 */
-	public boolean allowsMoveOut(Target target) {
-		Node node = target.getNode();
-		if (EditModelQuery.isDocument(node)) {
-			return false;
-		}
-
-		if (_actionData.getActionType() == ActionData.INLINE_EDIT
-				&& (IHTMLConstants.TAG_TD.equalsIgnoreCase(node.getLocalName()) || IHTMLConstants.TAG_TH
-						.equalsIgnoreCase(node.getLocalName()))) {
-			return false;
-		}
-		if (node.getLocalName() != null && //
-				(Arrays.asList(HTML_CONTAINERS).contains(node.getLocalName()
-						.toLowerCase())) || //
-				Arrays.asList(NONE_HTML_CONTAINERS).contains(
-						node.getLocalName())) {
-			return false;
-		}
-
-		if (node.getLocalName() != null
-				&& (Arrays.asList(
-						RootContainerPositionRule.HTML_ROOT_CONTAINERS)
-						.contains(node.getLocalName().toLowerCase()) || //
-				Arrays.asList(JSFRootContainerPositionRule.JSF_ROOT_CONTAINERS)
-						.contains(node.getLocalName()))) {
-			if (!EditModelQuery.isChild(
-					JSFRootContainerPositionRule.JSF_ROOT_CONTAINERS, node,
-					false, true)
-					&& //
-					!EditModelQuery.isChild(
-							RootContainerPositionRule.HTML_ROOT_CONTAINERS,
-							node, true, true)) {
-				return false;
-			}
-		}
-		return true;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DefaultMovementRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DefaultMovementRule.java
deleted file mode 100644
index 1aaab7c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DefaultMovementRule.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-/**
- * @author mengbo
- */
-/*package*/ class DefaultMovementRule implements IMovementRule {
-	ActionData _actionData;
-
-	/**
-	 * @param actionData 
-	 * 
-	 */
-	public DefaultMovementRule(ActionData actionData) {
-		super();
-		_actionData = actionData;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.validation.caret.IMovementRule#allowsMoveIn(org.eclipse.jst.pagedesigner.validation.caret.Target)
-	 */
-	public boolean allowsMoveIn(Target target) {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.validation.caret.IMovementRule#allowsMoveOut(org.eclipse.jst.pagedesigner.validation.caret.Target)
-	 */
-	public boolean allowsMoveOut(Target target) {
-		return true;
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DefaultPositionRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DefaultPositionRule.java
deleted file mode 100644
index 40e8222..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DefaultPositionRule.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-
-/**
- * @author mengbo
- */
-public class DefaultPositionRule implements IPositionRule {
-
-	private ActionData _actionData;
-
-	/**
-	 * @param actionData 
-	 * 
-	 */
-	public DefaultPositionRule(ActionData actionData) {
-		super();
-		if (actionData != null) {
-			_actionData = actionData;
-		} else {
-			_actionData = new ActionData(ActionData.UNKNOWN, new Object());
-		}
-	}
-
-    /**
-     * @return the action data
-     */
-    protected final ActionData getActionData()
-    {
-        return _actionData;
-    }
-    
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IPositionRule#hasEditableArea(org.w3c.dom.Node)
-	 */
-	public boolean hasEditableArea(Target target) {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IPositionRule#isEditable(org.eclipse.gef.EditPart)
-	 */
-	public boolean isEditable(Target target) {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IPositionRule#isTransparent(org.eclipse.gef.EditPart,
-	 *      org.eclipse.draw2d.geometry.Point)
-	 */
-	public boolean canReference(Target target, boolean atRight) {
-		return true;
-	}
-
-	/**
-	 * If container is inEditable and can be referenced, the position is
-	 * invalid, otherwise as default the position is valid. (non-Javadoc)
-	 */
-	public boolean isValidPosition(IDOMPosition position) {
-		boolean result = isEditable(new Target(position.getContainerNode()));
-		if (result) {
-			if (position.getOffset() == 0
-					|| position.getOffset() == position.getContainerNode()
-							.getChildNodes().getLength()) {
-				result = true;
-			} else {
-				boolean dir;
-				Target target = null;
-				if (position instanceof DOMRefPosition) {
-					target = new Target(((DOMRefPosition) position)
-							.getReferenceNode());
-					dir = ((DOMRefPosition) position).isForward();
-					result = canReference(target, dir);
-				}
-			}
-		}
-		return result;
-	}
-    
-    /**
-     * @param host
-     * @return true if the host edit part is a widget
-     */
-     public static boolean isWidget(EditPart host) {
-        if (host instanceof NodeEditPart) {
-            return ((NodeEditPart) host).isWidget();
-        }
-        return false;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DefaultPositionValidator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DefaultPositionValidator.java
deleted file mode 100644
index 6c45a83..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DefaultPositionValidator.java
+++ /dev/null
@@ -1,234 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.EditHelper;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.parts.DocumentEditPart;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-/*package*/ class DefaultPositionValidator implements IPositionMediator {
-	private List<IValidationRule> _rules = new ArrayList<IValidationRule>();
-
-	/**
-	 * the validator's action data
-	 */
-	protected final ActionData _actionData;
-
-	/**
-	 * @return Returns the _actionData.
-	 */
-	public ActionData getActionData() {
-		return _actionData;
-	}
-
-	/**
-	 * @param actionData 
-	 */
-	protected DefaultPositionValidator(ActionData actionData) {
-		_actionData = actionData;
-		initRules();
-	}
-
-	/**
-	 * initialize the default rules
-	 */
-	protected void initRules() {
-		_rules.clear();
-		addRule(new BasicPositionRule(this, _actionData));
-        addRule(new IETablePositionRule(_actionData));
-        addRule(new RootContainerPositionRule(_actionData));
-        addRule(new JSFRootContainerPositionRule(_actionData));
-        addRule(new WhitespacePositionMoveRule(_actionData));
-	}
-
-	/**
-	 * @return Returns the _rules.
-	 */
-	public List getRules() {
-		return Collections.unmodifiableList(_rules);
-	}
-
-	/**
-	 * @param rule
-	 */
-	protected void addRule(IValidationRule rule) {
-		_rules.add(rule);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IValidator#hasEditableArea(org.w3c.dom.Node)
-	 */
-	public boolean hasEditableArea(Target target) {
-		boolean result = true;
-		List rules = getRules();
-		for (int i = 0, n = rules.size(); i < n; i++) {
-			Object rule = rules.get(i);
-			if (rule instanceof IPositionRule) {
-				result &= ((IPositionRule) rule).hasEditableArea(target);
-			}
-			if (!result) {
-				break;
-			}
-		}
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IValidator#isEditable(org.w3c.dom.Node)
-	 */
-	public boolean isEditable(Target target) {
-		Node node = target.getNode();
-		boolean result = true;
-		List rules = getRules();
-		for (int i = 0, n = rules.size(); i < n; i++) {
-			Object rule = rules.get(i);
-			if (rule instanceof IPositionRule) {
-				result &= ((IPositionRule) rule).isEditable(new Target(node));
-			}
-			if (!result) {
-				break;
-			}
-		}
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IValidator#isValidPosition(org.eclipse.jst.pagedesigner.viewer.DesignPosition)
-	 */
-	public boolean isValidPosition(DesignPosition position) {
-		return isValidPosition(DOMPositionHelper.toDOMPosition(position));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IValidator#isValidPosition(org.eclipse.jst.pagedesigner.dom.IDOMPosition)
-	 */
-	public boolean isValidPosition(IDOMPosition position) {
-        // if position is really a IDOMRefPosition, convert it to DOMPosition
-		position = EditHelper.ensureDOMPosition(position);
-		boolean refLeft = true, refRight = true, result = true;
-		if (position == null) {
-			return false;
-		}
-		List rules = getRules();
-		for (int i = 0, n = rules.size(); i < n; i++) {
-			Object rule = rules.get(i);
-            
-            // rule may be an IValidationRule that is not a position rule
-            // so only use those that are actually position rules
-			if (rule instanceof IPositionRule) {
-                // the IDOMPosition represents a position somewhere in a parent
-                // node based on a node list index.  We need to verify that the
-                // parent is editable.
-				result &= ((IPositionRule) rule).isEditable(new Target(position
-						.getContainerNode()));
-				if (result) {
-					if (!position.isText()) {
-
-                        // TODO C.B: no sure what the point is here.  It appears
-                        // as though it is validating whether the sibling either
-                        // side of this position is a valid location for this 
-                        // action
-                        
-						// ref1?
-						Node node = EditModelQuery.getInstance().getSibling(
-								position, true);
-						if (node != null & refLeft) {
-							refLeft &= ((IPositionRule) rule).canReference(
-									new Target(node), false);
-						}
-						// ref2?
-						node = EditModelQuery.getInstance().getSibling(
-								position, false);
-						if (node != null & refRight) {
-							refRight = ((IPositionRule) rule).canReference(
-									new Target(node), true);
-						}
-						if (!(refLeft | refRight)) {
-							result = false;
-							break;
-						}
-					}
-				} else {
-					break;
-				}
-				// }
-			}
-		}
-		return (result & (refLeft | refRight));
-	}
-
-	/**
-	 * Adjust the position to an editable area.
-	 */
-	public EditPart getEditableContainer(Target target) {
-		EditPart part = target.getPart();
-		if (hasEditableArea(target)) {
-			return target.getPart();
-		}
-		while (part != null && !(part instanceof DocumentEditPart)) {
-			if (hasEditableArea(target)) {
-				break;
-			}
-			part = part.getParent();
-			target = new Target(part);
-		}
-		if (part instanceof DocumentEditPart
-				&& RootContainerPositionRule.hasBasicContainers((Document) part
-						.getModel())) {
-			Node node = RootContainerPositionRule
-					.getBasicContainer((Document) part.getModel());
-			part = Target.resolvePart(node);
-		}
-		return part;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IValidator#canReference(org.w3c.dom.Node)
-	 */
-	public boolean canReference(Target target, boolean atRight) {
-		boolean result = true;
-		List rules = getRules();
-		for (int i = 0, n = rules.size(); i < n; i++) {
-			Object rule = rules.get(i);
-			if (rule instanceof IPositionRule) {
-				result &= ((IPositionRule) rule).canReference(target, atRight);
-			}
-			if (!result) {
-				break;
-			}
-		}
-		return result;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DnDPositionValidator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DnDPositionValidator.java
deleted file mode 100644
index 6fddc52..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DnDPositionValidator.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-/**
- * This validator is used for caret positioning when user do drag & drop on the
- * screen.
- * 
- * @author mengbo
- * TODO: is this class complete?
- */
-public class DnDPositionValidator extends DefaultPositionValidator {
-    //TODO: not used
-//	private static DnDPositionValidator _instance;
-//
-//	private ActionData _data;
-
-	/**
-	 * @param actionData
-	 */
-	public DnDPositionValidator(ActionData actionData) {
-		super(actionData);
-	}
-
-    /**
-     * Override to make adding rules public on Dnd validators
-     */
-    public void addRule(IValidationRule rule) 
-    {
-        super.addRule(rule);
-    }
-    
-    
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DropActionData.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DropActionData.java
deleted file mode 100644
index 0d3f211..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/DropActionData.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import java.util.Collections;
-import java.util.List;
-
-/**
- * An action data for object drops
- * @author cbateman
- *
- */
-public class DropActionData extends ActionData
-{
-    /**
-     * @param action
-     * @param data
-     */
-    public DropActionData(int action, DropData data ) 
-    {
-        super(action, data);
-    }
-
-    /**
-     * @return the drop data or  null if none
-     */
-    public DropData getDropData()
-    {
-        return (DropData) getData();
-    }
-    
-    /**
-     * Encapsulates the tags to be dropped
-     *
-     */
-    public static class DropData
-    {
-        private final List    _tagIds;
-        
-        /**
-         * @param tagIds
-         */
-        public DropData(List tagIds)
-        {
-            _tagIds = Collections.unmodifiableList(tagIds);
-        }
-        
-        /**
-         * @return the list of tag ids being dropped.  List
-         * is unmodifiable
-         */
-        public List getTagIdentifiers()
-        {
-            return _tagIds;
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/HeadDataPositionRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/HeadDataPositionRule.java
deleted file mode 100644
index ed2fcae..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/HeadDataPositionRule.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-/**
- * Ensure the DnD for loadBundle or taglib is in head area.
- * 
- * @author mengbo
- */
-/*package*/ class HeadDataPositionRule extends DefaultPositionRule {
-
-	/**
-	 * @param data
-	 */
-	public HeadDataPositionRule(ActionData data) {
-		super(data);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IEPanelgridPositionRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IEPanelgridPositionRule.java
deleted file mode 100644
index df41805..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IEPanelgridPositionRule.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.w3c.dom.Node;
-
-/**
- * In some place, wen can't do inline editing, like the area between td, in
- * panelGrid, etc. In these places we can't place caret
- * 
- * @author mengbo
- */
-/*package*/ class IEPanelgridPositionRule extends DefaultPositionRule {
-	/**
-	 * @param actionData
-	 */
-	public IEPanelgridPositionRule(ActionData actionData) {
-		super(actionData);
-	}
-
-	/**
-	 * PanelGrid is not editable.
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.validation.caret.IPositionRule#isEditable(Target)
-	 */
-	public boolean isEditable(Target target) {
-		Node node = target.getNode();
-		return !EditModelQuery.isChild(new String[] {
-				IJSFConstants.TAG_PANELGRID, IJSFConstants.TAG_DATATABLE },
-				node, false, false);
-	}
-
-	public boolean hasEditableArea(Target target) {
-		Node node = target.getNode();
-		return !EditModelQuery.isChild(new String[] {
-				IJSFConstants.TAG_PANELGRID, IJSFConstants.TAG_DATATABLE },
-				node, false, false);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IETablePositionRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IETablePositionRule.java
deleted file mode 100644
index f93405c..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IETablePositionRule.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.dom.EditValidateUtil;
-import org.w3c.dom.Node;
-
-/**
- * This rule constains the operation within a table: 1. The inputing position
- * can only be in 'td' 2. Table structure must be valid.
- * 
- * @author mengbo
- */
-public class IETablePositionRule extends DefaultPositionRule {
-	// We will introduce validation based on DtD later, this is not final
-	// solution.
-	private final String[] CONTAINER = { IHTMLConstants.TAG_THEAD,
-			IHTMLConstants.TAG_TBODY, IHTMLConstants.TAG_TFOOT };
-
-	/**
-	 * @param actionData 
-	 */
-	public IETablePositionRule(ActionData actionData) {
-		super(actionData);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IPositionRule#hasEditableArea(org.eclipse.jst.pagedesigner.caret.Target)
-	 */
-	public boolean hasEditableArea(Target target) {
-		if (EditModelQuery.isChild(IHTMLConstants.TAG_TABLE, target.getNode(),
-				true)) {
-			if (target.getPart() == null) {
-				return false;
-			}
-			Node node = target.getNode();
-			// The target must be in a valid table structure.
-			String name = node.getLocalName();
-			if (node.hasChildNodes()) {
-				// for constrained container, depends on its children.
-				if (name != null
-						&& (IHTMLConstants.TAG_TABLE.equalsIgnoreCase(name) || //
-								Arrays.asList(CONTAINER).contains(
-										name.toLowerCase()) || //
-						IHTMLConstants.TAG_TR.equalsIgnoreCase(name))) {
-					List children = target.getPart().getChildren();
-					for (int i = 0, n = children.size(); i < n; i++) {
-						if (hasEditableArea(new Target((EditPart) children
-								.get(i)))) {
-							return true;
-						}
-					}
-					return false;
-				}
-			} else {
-				if (!isEditable(new Target(node))) {
-					return false;
-				}
-			}
-		}
-		return super.hasEditableArea(target);
-	}
-
-	/**
-	 * Used to valid the structure of table, later will use dtd to do that.
-	 * @param container 
-	 * @return true if the table is valid
-	 */
-	public boolean isInValidTable(Node container) {
-		boolean result = false;
-		try {
-			if (EditValidateUtil.validNode(container)) {
-				if (EditModelQuery.isText(container)) {
-					container = container.getParentNode();
-				}
-				String name = container.getLocalName();
-				if (EditModelQuery.isChild(IHTMLConstants.TAG_TABLE, container,
-						true)) {
-					List ancestors = EditModelQuery.getAncestors(container,
-							IHTMLConstants.TAG_TABLE, true);
-					int offset = ancestors.size();
-					// remove 'table'
-					Node temp = (Node) ancestors.remove(offset - 1);
-					if (temp == container) {
-						return true;
-					}
-					offset--;
-					result = checkValidTrTd(ancestors, container);
-					if (!result) {
-						// thead->tr->td
-						temp = (Node) ancestors.get(offset - 1);
-						name = temp.getNodeName();
-						if (Arrays.asList(CONTAINER).contains(
-								name.toLowerCase())) {
-							if (temp == container) {
-								result = true;
-							} else {
-								// remove 'thead'
-								ancestors.remove(offset - 1);
-								offset--;
-								result = checkValidTrTd(ancestors, container);
-							}
-						}
-					}
-				}
-			}
-			return result;
-		} catch (Exception e) {
-			// The exception means the structure is not a valid table, don't
-			// need to report.
-			return false;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IPositionRule#isEditable(org.eclipse.jst.pagedesigner.caret.Target)
-	 */
-	public boolean isEditable(Target target) {
-		if (EditModelQuery.isChild(IHTMLConstants.TAG_TABLE, target.getNode(),
-				false)) {
-			if (isInValidTable(target.getNode())) {
-				List ancestors = EditModelQuery.getAncestors(target.getNode(),
-						IHTMLConstants.TAG_TABLE, true);
-				if (ancestors.size() >= 3) {
-					if (IHTMLConstants.TAG_TH
-							.equalsIgnoreCase(((Node) ancestors.get(ancestors
-									.size() - 3)).getNodeName())
-							|| //
-							IHTMLConstants.TAG_TD
-									.equalsIgnoreCase(((Node) ancestors
-											.get(ancestors.size() - 3))
-											.getNodeName())) {
-						return true;
-					} else if (ancestors.size() >= 4 //
-							&& (IHTMLConstants.TAG_TH
-									.equalsIgnoreCase(((Node) ancestors
-											.get(ancestors.size() - 4))
-											.getNodeName()) || //
-							IHTMLConstants.TAG_TD
-									.equalsIgnoreCase(((Node) ancestors
-											.get(ancestors.size() - 4))
-											.getNodeName()))) {
-						return true;
-					}
-				}
-			}
-			return false;
-		}
-		return super.isEditable(target);
-	}
-
-	private boolean checkValidTrTd(List ancestors, Node node) {
-		int offset = ancestors.size();
-		if (IHTMLConstants.TAG_TR.equalsIgnoreCase(((Node) ancestors
-				.get(offset - 1)).getLocalName())) {
-			if (ancestors.get(offset - 1) == node) {
-				return true;
-			} else if (IHTMLConstants.TAG_TH.equalsIgnoreCase(((Node) ancestors
-					.get(offset - 2)).getLocalName())
-					|| //
-					IHTMLConstants.TAG_TD.equalsIgnoreCase(((Node) ancestors
-							.get(offset - 2)).getLocalName())) {
-				return true;
-			}
-		}
-		return false;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IMovementMediator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IMovementMediator.java
deleted file mode 100644
index 8c1fccd..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IMovementMediator.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import org.eclipse.gef.EditPart;
-
-/**
- * @author mengbo
- */
-public interface IMovementMediator extends IPositionMediator {
-	/**
-	 * @param target
-	 * @return true if mediator allows movment in
-	 */
-	public boolean allowsMoveIn(Target target);
-
-	/**
-	 * @param target
-	 * @return true if mediator allows movement out
-	 */
-	public boolean allowsMoveOut(Target target);
-
-	/**
-	 * Return a closest parent part which is editable, and it can't moveout.
-	 * 
-	 * @param target
-	 * @return if taget part is editable, then returns itself.
-	 */
-	public EditPart getConstainedEditableContainer(Target target);
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IMovementRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IMovementRule.java
deleted file mode 100644
index 90377a8..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IMovementRule.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-/**
- * @author mengbo
- */
-public interface IMovementRule extends IValidationRule {
-	/**
-	 * @param target
-	 * @return true if allows move in
-	 */
-	public boolean allowsMoveIn(Target target);
-
-	/**
-	 * @param target
-	 * @return true allows move out
-	 */
-	public boolean allowsMoveOut(Target target);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IPositionMediator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IPositionMediator.java
deleted file mode 100644
index 235a164..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IPositionMediator.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-
-/**
- * @author mengbo
- */
-public interface IPositionMediator {
-	/**
-	 * @return this mediator's action data
-	 */
-	public ActionData getActionData();
-
-	/**
-	 * To see if the node itself or its descendent is editable.
-	 * 
-	 * @param target
-	 * @return true if the target has editable area
-	 */
-	public boolean hasEditableArea(Target target);
-
-	/**
-	 * To see if the position is valid.
-	 * 
-	 * @param position
-	 * @return true if position is  valid
-	 */
-	public boolean isValidPosition(IDOMPosition position);
-
-	/**
-	 * @param position
-	 * @return true if position is valid
-	 */
-	public boolean isValidPosition(DesignPosition position);
-
-	/**
-	 * To see if the node is editable.
-	 * 
-	 * @param target
-	 * @return true if target is editable
-	 */
-	public boolean isEditable(Target target);
-
-	/**
-	 * @param target
-	 * @param atRight
-	 * @return true if can reference target
-	 */
-	public boolean canReference(Target target, boolean atRight);
-
-	/**
-	 * Return a node which contains 'node', and it has editable area.
-	 * 
-	 * @param target
-	 * @return if part is editable, then itself is returned, otherwise a parent
-	 *         is returned.
-	 */
-	public EditPart getEditableContainer(Target target);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IPositionRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IPositionRule.java
deleted file mode 100644
index 6088e1e..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IPositionRule.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-
-/**
- * @author mengbo
- */
-public interface IPositionRule extends IValidationRule {
-	/**
-	 * To see if the node is editable. For inline editing, this means whether
-	 * can we input something into the target. For DnD, this means whether can
-	 * we drag and drop something into it.
-	 * 
-	 * @param target
-	 * @return true if target is editable
-	 */
-	public boolean isEditable(Target target);
-
-	/**
-	 * To see if the node itself or its descendent is editable.
-	 * 
-	 * @param target
-	 * @return true if target is editable
-	 */
-	public boolean hasEditableArea(Target target);
-
-	/**
-	 * Whether can we place caret against this part's border. Some container we
-	 * are consider white box, and whitespace may not be suitable for caret
-	 * reference.
-	 * 
-	 * @param target
-	 * @param atRight
-	 *            TODO
-	 * @return true if can reference target
-	 */
-	public boolean canReference(Target target, boolean atRight);
-
-	/**
-	 * To see if the position is valid. Please note, the container is editable
-	 * means there is a child area whithin it is editable, the position may be
-	 * in an inEditable place. So this method is different from hasEditableArea
-	 * and isEditable.
-	 * 
-	 * @param position
-	 * @return true if position is valid
-	 */
-	public boolean isValidPosition(IDOMPosition position);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IValidationRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IValidationRule.java
deleted file mode 100644
index 296d02b..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/IValidationRule.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-/**
- * @author mengbo
- */
-public interface IValidationRule {
-    // TODO: tagging interface?
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/InlineEditingNavigationMediator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/InlineEditingNavigationMediator.java
deleted file mode 100644
index c1c1115..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/InlineEditingNavigationMediator.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import java.util.List;
-
-import org.eclipse.draw2d.Viewport;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.gef.editparts.ScalableRootEditPart;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.parts.DocumentEditPart;
-import org.eclipse.jst.pagedesigner.tools.ExposeHelper;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class InlineEditingNavigationMediator extends
-		InlineEditingPositionMediator implements IMovementMediator {
-
-	/**
-	 * @param actionData
-	 */
-	public InlineEditingNavigationMediator(ActionData actionData) {
-		super(actionData);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.DefaultPositionValidator#initRules(org.eclipse.jst.pagedesigner.caret.ActionData)
-	 */
-	protected void initRules() {
-		super.initRules();
-		this.addRule(new ContainerMoveInAndOutRule(_actionData));
-		this.addRule(new BasicMovementRule(_actionData));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IMovementValidator#allowsMoveIn(org.eclipse.gef.EditPart)
-	 */
-	public boolean allowsMoveIn(Target target) {
-		boolean result = true;
-		List _rules = getRules();
-		for (int i = 0, n = _rules.size(); i < n; i++) {
-			Object rule = _rules.get(i);
-			if (rule instanceof IMovementRule) {
-				result &= ((IMovementRule) rule).allowsMoveIn(target);
-			} else if (rule instanceof IPositionRule) {
-				result &= ((IPositionRule) rule).hasEditableArea(target);
-			}
-			if (!result) {
-				break;
-			}
-		}
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IMovementValidator#allowsMoveOut(org.eclipse.gef.EditPart)
-	 */
-	public boolean allowsMoveOut(Target target) {
-		boolean result = true;
-		List _rules = getRules();
-		for (int i = 0, n = _rules.size(); i < n; i++) {
-			Object rule = _rules.get(i);
-			if (rule instanceof IMovementRule) {
-				result &= ((IMovementRule) rule).allowsMoveOut(target);
-			}
-			if (!result) {
-				break;
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @param target 
-	 * @return ? 
-	 */
-	public EditPart getRootConstainedEditableContainer(Target target) {
-		// if (EditModelQuery.isDocument(target.getNode()))
-		// {
-		// return target.getPart();
-		// }
-		EditPart part = target.getPart();
-		while (part != null) {
-			if (hasEditableArea(target) && !allowsMoveOut(target)) {
-				break;
-			}
-			part = part.getParent();
-			target = new Target(part);
-		}
-		if (part instanceof DocumentEditPart
-				&& RootContainerPositionRule.hasBasicContainers((Document) part
-						.getModel())) {
-			Node node = RootContainerPositionRule
-					.getBasicContainer((Document) part.getModel());
-			part = Target.resolvePart(node);
-		}
-
-		return part;
-	}
-
-	/**
-	 * @see org.eclipse.jst.pagedesigner.validation.caret.IMovementMediator#getConstainedEditableContainer(org.eclipse.jst.pagedesigner.validation.caret.Target)
-	 */
-	public EditPart getConstainedEditableContainer(Target target) {
-		EditPart part = target.getPart();
-		while (part != null) {
-			if (hasEditableArea(target)) {
-				break;
-			}
-			part = part.getParent();
-			target = new Target(part);
-		}
-		if (part instanceof DocumentEditPart
-				&& RootContainerPositionRule.hasBasicContainers((Document) part
-						.getModel())) {
-			Node node = RootContainerPositionRule
-					.getBasicContainer((Document) part.getModel());
-			part = Target.resolvePart(node);
-		}
-		return part;
-	}
-
-	/**
-	 * @param position 
-	 * @param p 
-	 * @param viewer 
-	 * @return the constrained editable container or null if none found for the arguments
-	 * @see org.eclipse.jst.pagedesigner.validation.caret.IMovementMediator#getConstainedEditableContainer(org.eclipse.jst.pagedesigner.validation.caret.Target)
-	 */
-	public EditPart getConstainedEditableContainer(DesignPosition position,
-			Point p, GraphicalViewer viewer) {
-		Rectangle rect = new Rectangle(p.x, p.y, 1, 1);
-		Viewport port = ((IHTMLGraphicalViewer) viewer).getViewport();
-
-		Point viewLocation = port.getViewLocation();
-		Point lastLocation = viewLocation.getCopy();
-		new ExposeHelper((IHTMLGraphicalViewer) viewer).exposeArea(rect);
-		viewLocation = port.getViewLocation();
-		Dimension offset = lastLocation.getDifference(viewLocation);
-
-		p.translate(offset.width, offset.height);
-		EditPart part = viewer.findObjectAt(p);
-		if (part != null && !(part instanceof ScalableRootEditPart)) {
-			while (part != null) {
-				Target target = new Target(part);
-				if (hasEditableArea(target)) {
-					if (allowsMoveIn(target)
-							|| EditModelQuery.isChild(target.getNode(),
-									position.getContainerNode())) {
-						break;
-					}
-				}
-				part = part.getParent();
-			}
-			if (part instanceof DocumentEditPart
-					&& RootContainerPositionRule
-							.hasBasicContainers((Document) part.getModel())) {
-				Node node = RootContainerPositionRule
-						.getBasicContainer((Document) part.getModel());
-				part = Target.resolvePart(node);
-			}
-			return part;
-		}
-        return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/InlineEditingPositionMediator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/InlineEditingPositionMediator.java
deleted file mode 100644
index 5329586..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/InlineEditingPositionMediator.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-/**
- * This validtor is used for inline editing, caret positioning with mouse.
- * 
- * @author mengbo
- */
-public class InlineEditingPositionMediator extends DefaultPositionValidator {
-
-	/**
-	 * @param actionData
-	 */
-	public InlineEditingPositionMediator(ActionData actionData) {
-		super(actionData);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.DefaultPositionValidator#initRules()
-	 */
-	protected void initRules() {
-		super.initRules();
-		addRule(new IEPanelgridPositionRule(_actionData));
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/JSFRootContainerPositionRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/JSFRootContainerPositionRule.java
deleted file mode 100644
index c4e08ea..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/JSFRootContainerPositionRule.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import java.util.Arrays;
-
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.ITLDConstants;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-/**
- * Ensure the DnD of jsf component should be within f:view or f:subview.
- * 
- * @author mengbo
- */
-public class JSFRootContainerPositionRule extends DefaultPositionRule {
-    
-    private final static int  DEFAULT_MAX_DEPTH_SEARCH = 3;
-    
-	/**
-	 * TODO: this is not enough because it ignores the uri and keys on only
-	 * the name of the tag.
-	 */
-	/*package*/ static final String[] JSF_ROOT_CONTAINERS = { "view", "subview" };
-
-	/**
-	 * @param actionData
-	 */
-	public JSFRootContainerPositionRule(ActionData actionData) {
-		super(actionData);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.validation.caret.IPositionRule#hasEditableArea(org.eclipse.jst.pagedesigner.validation.caret.Target)
-	 */
-	public boolean hasEditableArea(Target target) {
-		Node node = target.getNode();
-		if (hasBasicContainers(EditModelQuery.getDocumentNode(node),DEFAULT_MAX_DEPTH_SEARCH)) {
-            ActionData actionData = getActionData();
-			if (actionData instanceof DropActionData) {
-                DropActionData dropActionData = (DropActionData) actionData;
-                TagIdentifier tagId = 
-                     (TagIdentifier) dropActionData.getDropData().getTagIdentifiers().get(0);
-                final String uri  = tagId.getUri();
-				if (ITLDConstants.URI_JSF_HTML.equalsIgnoreCase(uri)
-						|| ITLDConstants.URI_JSF_CORE.equalsIgnoreCase(uri)) {
-					boolean result = EditModelQuery.isChild(
-							JSF_ROOT_CONTAINERS, node, true, false);
-					return result
-							|| EditModelQuery.getChild(node,
-									JSF_ROOT_CONTAINERS, 3, false) != null;
-				}
-			} else if (getActionData().getActionType() == ActionData.DATABINDING_DND) {
-				boolean result = EditModelQuery.isChild(JSF_ROOT_CONTAINERS,
-						node, true, false);
-				return result
-						|| EditModelQuery.getChild(node, JSF_ROOT_CONTAINERS, 3,
-								false) != null;
-			}
-		}
-		return super.isEditable(target);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.validation.caret.IPositionRule#isEditable(org.eclipse.jst.pagedesigner.validation.caret.Target)
-	 */
-	public boolean isEditable(Target target) {
-		boolean result = true;
-		Node node = target.getNode();
-		if (hasBasicContainers(EditModelQuery.getDocumentNode(node), DEFAULT_MAX_DEPTH_SEARCH)) {
-            ActionData actionData = getActionData();
-            if (actionData instanceof DropActionData) {
-                DropActionData dropActionData = (DropActionData) actionData;
-                TagIdentifier tagId = 
-                     (TagIdentifier) dropActionData.getDropData().getTagIdentifiers().get(0);
-                final String uri  = tagId.getUri();
-
-				if (ITLDConstants.URI_JSF_HTML.equalsIgnoreCase(uri)
-						|| ITLDConstants.URI_JSF_CORE.equalsIgnoreCase(uri)) {
-					result = EditModelQuery.isChild(JSF_ROOT_CONTAINERS,
-							node, true, false);
-				}
-			} else if (getActionData().getActionType() == ActionData.DATABINDING_DND) {
-				result = EditModelQuery.isChild(JSF_ROOT_CONTAINERS, node,
-						true, false);
-			}
-			return result;
-		}
-		return super.isEditable(target);
-	}
-
-
-	/**
-	 * @param document
-	 * @param maxDepth 
-	 * @return the closest tag called "view" or "subview" to the root of document
-	 * search to a maximum tag depth of maxDepth
-	 */
-	public static Node getBasicContainer(Document document, int maxDepth) {
-		Node node = EditModelQuery.getChild(document, JSF_ROOT_CONTAINERS, maxDepth,
-				false);
-		return node;
-	}
-
-	/**
-	 * We need to see if body, view are there. and they should be at first or
-	 * second level.
-	 * 
-	 * @param document
-	 * @param maxDepth 
-	 * @return true if document has a view and subview limited to a maximum search
-	 * depth of maxDepth
-	 */
-	public static boolean hasBasicContainers(Document document, int maxDepth) {
-		return getBasicContainer(document, maxDepth) != null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.validation.caret.IPositionRule#canReference(org.eclipse.jst.pagedesigner.validation.caret.Target,
-	 *      boolean)
-	 */
-	public boolean canReference(Target target, boolean atRight) {
-		Node node = target.getNode();
-		if (node.getLocalName() != null) {
-            // if the local name of the target is in the list of JSF root
-            // containers
-			if (Arrays.asList(JSF_ROOT_CONTAINERS).contains(
-					node.getLocalName().toLowerCase())) {
-                
-                // verify that either the target is 
-				return EditModelQuery.isChild(
-						RootContainerPositionRule.HTML_ROOT_CONTAINERS, node,
-						false, false)
-						|| EditModelQuery.isChild(JSF_ROOT_CONTAINERS, node,
-								false, false);
-			}
-		}
-		return super.canReference(target, atRight);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/NodeConstructionPositionRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/NodeConstructionPositionRule.java
deleted file mode 100644
index 54b389f..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/NodeConstructionPositionRule.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-/**
- * @author mengbo
- */
-public class NodeConstructionPositionRule extends DefaultPositionRule {
-
-	/**
-	 * @param actionData 
-	 */
-	public NodeConstructionPositionRule(ActionData actionData) {
-		super(actionData);
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/RootContainerPositionRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/RootContainerPositionRule.java
deleted file mode 100644
index 9d41be7..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/RootContainerPositionRule.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.validation.caret;
-
-import java.util.Arrays;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-
-/**
- * This rule deal with containers 'body', 'view', 'subview'.
- * 
- * @author mengbo
- */
-public class RootContainerPositionRule extends DefaultPositionRule {
-	static final String[] HTML_ROOT_CONTAINERS = { "body" };
-
-	/**
-	 * @param actionData
-	 */
-	public RootContainerPositionRule(ActionData actionData) {
-		super(actionData);
-	}
-
-	/**
-	 * 1. If anyone of the three containers exists, the target should be in the
-	 * container. 2. If none of the containers exists, then target will be not
-	 * restricted.
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.validation.caret.IPositionRule#hasEditableArea(org.eclipse.jst.pagedesigner.validation.caret.Target)
-	 */
-	public boolean hasEditableArea(Target target) {
-		EditPart part = target.getPart();
-		if (part == null) {
-			return false;
-		}
-		Node node = target.getNode();
-		if (hasBasicContainers(EditModelQuery.getDocumentNode(node))) {
-			return true;// isWithinkBasicContainer(node);
-		}
-		return super.hasEditableArea(target);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IPositionRule#isEditable(org.eclipse.gef.EditPart)
-	 */
-	public boolean isEditable(Target target) {
-		Node node = target.getNode();
-		if (hasBasicContainers(EditModelQuery.getDocumentNode(node))) {
-			boolean result = isWithinkBasicContainer(node);
-			return result;
-		}
-		return super.isEditable(target);
-	}
-
-	/**
-	 * We need to see if body, view are there. and they should be at first or
-	 * second level.
-	 * 
-	 * @param document
-	 * @return true if the document has basic containers
-	 */
-	public static boolean hasBasicContainers(Document document) {
-		return getBasicContainer(document) != null;
-
-	}
-
-	private static boolean isWithinkBasicContainer(Node node) {
-		return EditModelQuery.isChild(HTML_ROOT_CONTAINERS, node, true, false);
-	}
-
-	/**
-	 * @param document
-	 * @return the basic root container for the document or null
-	 */
-	public static Node getBasicContainer(Document document) {
-		Node node = EditModelQuery.getChild(document, HTML_ROOT_CONTAINERS, 2,
-				false);
-		if (node == null) {
-			node = EditModelQuery.getChild(document, HTML_ROOT_CONTAINERS, 2,
-					true);
-		}
-		return node;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.validation.caret.IPositionRule#canReference(org.eclipse.jst.pagedesigner.validation.caret.Target,
-	 *      boolean)
-	 */
-	public boolean canReference(Target target, boolean atRight) {
-		Node node = target.getNode();
-		if (node.getLocalName() != null) {
-			if (Arrays.asList(HTML_ROOT_CONTAINERS).contains(
-					node.getLocalName().toLowerCase())) {
-				return EditModelQuery.isChild(
-						JSFRootContainerPositionRule.JSF_ROOT_CONTAINERS, node,
-						false, false);
-			}
-		}
-		return true;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/Target.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/Target.java
deleted file mode 100644
index d680ec9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/Target.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.jsf.common.dom.TagIdentifier;
-import org.eclipse.jst.jsf.core.internal.tld.TagIdentifierFactory;
-import org.eclipse.jst.pagedesigner.converter.ITagConverter;
-import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class Target {
-	private EditPart _part;
-
-	private Node _node;
-
-	/**
-	 * @param part
-	 */
-	public Target(EditPart part) {
-		_part = part;
-        
-        if(part.getModel() instanceof Node)
-        {
-            _node = (Node) part.getModel();        
-        }
-        else if (part.getModel() instanceof ITagConverter)
-        {
-            _node = ((ITagConverter)part.getModel()).getHostElement();
-        }
-        else
-        {
-            Assert.isTrue(false);
-        }
-	}
-
-	/**
-	 * @param node
-	 */
-	public Target(Node node) {
-		_node = node;
-		Assert.isTrue(node instanceof INodeNotifier);
-		if (((INodeNotifier) node).getAdapterFor(EditPart.class) != null) {
-			_part = (EditPart) ((INodeNotifier) node)
-					.getAdapterFor(EditPart.class);
-		}
-	}
-
-	/**
-	 * @return Returns the _node.
-	 */
-	public Node getNode() {
-		return _node;
-	}
-
-	/**
-	 * @return Returns the _part.
-	 */
-	public EditPart getPart() {
-		return _part;
-	}
-
-    /**
-     * @return the target's tag wrapper or null if the target
-     * is not an Element node
-     */
-    public TagIdentifier getTagWrapper()
-    {
-        if (_node instanceof Element)
-        {
-            return TagIdentifierFactory.createDocumentTagWrapper((Element)_node);
-        }
-        
-        return null;
-    }
-    
-	/**
-	 * @param node
-	 * @return the edit part for node or null if none found
-	 */
-	public static EditPart resolvePart(Node node) {
-		if (node instanceof INodeNotifier
-				&& ((INodeNotifier) node).getAdapterFor(EditPart.class) != null) {
-			return (EditPart) ((INodeNotifier) node)
-					.getAdapterFor(EditPart.class);
-		}
-		return null;
-	}
-
-	/**
-	 * @param part
-	 * @return the node for part
-	 */
-	public static Node resolveNode(EditPart part) {
-		return (Node) part.getModel();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/WhitespacePositionMoveRule.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/WhitespacePositionMoveRule.java
deleted file mode 100644
index 79e87c5..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/WhitespacePositionMoveRule.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.validation.caret;
-
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.DesignRefPosition;
-import org.eclipse.jst.pagedesigner.viewer.EditPartPositionHelper;
-import org.w3c.dom.Text;
-
-/**
- * For whitespaces 1. If there is sibling can be reference, then we don't
- * reference whitespace text. 2. Position can't be between whitespace text.
- * 
- * @author mengbo
- */
-public class WhitespacePositionMoveRule extends DefaultPositionRule implements
-		IMovementRule {
-
-	/**
-	 * @param actionData
-	 */
-	public WhitespacePositionMoveRule(ActionData actionData) {
-		super(actionData);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IMovementRule#canEnter(org.eclipse.gef.EditPart)
-	 */
-	public boolean allowsMoveIn(Target target) {
-		if (EditModelQuery.isTransparentText(target.getNode())) {
-			return false;
-		}
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IMovementRule#canMoveOut(org.eclipse.gef.EditPart)
-	 */
-	public boolean allowsMoveOut(Target target) {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IPositionRule#canReference(org.eclipse.jst.pagedesigner.caret.Target)
-	 */
-	public boolean canReference(Target target, boolean atRight) {
-		boolean result = super.canReference(target, atRight);
-		if (EditModelQuery.isText(target.getNode())) {
-			if (((Text) target.getNode()).getData().length() == 0) {
-				result = false;
-			} else if (EditModelQuery.isTransparentText(target.getNode())) {
-				DesignPosition position = new DesignRefPosition(target
-						.getPart(), atRight);
-				if (EditPartPositionHelper.getConcretePart(position, atRight) != null) {
-					result = true;
-				} else {
-					EditPart part = EditPartPositionHelper.getNextConcretPart(
-							position, atRight);
-					EditPart oppPart = EditPartPositionHelper
-							.getNextConcretPart(position, !atRight);
-					if (part == null) {
-						if (oppPart == null) {
-							result = true;
-						}
-					}
-					result = false;
-				}
-			}
-		}
-		return result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IPositionRule#hasEditableArea(org.eclipse.jst.pagedesigner.caret.Target)
-	 */
-	public boolean hasEditableArea(Target target) {
-		if (EditModelQuery.isTransparentText(target.getNode())) {
-			return false;
-		}
-		return super.hasEditableArea(target);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.caret.IPositionRule#isEditable(org.eclipse.jst.pagedesigner.caret.Target)
-	 */
-	public boolean isEditable(Target target) {
-		if (EditModelQuery.isTransparentText(target.getNode())) {
-			return false;
-		}
-		return super.isEditable(target);
-	}
-
-	// /*
-	// * (non-Javadoc)
-	// *
-	// * @see
-	// org.eclipse.jst.pagedesigner.caret.IPositionRule#isValidPosition(org.eclipse.jst.pagedesigner.dom.IDOMPosition)
-	// */
-	// public boolean isValidPosition(IDOMPosition position)
-	// {
-	// Node node = null;
-	// if (position instanceof DOMRefPosition)
-	// {
-	// node = ((DOMRefPosition)position).getReferenceNode();
-	// } else if (position.isText())
-	// {
-	// node = position.getContainerNode();
-	// } else {
-	// return super.isValidPosition(position);
-	// }
-	// if (EditModelQuery.isTransparentText(position.getContainerNode()))
-	// {
-	// if (node.getPreviousSibling() != null)
-	// {
-	// node = node.getPreviousSibling();
-	// return _mediator.canReference(new Target(node), true);
-	// }
-	// else if (node.getNextSibling() != null)
-	// {
-	// node = node.getNextSibling();
-	// return _mediator.canReference(new Target(node), false);
-	// }
-	// }
-	// return super.isValidPosition(position);
-	// }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/AbstractDropLocationStrategy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/AbstractDropLocationStrategy.java
deleted file mode 100644
index 6dbeb64..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/AbstractDropLocationStrategy.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.LayerConstants;
-import org.eclipse.gef.editparts.LayerManager;
-import org.eclipse.gef.requests.DropRequest;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-
-/**
- * Abstract parent of all concrete client implmentation of IDropLocationStrategy's
- * Clients should sub-class instead of implementing {@link IDropLocationStrategy} directly
- * to avoid future API breakage
- * 
- * @author cbateman
- *
- */
-public abstract class AbstractDropLocationStrategy  implements IDropLocationStrategy 
-{
-    private final EditPartViewer        _viewer;
-    
-    /**
-     * @param viewer
-     */
-    public AbstractDropLocationStrategy(EditPartViewer viewer)
-    {
-        _viewer = viewer;
-    }
-    
-    public abstract DesignPosition calculateDesignPosition(EditPart host, Point p,
-            IPositionMediator validator);
-
-    public abstract List showTargetFeedback(EditPart host, DesignPosition position, DropRequest request);
-
-    /**
-     * @return the viewer in which this strategy may show target feedback
-     */
-    protected final EditPartViewer getViewer() 
-    {
-        return _viewer;
-    }
-    
-    /**
-     * @return the figure for the feedback layer
-     */
-    protected final IFigure getFeedbackLayer()
-    {
-        return LayerManager.Helper.find(_viewer.getRootEditPart().getContents()).getLayer(LayerConstants.FEEDBACK_LAYER);
-    }
-    
-    /**
-     * Adds the specified <code>Figure</code> to the {@link LayerConstants#FEEDBACK_LAYER}.
-     * @param figure the feedback to add
-     */
-    protected void addFeedback(IFigure figure) {
-        getFeedbackLayer().add(figure);
-    }
-    
-    /**
-     * Removes the specified <code>Figure</code> to the {@link LayerConstants#FEEDBACK_LAYER}.
-     * @param figure the feedback to remove
-     */
-    protected void removeFeedback(IFigure figure) {
-        getFeedbackLayer().remove(figure);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/CaretPositionResolver.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/CaretPositionResolver.java
deleted file mode 100644
index 27aae69..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/CaretPositionResolver.java
+++ /dev/null
@@ -1,328 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import java.util.List;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.validation.caret.IMovementMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.Target;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- * @version 1.5
- */
-public class CaretPositionResolver {
-	private IPositionMediator _validator;
-
-	private Point _point;
-
-	private static CaretPositionResolver _instance;
-
-	/**
-	 * @param validator
-	 * @param point
-	 * @return the singleton instance
-	 */
-	public static CaretPositionResolver getInstance(
-			IPositionMediator validator, Point point) {
-		if (_instance == null) {
-			_instance = new CaretPositionResolver();
-		}
-		_instance.setPoint(point);
-		_instance.setValidator(validator);
-		return _instance;
-	}
-
-	/**
-	 * @param _point
-	 *            The _point to set.
-	 */
-	private void setPoint(Point _point) {
-		this._point = _point;
-	}
-
-	/**
-	 * @param _validator
-	 *            The _validator to set.
-	 */
-	private void setValidator(IPositionMediator _validator) {
-		this._validator = _validator;
-	}
-
-	/**
-	 * Calculate the two part's distance to point, the shorter one will be
-	 * return. Distance is calculated based on: if there is one box contains
-	 * point.y, then calculate that box, or if there is no any such one box,
-	 * then calculate the y distance.
-	 * 
-	 * @param part1
-	 * @param part2
-	 * @param point
-	 * @return
-	 */
-	static LayoutPart getCloserPart(LayoutPart part1, LayoutPart part2,
-			Point _point) {
-		if (part1 == null
-				|| EditModelQuery.isTransparentText(Target.resolveNode(part1
-						.getPart()))) {
-			return part2;
-		} else if (part2 == null
-				|| EditModelQuery.isTransparentText(Target.resolveNode(part2
-						.getPart()))) {
-			return part1;
-		}
-		Rectangle rect1 = part1.getAbsoluteBounds();
-		Rectangle rect2 = part2.getAbsoluteBounds();
-		Node n1 = Target.resolveNode(part1.getPart());
-		Node n2 = Target.resolveNode(part2.getPart());
-		// Within same.
-		if (EditModelQuery.isChild(n1, n2)
-				&& (CaretPositionResolver.getXDistance(rect2, _point) == 0)
-				&& !part1.isCloseToEdgeFromOutSide()) {
-			return part2;
-		} else if (EditModelQuery.isChild(n2, n1)
-				&& (CaretPositionResolver.getXDistance(rect1, _point) == 0 && !part2
-						.isCloseToEdgeFromOutSide())
-				&& !part2.isCloseToEdgeFromOutSide()) {
-			return part1;
-		}
-		if (rect1.intersect(new Rectangle(rect1.x, rect2.y, rect1.width,
-				rect2.height)).height == 0) {
-			return heightFirst(part1, part2, _point);
-		}
-        return widthFirst(part1, part2, _point);
-	}
-
-	private static LayoutPart heightFirst(LayoutPart part1, LayoutPart part2,
-			Point _point) {
-		Rectangle rect1 = part1.getAbsoluteBounds();
-		Rectangle rect2 = part2.getAbsoluteBounds();
-		int offset1 = Math.abs(CaretPositionResolver
-				.getYDistance(rect1, _point));
-		int offset2 = Math.abs(CaretPositionResolver
-				.getYDistance(rect2, _point));
-		if (offset1 > offset2) {
-			return part2;
-		} else if (offset1 < offset2) {
-			return part1;
-		} else {
-			offset1 = Math.abs(CaretPositionResolver
-					.getXDistance(rect1, _point));
-			offset2 = Math.abs(CaretPositionResolver
-					.getXDistance(rect2, _point));
-			if (offset1 >= offset2) {
-				return part2;
-			}
-            return part1;
-		}
-	}
-
-	private static LayoutPart widthFirst(LayoutPart part1, LayoutPart part2,
-			Point _point) {
-		Rectangle rect1 = part1.getAbsoluteBounds();
-		Rectangle rect2 = part2.getAbsoluteBounds();
-		int offset1 = Math.abs(CaretPositionResolver
-				.getXDistance(rect1, _point));
-		int offset2 = Math.abs(CaretPositionResolver
-				.getXDistance(rect2, _point));
-		if (offset1 > offset2) {
-			return part2;
-		} else if (offset1 < offset2) {
-			return part1;
-		} else {
-			offset1 = Math.abs(CaretPositionResolver
-					.getYDistance(rect1, _point));
-			offset2 = Math.abs(CaretPositionResolver
-					.getYDistance(rect2, _point));
-			if (offset1 >= offset2) {
-				return part2;
-			}
-            return part1;
-		}
-	}
-
-	/**
-	 * Return a descendent part under parent that is one of the closest part to
-	 * point.
-	 * 
-	 * @param parent
-	 * @return
-	 */
-	private LayoutPart getClosestChildPart(LayoutPart parent) {
-		LayoutPart result = null;
-		if (parent != null) {
-			List children = null;
-			if ((children = parent.getPart().getChildren()).size() > 0) // &&
-			// _validator.hasEditableArea(new
-			// Target(parent.getPart())))
-			{
-				// iterate its children, we know the part doesn't contain p. so
-				// we only see if its children can be
-				// referenced.
-				for (int i = 0, n = children.size(); i < n; i++) {
-					LayoutPart nextPart = new LayoutPart((EditPart) children
-							.get(i), _point);
-					Target target = new Target(nextPart.getPart());
-					if (_validator.isValidPosition(new DesignRefPosition(target
-							.getPart(), false))) {
-						result = getCloserPart(result, nextPart, _point);
-					} else if (_validator.hasEditableArea(target)) {
-						LayoutPart temp = getClosestChildPart(nextPart);
-						if (temp == null) {
-							temp = nextPart;
-						}
-						result = getCloserPart(result, temp, _point);
-					}
-				}
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Use by vertical movement, we need to see whther the par
-	 * 
-	 * @param closestPart
-	 * @param target
-	 * @return
-	 */
-	LayoutPart resolveClosestPartFrom(LayoutPart closestPart) {
-		Target target = new Target(closestPart.getPart());
-		LayoutPart finalPart = null;
-		if (EditModelQuery.isInline(Target.resolveNode(closestPart.getPart()))) {
-
-			if (closestPart.isAfterPoint() || closestPart.isBeforePoint()) {
-				finalPart = closestPart;
-			} else {
-				if (_validator.hasEditableArea(target)
-						&& (_validator instanceof IMovementMediator
-								&& ((IMovementMediator) _validator)
-										.allowsMoveIn(target) || !(_validator instanceof IMovementMediator))) {
-					finalPart = getClosestChildPartOrPart(closestPart);
-				}
-			}
-		}
-		// block
-		else {
-			if (closestPart.contains(_point)) {
-				if (_validator.hasEditableArea(target) && //
-						(_validator instanceof IMovementMediator
-								&& ((IMovementMediator) _validator)
-										.allowsMoveIn(target) || !(_validator instanceof IMovementMediator))) {
-					finalPart = getClosestChildPartOrPart(closestPart);
-				}
-			}
-			// outside of bounds
-			else {
-				if (_validator.hasEditableArea(target)
-						&& !IHTMLConstants.TAG_TABLE.equalsIgnoreCase(target
-								.getNode().getNodeName())
-						&& (_validator instanceof IMovementMediator
-								&& ((IMovementMediator) _validator)
-										.allowsMoveIn(target) || !(_validator instanceof IMovementMediator))) {
-					if (closestPart.atSameRow(_point)) {
-						finalPart = getClosestChildPartOrPart(closestPart);
-					} else if (!_validator
-							.isValidPosition(new DesignRefPosition(target
-									.getPart(), true))) {
-						finalPart = getClosestChildPartOrPart(closestPart);
-					}
-				}
-			}
-		}
-		if (finalPart == null && //
-				(_validator.isValidPosition(new DesignRefPosition(target
-						.getPart(), true)) || // 
-				_validator.isValidPosition(new DesignRefPosition(target
-						.getPart(), false)))) {
-			finalPart = closestPart;
-		}
-		return finalPart;
-	}
-
-	private LayoutPart getClosestChildPartOrPart(LayoutPart closestPart) {
-		LayoutPart result = getClosestChildPart(closestPart);
-		if (result != null) {
-			result = resolveClosestPartFrom(result);
-		} else {
-			if (closestPart.getConcretePart() == null) {
-				result = closestPart;
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * Get the distance from rect's edge to point.x.
-	 * 
-	 * @param rect
-	 * @param point
-	 * @return the X distance
-	 */
-	public static int getXDistance(Rectangle rect, Point point) {
-		if (rect.getRight().x <= point.x) {
-			return point.x - (rect.getRight().x);
-		} else if (rect.x >= point.x) {
-			return point.x - rect.x;
-		} else if (rect.x <= point.x && point.x <= rect.getRight().x) {
-			return 0;
-		}
-		return -1;
-	}
-
-	/**
-	 * from point to middle's distance. If the result is nagative, point is at
-	 * left part of rect, if it is positive, the point is at the right part.
-	 * 
-	 * @param rect
-	 * @param point
-	 * @return the X distance
-	 */
-	public static int toXMiddle(Rectangle rect, Point point) {
-		return (point.x - (rect.x + rect.getRight().x) / 2);
-	}
-
-	/**
-	 * from point to middle's distance If the result is nagative, point is at
-	 * upper part of rect, if it is positive, the point is at the lower part.
-	 * 
-	 * @param rect
-	 * @param point
-	 * @return the Y distance
-	 */
-	public static int toYMiddle(Rectangle rect, Point point) {
-		return (point.y - (rect.y + rect.getBottom().y) / 2);
-	}
-
-	/**
-	 * @param rect
-	 * @param point
-	 * @return the Y distance
-	 */
-	public static int getYDistance(Rectangle rect, Point point) {
-		if (rect.y + rect.height <= point.y) {
-			return point.y - (rect.y + rect.height);
-		} else if (rect.y >= point.y) {
-			return point.y - rect.y;
-		} else if (rect.y <= point.y && point.y <= rect.y + rect.height) {
-			return 0;
-		}
-		return -1;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/CaretUpdater.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/CaretUpdater.java
deleted file mode 100644
index dde0d69..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/CaretUpdater.java
+++ /dev/null
@@ -1,241 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-
-import org.eclipse.draw2d.FigureListener;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.RangeModel;
-import org.eclipse.draw2d.Viewport;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
-import org.eclipse.jst.pagedesigner.tools.ExposeHelper;
-import org.eclipse.swt.widgets.Caret;
-
-/**
- * This class is responsible for update the caret location. At least the
- * following changes may result in caret location change. <ll>
- * <li>The selection mode change. For example, from/to text mode to/from object
- * mode, we need to hide/display the caret
- * <li>The caret location change in the model.
- * <li>the figures moved. This may result in model change in somewhere else, or
- * user resized the page designer.
- * <li>The figure that containing the caret get recreated. </ll>
- * 
- * @author mengbo
- */
-/*package*/ class CaretUpdater implements IHTMLGraphicalViewerListener,
-		FigureListener {
-//	private static final Logger _log = PDPlugin.getLogger(CaretUpdater.class);
-
-	private IHTMLGraphicalViewer _viewer;
-
-	private boolean _viewerBatchChanging = false;
-
-	/**
-	 * the width value of the caret in pixels
-	 */
-	public static final int CARET_WIDTH = 2;
-
-	/**
-	 * the figure the caret associate to, we need to track this figure's
-	 * resizing, location change, etc.
-	 */
-	private IFigure _trackFigure;
-
-	/**
-	 * @param viewer
-	 */
-	public CaretUpdater(IHTMLGraphicalViewer viewer) {
-		_viewer = viewer;
-		setup();
-	}
-
-	/**
-	 * set up the
-	 */
-	public void setup() {
-		_viewer.addHTMLViewerListener(this);
-	}
-
-	/**
-	 * this method is called after the view is fully initialized.
-	 */
-	public void connectViewer() {
-		Viewport viewport = _viewer.getViewport();
-		if (viewport != null) {
-			viewport.getHorizontalRangeModel().addPropertyChangeListener(
-					new PropertyChangeListener() {
-						public void propertyChange(
-								PropertyChangeEvent propertychangeevent) {
-							if ((propertychangeevent.getSource() instanceof RangeModel)
-									&& (propertychangeevent.getPropertyName()
-											.equals(ICSSPropertyID.ATTR_VALUE) || propertychangeevent
-											.getPropertyName().equals("extent")))
-								updateCaret();
-						}
-
-					});
-			viewport.getVerticalRangeModel().addPropertyChangeListener(
-					new PropertyChangeListener() {
-
-						public void propertyChange(
-								PropertyChangeEvent propertychangeevent) {
-							if ((propertychangeevent.getSource() instanceof RangeModel)
-									&& (propertychangeevent.getPropertyName()
-											.equals(ICSSPropertyID.ATTR_VALUE) || propertychangeevent
-											.getPropertyName().equals("extent")))
-								updateCaret();
-						}
-
-					});
-		}
-	}
-
-	/**
-	 * dispose the instance
-	 */
-	public void dispose() {
-		_viewer.removeHTMLViewerListener(this);
-	}
-
-	/**
-	 * Update the selection
-	 */
-	public void updateSelection() {
-		setCaretVisible(false);
-		updateRangeSelection();
-		updateCaret();
-		reveal();
-	}
-
-	private void setCaretVisible(boolean visible) {
-		Caret caret = _viewer.getCaret();
-		if (caret == null)
-			return;
-		if (caret.isDisposed()) {
-			return;
-		}
-		caret.setVisible(visible);
-	}
-
-	/**
-	 * 
-	 */
-	private void updateRangeSelection() {
-		// FIXME: optimization needed here. Normally should not repaint the
-		// whole page.
-		((GraphicalEditPart) _viewer.getRootEditPart()).getFigure().repaint();
-		((GraphicalEditPart) _viewer.getRootEditPart()).getFigure()
-				.getUpdateManager().performUpdate();
-	}
-
-	/**
-	 * update the caret
-	 */
-	public void updateCaret() {
-		if (_trackFigure != null) {
-			_trackFigure.removeFigureListener(this);
-			_trackFigure = null;
-		}
-		Caret caret = _viewer.getCaret();
-		if (caret == null) {
-			return;
-		}
-		if (caret.isDisposed()) {
-			return;
-		}
-
-		Rectangle rect = null;
-
-		// try get the caret bounds.
-		if (_viewer.isInRangeMode()) {
-			DesignRange range = _viewer.getRangeSelection();
-			if (range != null) {
-				DesignPosition endPosition = range.getEndPosition();
-				if (endPosition != null && endPosition.isValid()) {
-					rect = EditPartPositionHelper
-							.convertToAbsoluteCaretRect(endPosition);
-					_trackFigure = ((GraphicalEditPart) endPosition
-							.getContainerPart()).getFigure();
-					_trackFigure.addFigureListener(this);
-				}
-			}
-		}
-
-		// set visible effect
-		if (rect == null) {
-			caret.setVisible(false);
-		} else {
-			caret.setVisible(false); // make sure it get removed from the
-			// screen.
-			// the caret width doesn't need to be calculated, the x pos should
-			// be adjusted more acurately.
-			caret.setBounds(rect.x, rect.y, CARET_WIDTH, rect.height);
-			caret.setVisible(true);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		if (_viewerBatchChanging) {
-			return;
-		}
-		updateSelection();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewerListener#selectionAboutToChange()
-	 */
-	public void selectionAboutToChange() {
-		_viewerBatchChanging = true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewerListener#selectionChangeFinished()
-	 */
-	public void selectionChangeFinished() {
-		_viewerBatchChanging = false;
-		updateSelection();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.draw2d.FigureListener#figureMoved(org.eclipse.draw2d.IFigure)
-	 */
-	public void figureMoved(IFigure source) {
-		updateCaret();
-	}
-
-	private void reveal() {
-		Caret caret = _viewer.getCaret();
-		if (caret != null && !caret.isDisposed() && _viewer.isInRangeMode()) {
-			org.eclipse.swt.graphics.Rectangle rect = caret.getBounds();
-			ExposeHelper helper = new ExposeHelper(_viewer);
-			helper.exposeArea(new Rectangle(rect.x, rect.y, rect.width,
-					rect.height));
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DefaultDropLocationStrategy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DefaultDropLocationStrategy.java
deleted file mode 100644
index 38f27cf..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DefaultDropLocationStrategy.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.draw2d.ColorConstants;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.LineBorder;
-import org.eclipse.draw2d.RectangleFigure;
-import org.eclipse.draw2d.geometry.Dimension;
-import org.eclipse.draw2d.geometry.Insets;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.EditPartViewer;
-import org.eclipse.gef.requests.DropRequest;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-
-/**
- * A default implementation of the drop location strategy
- * @author cbateman
- *
- */
-public class DefaultDropLocationStrategy extends AbstractDropLocationStrategy 
-{
-    // the amount of vertical offset below the mouse pointer to place
-    // the upper left of the drop hint tooltip
-    private static final int DROP_HINT_VERTICAL_OFFSET = 20;
-
-    /**
-     * @param viewer
-     */
-    public DefaultDropLocationStrategy(EditPartViewer viewer) {
-        super(viewer);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.viewer.AbstractDropLocationStrategy#calculateDesignPosition(org.eclipse.gef.EditPart, org.eclipse.draw2d.geometry.Point, org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator)
-     */
-    @Override
-    public DesignPosition calculateDesignPosition(EditPart host, Point p,
-            IPositionMediator validator) {
-        return EditPartPositionHelper.findEditPartPosition(
-                host, p, validator);
-    }
-
-    /* (non-Javadoc)
-     * @see org.eclipse.jst.pagedesigner.viewer.AbstractDropLocationStrategy#showTargetFeedback(org.eclipse.gef.EditPart, org.eclipse.jst.pagedesigner.viewer.DesignPosition, org.eclipse.gef.requests.DropRequest)
-     */
-    @Override
-    public List showTargetFeedback(EditPart host, DesignPosition position, DropRequest request) 
-    {
-        List feedback = new ArrayList(4);
-        feedback.add(showFeedbackRect(createCaretBounds(position)));
-        feedback.add(showDropHintLabel(request.getLocation(), position));
-        
-        return feedback;
-    }
-
-    
-    
-    /**
-     * @param rect
-     * @return the default rectangle figure for the requested visual rectangle
-     */
-    protected final RectangleFigure showFeedbackRect(Rectangle rect) {
-        RectangleFigure pf = createFeedbackFigure();
-        pf.translateToRelative(rect);
-        pf.setBounds(rect);
-        return pf;
-    }
-    
-    /**
-     * @param position
-     * @return the bounding rectangle for the caret at the current
-     * position in absolute coords
-     */
-    protected Rectangle createCaretBounds(DesignPosition position)
-    {
-        Rectangle rect = EditPartPositionHelper
-            .convertToAbsoluteCaretRect(position);
-
-        // to avoid enlarge feedback pane.
-        rect = rect.intersect(getFeedbackLayer().getBounds());
-        
-        return rect;
-    }
-    
-    /**
-     * @return the newly created feedback figure
-     */
-    protected RectangleFigure createFeedbackFigure() 
-    {
-        RectangleFigure feedbackFigure = new RectangleFigure();
-        feedbackFigure.setFill(true);
-        feedbackFigure.setOutline(true);
-        feedbackFigure.setLineWidth(1);
-        feedbackFigure.setForegroundColor(ColorConstants.red);
-        feedbackFigure.setBounds(new Rectangle(0, 0, 0, 0));
-        feedbackFigure.setXOR(true);
-        addFeedback(feedbackFigure);
-        return feedbackFigure;
-    }
-
-    /**
-     * Shows a label in a position relative to the drop marker
-     * that hints where the new component will be dropped in
-     * respect of components already there
-     * @param mousePosition 
-     * @param position 
-     * @return the drop hint label
-     */
-    protected final Label showDropHintLabel(Point mousePosition, DesignPosition position)
-    {
-        Label    dropHintLabel = new Label();
-        dropHintLabel.setOpaque(true);
-        dropHintLabel.setBackgroundColor(ColorConstants.tooltipBackground);
-        dropHintLabel.setBorder(
-                new LineBorder(ColorConstants.black, 1)
-                {
-                    // add an extra pixel of inset to make sure the text
-                    // isn't pressed against the border
-                    public Insets getInsets(IFigure figure) {
-                        return new Insets(getWidth()+1);
-                    }
-                }
-        );
-        addFeedback(dropHintLabel);
-
-        final String hintText = getDropHintText(position);
-        dropHintLabel.setText(hintText);
-        //TODO: need to handle viewport clipping and adjust label location appropriately
-        Dimension hintSize = dropHintLabel.getPreferredSize();
-        Point hintLocation = new Point(mousePosition.x, mousePosition.y+DROP_HINT_VERTICAL_OFFSET);
-        
-        Rectangle hintRect = new Rectangle(hintLocation, hintSize);
-
-        // we need to intersect the rectangle with the feedback pane, otherwise, when the mouse
-        // is dragged near the edge of the viewport with the drop hint active, the canvas will expand
-        // away from the mouse.  In future a more ideal solution will be to relocate the tooltip
-        // so that is is completely inside the viewport.
-        hintRect = hintRect.intersect(getFeedbackLayer().getBounds());
-        
-        dropHintLabel.translateToRelative(hintRect);
-        dropHintLabel.setBounds(hintRect);
-        
-        return dropHintLabel;
-    }
-    
-    /**
-     * @param position
-     * @return the drop hint text for the current position
-     */
-    protected String getDropHintText(DesignPosition position)
-    {
-        StringBuffer buffer = new StringBuffer("Place");
-        
-        EditPart prevPart = position.getSiblingEditPart(false);
-        EditPart nextPart = position.getSiblingEditPart(true);
-
-        if (nextPart instanceof ElementEditPart)
-        {
-            buffer.append(" before ");
-            buffer.append(((ElementEditPart)nextPart).getTagConvert().getHostElement().getNodeName());
-            buffer.append(",");
-        }
-        
-        if (prevPart instanceof ElementEditPart)
-        {
-            buffer.append(" after ");
-            buffer.append(((ElementEditPart)prevPart).getTagConvert().getHostElement().getNodeName());
-            buffer.append(",");
-        }
-        
-        buffer.append(" inside ");
-        buffer.append(position.getContainerNode().getNodeName());
-        
-        return buffer.toString();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignPosition.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignPosition.java
deleted file mode 100644
index 237c656..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignPosition.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import java.util.List;
-
-import org.eclipse.gef.EditPart;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
-
-/**
- * @author mengbo
- */
-public class DesignPosition {
-	/**
-	 * a singleton that can be used as an invalid position
-	 */
-	public static final DesignPosition INVALID = new DesignPosition(null, -1);
-
-	private EditPart _containerPart;
-
-	int _offset;
-
-	//private Node _containerNode;
-
-	/**
-	 * @param part
-	 * @param offset
-	 */
-	public DesignPosition(EditPart part, int offset) {
-		_containerPart = part;
-		_offset = offset;
-	}
-
-	/**
-	 * if _containerPart is null, means it is invalid
-	 * 
-	 * @return the container edit part
-	 */
-	public EditPart getContainerPart() {
-		return _containerPart;
-	}
-
-	/**
-	 * @return the container node
-	 */
-	public Node getContainerNode() {
-		if (_containerPart != null) {
-			return (Node) _containerPart.getModel();
-		}
-        return null;
-	}
-
-	/**
-	 * if offset < 0, means it is invalid.
-	 * 
-	 * @return the offset
-	 */
-	public int getOffset() {
-		return _offset;
-	}
-
-	/**
-	 * @return true if the design position is valid
-	 */
-	public boolean isValid() {
-		return (_containerPart != null) && (_offset >= 0);
-	}
-
-	/**
-	 * This method should not be called when is text node.
-	 * 
-	 * @param forward
-	 * @return the sibling part one to right in the tree if 
-	 * forward == true, one to the left if forward == false.  May
-	 * return null if position is invalid or there is no valid sibling.
-	 */
-	public EditPart getSiblingEditPart(boolean forward) {
-		if (!isValid()) {
-			return null;
-		}
-
-		int index = forward ? (_offset) : (_offset - 1);
-		List children = _containerPart.getChildren();
-
-		if ((index >= children.size()) || (index < 0)) {
-			return null;
-		}
-
-		return (EditPart) children.get(index);
-	}
-
-	/**
-	 * factory method
-	 * 
-	 * @param part
-	 * @return a design position one before part
-	 */
-	public static DesignPosition createPositionBeforePart(EditPart part) {
-		EditPart parent = part.getParent();
-
-		if (parent == null) {
-			return new DesignPosition(part, 0);
-		}
-        return new DesignPosition(parent, parent.getChildren()
-        		.indexOf(part));
-	}
-
-	/**
-	 * factory method
-	 * 
-	 * @param part
-	 * @return the design position for one after part
-	 */
-	public static DesignPosition createPositionAfterPart(EditPart part) {
-		EditPart parent = part.getParent();
-
-		if (parent == null) {
-			return new DesignPosition(part, part.getChildren().size());
-		}
-        return new DesignPosition(parent, parent.getChildren()
-        		.indexOf(part) + 1);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object obj) {
-	    if (obj == this)
-	    {
-	        return true;
-	    }
-	    
-		if (obj instanceof DesignPosition) {
-			DesignPosition p = (DesignPosition) obj;
-
-			return (p.getContainerPart() == this._containerPart)
-					&& (p.getOffset() == this._offset);
-		}
-
-		return false;
-	}
-
-	
-	@Override
-    public int hashCode() {
-	    return System.identityHashCode(_containerPart) ^ System.identityHashCode(Integer.valueOf(_offset));
-    }
-
-	/**
-	 * @param buffer
-	 * @return the buffer with the debug dump
-	 */
-	public StringBuffer debugDump(StringBuffer buffer) {
-//		try {
-			buffer.append("DesignPosition: ").append(this._containerPart)
-					.append(": ").append(this._offset).append("\n");
-
-			if (this._containerPart.getModel() instanceof Text) {
-				// skip
-			} else {
-				if (this._offset > 0) {
-					buffer.append("after: ").append(
-							this._containerPart.getChildren().get(
-									this._offset - 1)).append("\n");
-				}
-
-				if (this._offset < (this._containerPart.getChildren().size() - 1)) {
-					buffer.append("before: ")
-							.append(
-									this._containerPart.getChildren().get(
-											this._offset)).append("\n");
-				}
-			}
-            //TODO: what was being caught here?
-//		} catch (Exception e) {
-//		}
-
-		return buffer;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-
-		return debugDump(buffer).toString();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignRange.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignRange.java
deleted file mode 100644
index a4a0939..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignRange.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import org.eclipse.jface.viewers.ISelection;
-
-/**
- * @author mengbo
- */
-public class DesignRange implements ISelection 
-{
-    private final DesignPosition _start;
-    private final DesignPosition _end;
-
-	/**
-	 * @param start
-	 * @param end
-	 */
-	public DesignRange(DesignPosition start, DesignPosition end) {
-		_start = start;
-		_end = end;
-	}
-
-	/**
-	 * @return the start position in the range
-	 */
-	public DesignPosition getStartPosition() {
-		return _start;
-	}
-
-	/**
-	 * @return the end position in the range
-	 */
-	public DesignPosition getEndPosition() {
-		return _end;
-	}
-
-	/**
-	 * @return true if the range is valid
-	 */
-	public boolean isValid() {
-		return _start != null && _start.isValid() && _end != null
-				&& _end.isValid();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelection#isEmpty()
-	 */
-	public boolean isEmpty() {
-		// FIXME: temp implementation, need revisit.
-		return !isValid() || _start.equals(_end);
-	}
-
-	/**
-	 * @param buffer
-	 * @return a buffer with the debug dum
-	 */
-	public StringBuffer debugDump(StringBuffer buffer) {
-		if (_start != null) {
-			buffer.append("Start: ").append(_start);
-		} else {
-			buffer.append("Start: null");
-		}
-		if (_end != null) {
-			buffer.append("End: ").append(_end);
-		} else {
-			buffer.append("End: null");
-		}
-		return buffer;
-	}
-
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		return debugDump(buffer).toString();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignRefPosition.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignRefPosition.java
deleted file mode 100644
index da6e305..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignRefPosition.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import org.eclipse.gef.EditPart;
-
-/**
- * @author mengbo
- */
-public class DesignRefPosition extends DesignPosition {
-	private boolean _caretIsAtRight;
-
-	private EditPart _refPart;
-
-	/**
-	 * @param part
-	 * @param caretIsAfter
-	 */
-	public DesignRefPosition(EditPart part, boolean caretIsAfter) {
-		super(part.getParent(), 0);
-		int offset = part.getParent().getChildren().indexOf(part);
-		_offset = caretIsAfter ? offset + 1 : offset;
-		_refPart = part;
-		_caretIsAtRight = caretIsAfter;
-	}
-
-	/**
-	 * @return the reference edit part
-	 */
-	public EditPart getRefPart() {
-		return _refPart;
-	}
-
-	/**
-	 * @return Returns the _isAfter.
-	 */
-	public boolean caretIsAtRight() {
-		return _caretIsAtRight;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/EditPartPositionHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/EditPartPositionHelper.java
deleted file mode 100644
index 423b6df..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/EditPartPositionHelper.java
+++ /dev/null
@@ -1,678 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSTextFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.FlowBox;
-import org.eclipse.jst.pagedesigner.dom.DOMPosition;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
-import org.eclipse.jst.pagedesigner.parts.TextEditPart;
-import org.eclipse.jst.pagedesigner.validation.caret.IMovementMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.Target;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public class EditPartPositionHelper {
-//	private final static Logger _log = PDPlugin
-//			.getLogger(EditPartPositionHelper.class);
-
-	/**
-	 * Add something to curent
-	 * 
-	 * @param lineBox
-	 * @param host
-	 * @param point
-	 * @param validator
-	 */
-	private static void addToCurrentLine(FlowBoxLine lineBox, EditPart host,
-			Point point, IPositionMediator validator) {
-		Node node = Target.resolveNode(host);
-		if (!(node == null || EditModelQuery.isDocument(node))) {
-			// Either it is referencable or is editable.
-			if (validator.isValidPosition(new DOMRefPosition(node, true))
-					|| //
-					validator
-							.isValidPosition((new DOMRefPosition(node, false)))
-					|| //
-					validator.isValidPosition(new DOMPosition(node, 0))) {
-				lineBox.addLayoutPart(host, point);
-			}
-		}
-	}
-
-	/**
-	 * @param position 
-	 * @return null means failed to convert to rect.
-	 */
-	public static Rectangle convertToAbsoluteCaretRect(DesignPosition position) {
-		Rectangle ret = null;
-		try {
-			final int CARET_OFFSET = 1;
-			if (position == null || !position.isValid()) {
-				return null;
-			}
-			EditPart containerEditPart = position.getContainerPart();
-			if (containerEditPart instanceof TextEditPart) {
-				CSSTextFigure figure = (CSSTextFigure) ((TextEditPart) containerEditPart)
-						.getFigure();
-				ret = figure.calculateCaretPosition(position.getOffset());
-				figure.translateToAbsolute(ret);
-				ret.width = CaretUpdater.CARET_WIDTH;
-			} else {
-				int offset = position.getOffset();
-				// there is no child
-				if (containerEditPart.getChildren().isEmpty()
-						|| LayoutPart.getConcretePart(containerEditPart) == null) {
-					IFigure figure = ((GraphicalEditPart) containerEditPart)
-							.getFigure();
-					Rectangle bounds = figure.getBounds();
-					if (figure instanceof CSSFigure) {
-						List fragments = ((CSSFigure) figure)
-								.getFragmentsForRead();
-						if (fragments.size() > 0) {
-							FlowBox box = (FlowBox) fragments.get(fragments
-									.size() - 1);
-							bounds = LayoutPart.getBounds(box);
-						}
-					}
-
-					ret = new Rectangle(bounds.x + CARET_OFFSET, bounds.y,
-							CaretUpdater.CARET_WIDTH, bounds.height);
-
-					figure.translateToAbsolute(ret);
-				} else if (offset >= 0
-						&& offset <= containerEditPart.getChildren().size()) {
-					ret = getRefRect(position);
-				}
-			}
-		} catch (Exception e) {
-			// This should never happen, we catch here for later analysis.
-			// _log.debug("Error in caret rect resolving", e);
-			ret = new Rectangle(0, 0, 0, 0);
-		}
-		if (ret == null) {
-			ret = new Rectangle(0, 0, 0, 0);
-		}
-		return ret;
-	}
-
-	/**
-	 * This method will create FlowBoxLine to calculate the accurate parts.
-	 * 
-	 * @param host
-	 * @param p
-	 * @param validator 
-	 * @return the design position
-	 */
-	public static DesignPosition findEditPartPosition(EditPart host, Point p,
-			IPositionMediator validator) {
-		try {
-			host = validator.getEditableContainer(new Target(host));
-			FlowBoxLine boxLine = new FlowBoxLine(
-					new Rectangle(p.x, p.y, 0, 0), validator, p);
-			DesignPosition position = innerFindEditPartPosition(host, host, p,
-					boxLine, validator);
-			if (position == null) {
-				position = innerFindEditPartPosition(host, host, p, boxLine,
-						validator);
-				if (position == null) {
-					EditPart part = boxLine.getClosestPart();
-					if (part != null) {
-						LayoutPart layoutPart = new LayoutPart(part, p);
-						position = layoutPart.resolvePosition(validator);
-					}
-				}
-			}
-			return position;
-		} catch (Exception e) {
-			return null;
-		}
-
-	}
-
-	/**
-	 * This function find the position, if there is one which is widget or text
-	 * and it contains p, or there is not such widget, then boxLine will returns
-	 * the widget that are in a sameline which contains p;
-	 * @param rootHost 
-	 * @param host 
-	 * 
-	 * @param p
-	 * @param boxLine 
-	 * @param validator 
-	 * @return the design position
-	 */
-    //TODO: needs refactoring
-	public static DesignPosition innerFindEditPartPosition(EditPart rootHost,
-			EditPart host, Point p, FlowBoxLine boxLine,
-			IPositionMediator validator) {
-		Target target = new Target(host);
-		LayoutPart lPart = new LayoutPart(host, p);
-		// text
-		if (host instanceof TextEditPart) {
-			if (lPart.contains(p)) {
-				DesignPosition position = null;
-				// see if the point is within string.
-				position = findTextEditPartPosition((TextEditPart) host, p);
-				if (position == null) {
-					addToCurrentLine(boxLine, host, p, validator);
-				}
-				// found?!!
-				return position;
-			}
-            addToCurrentLine(boxLine, host, p, validator);
-            return null;
-		}
-		// widget
-		else if (isWidget(host)) {
-			if (lPart.contains(p)
-					&& (validator.isValidPosition(new DOMRefPosition(target
-							.getNode(), true)) || //
-					validator.isValidPosition((new DOMRefPosition(target
-							.getNode(), false))))) {
-				if (IHTMLConstants.TAG_BR.equalsIgnoreCase(Target.resolveNode(
-						host).getNodeName())) {
-					return new DesignRefPosition(host, lPart.isBeforePoint(p));
-				}
-                return new DesignRefPosition(host, lPart.isBeforePoint(p)
-                		|| !lPart.atLeftPart(p));
-			}
-            addToCurrentLine(boxLine, host, p, validator);
-		} else {
-			// root host. we always supporse it has editable area.
-			if (host == rootHost) {
-				if (host.getChildren().size() > 0) {
-					List children = host.getChildren();
-					for (int i = 0, size = children.size(); i < size; i++) {
-						GraphicalEditPart child = (GraphicalEditPart) children
-								.get(i);
-						DesignPosition position = innerFindEditPartPosition(
-								rootHost, child, p, boxLine, validator);
-						if (position != null) {
-							return position;
-						}
-					}
-				}
-				if (boxLine.getPartsList().size() == 0) {
-					if (lPart.contains(p)) {
-						// found!!!
-						return new DesignPosition(host, 0);
-					}
-					addToCurrentLine(boxLine, host, p, validator);
-				}
-			}
-			// container
-			else {
-				// cann't edit it.
-				if (!validator.hasEditableArea(target)) {
-					if (lPart.contains(p) && //
-							(validator.isValidPosition(new DesignRefPosition(
-									target.getPart(), true)) || //
-							validator.isValidPosition(new DesignRefPosition(
-									target.getPart(), true)))) {
-						return new DesignRefPosition(host, lPart
-								.isBeforePoint(p)
-								|| !lPart.atLeftPart(p));
-					}
-                    addToCurrentLine(boxLine, host, p, validator);
-				}
-				// can edit
-				else {
-					// contains p
-					if (lPart.contains(p) || //
-							(!validator.isValidPosition(new DesignRefPosition(
-									target.getPart(), true)) && //
-							!validator.isValidPosition(new DesignRefPosition(
-									target.getPart(), true)))) {
-						if (host.getChildren().size() > 0) {
-							List children = host.getChildren();
-							for (int i = 0, size = children.size(); i < size; i++) {
-								GraphicalEditPart child = (GraphicalEditPart) children
-										.get(i);
-								DesignPosition position = innerFindEditPartPosition(
-										rootHost, child, p, boxLine, validator);
-								if (position != null) {
-									return position;
-								}
-							}
-						} else {
-							// we put the container which is empty here.
-							if (lPart.contains(p)) {
-								// found!!!
-								return new DesignPosition(host, 0);
-							}
-                            addToCurrentLine(boxLine, host, p, validator);
-						}
-					}
-					// not contains p
-					else {
-						addToCurrentLine(boxLine, host, p, validator);
-					}
-				}
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * similiar to findEditPartPositionConstrained, this method is used to
-	 * vertically move caret.
-	 * 
-	 * @param host
-	 * @param p
-	 * @param validator 
-	 * @return the design position
-	 */
-	public static DesignPosition findEditPartPositionConstrained(EditPart host,
-			Point p, IMovementMediator validator) {
-		try {
-			FlowBoxLine boxLine = new FlowBoxLine(
-					new Rectangle(p.x, p.y, 0, 0), validator, p);
-			DesignPosition position = innerFindEditPartPositionConstrained(
-					host, host, p, boxLine, validator);
-			if (position == null) {
-				position = innerFindEditPartPositionConstrained(host, host, p,
-						boxLine, validator);
-				if (position == null) {
-					EditPart part = boxLine.getClosestPart();
-					if (part != null) {
-						LayoutPart layoutPart = new LayoutPart(part, p);
-						position = layoutPart.resolvePosition(validator);
-					}
-				}
-			}
-			return position;
-		} catch (Exception e) {
-			return null;
-		}
-	}
-
-	/**
-	 * This method is used for move up/down, except for using tactics to deal
-	 * with container, this method is similiar to findEditPartPosition.
-	 * 
-	 * @param rootHost 
-	 * @param host 
-	 * @param p
-	 * @param boxLine 
-	 * @param validator 
-	 * @return the design position
-	 */
-    // TODO: needs refactoring
-	public static DesignPosition innerFindEditPartPositionConstrained(
-			EditPart rootHost, EditPart host, Point p, FlowBoxLine boxLine,
-			IMovementMediator validator) {
-		Target target = new Target(host);
-		LayoutPart lPart = new LayoutPart(host, p);
-		// text
-		if (host instanceof TextEditPart) {
-			if (lPart.contains(p)) {
-				DesignPosition position = null;
-				// see if the point is within string.
-				position = findTextEditPartPosition((TextEditPart) host, p);
-				if (position == null) {
-					addToCurrentLine(boxLine, host, p, validator);
-				}
-				// found?!!
-				return position;
-			}
-            addToCurrentLine(boxLine, host, p, validator);
-            return null;
-		}
-		// widget
-		else if (isWidget(host)) {
-			if (lPart.contains(p)) {
-				// found!!!
-				if (IHTMLConstants.TAG_BR.equalsIgnoreCase(Target.resolveNode(
-						host).getNodeName())) {
-					return new DesignRefPosition(host, lPart.isBeforePoint(p));
-				}
-                return new DesignRefPosition(host, lPart.isBeforePoint(p)
-                		|| !lPart.atLeftPart(p));
-			}
-            addToCurrentLine(boxLine, host, p, validator);
-		} else {
-			// root host. we always supporse it has editable area.
-			if (host == rootHost) {
-				if (host.getChildren().size() > 0) {
-					List children = host.getChildren();
-					for (int i = 0, size = children.size(); i < size; i++) {
-						GraphicalEditPart child = (GraphicalEditPart) children
-								.get(i);
-						DesignPosition position = innerFindEditPartPositionConstrained(
-								rootHost, child, p, boxLine, validator);
-						if (position != null) {
-							return position;
-						}
-					}
-				} else {
-					if (lPart.contains(p)) {
-						// found!!!
-						return new DesignPosition(host, 0);
-					}
-					addToCurrentLine(boxLine, host, p, validator);
-				}
-			}
-			// container
-			else {
-				// cann't edit it.
-				if (!validator.hasEditableArea(target)
-						|| !validator.allowsMoveIn(target)) {
-					if (validator.canReference(target, true)
-							|| validator.canReference(target, false)) {
-						if (lPart.contains(p)) {
-							return new DesignRefPosition(host, lPart
-									.isBeforePoint(p)
-									|| !lPart.atLeftPart(p));
-						}
-                        addToCurrentLine(boxLine, host, p, validator);
-					}
-				}
-				// can edit
-				else {
-					// contains p
-					if (lPart.contains(p)) {
-						if (host.getChildren().size() > 0) {
-							List children = host.getChildren();
-							for (int i = 0, size = children.size(); i < size; i++) {
-								GraphicalEditPart child = (GraphicalEditPart) children
-										.get(i);
-								DesignPosition position = innerFindEditPartPositionConstrained(
-										rootHost, child, p, boxLine, validator);
-								if (position != null) {
-									return position;
-								}
-							}
-						} else {
-							// we put the container which is empty here.
-							if (lPart.contains(p)) {
-								// found!!!
-								return new DesignPosition(host, 0);
-							}
-                            addToCurrentLine(boxLine, host, p, validator);
-						}
-					}
-					// not contains p
-					else {
-						addToCurrentLine(boxLine, host, p, validator);
-					}
-				}
-			}
-		}
-		return null;
-
-	}
-
-	// /**
-	// * @param host
-	// * @param p
-	// * @return
-	// */
-	// private static DesignPosition
-	// findTextEditPartPositionAdjacent(TextEditPart host, Point p)
-	// {
-	// if (host.getFigure() instanceof CSSTextFigure)
-	// {
-	// CSSTextFigure figure = (CSSTextFigure) host.getFigure();
-	// // make a copy to not destroy the original o
-	// p = p.getCopy();
-	// figure.translateToRelative(p);
-	// int offset = figure.getNewInsertionOffset(p);
-	// if (offset >= 0)
-	// {
-	// return new DesignPosition(host, offset);
-	// }
-	// else
-	// {
-	// return null;
-	// }
-	// }
-	// else
-	// {
-	// // should not happen.
-	// return new DesignPosition(host, 0);
-	// }
-	// }
-
-	/**
-	 * @param host
-	 * @param p
-	 * @return
-	 */
-	private static DesignPosition findTextEditPartPosition(TextEditPart host,
-			Point p) {
-		if (host.getFigure() instanceof CSSTextFigure) {
-			CSSTextFigure figure = (CSSTextFigure) host.getFigure();
-			// make a copy to not destroy the original o
-			p = p.getCopy();
-			figure.translateToRelative(p);
-			int offset = figure.getInsertionOffset(p);
-			if (offset >= 0) {
-				return new DesignPosition(host, offset);
-			}
-            return null;
-		}
-        // should not happen.
-        return new DesignPosition(host, 0);
-	}
-
-	/**
-	 * @param figure
-	 * @param box
-	 * @return
-	 */
-//	public static Rectangle getBoxBounds(IFigure figure, FlowBox box) {
-//		Rectangle r = new Rectangle(box._x, box._y, box.getWidth(), box
-//				.getHeight());
-//		figure.translateToAbsolute(r);
-//		return r;
-//	}
-
-	/**
-	 * If child is a GraphicalEditPart, a new copy of its bounding rectangle
-	 * will be returned translated to absolute bounds. If child is not a GraphicalEditPart
-	 * then the empty rectangle (0,0,0,0) is returned.
-	 * 
-	 * @param child
-	 * @return the bounding rectangle or (0,0,0,0) if none.
-	 */
-	public static Rectangle getAbsoluteBounds(EditPart child) {
-		if (child instanceof GraphicalEditPart) {
-			Rectangle bounds = ((GraphicalEditPart) child).getFigure()
-					.getBounds().getCopy();
-			((GraphicalEditPart) child).getFigure().translateToAbsolute(bounds);
-			return bounds;
-		}
-        return new Rectangle(0, 0, 0, 0);
-	}
-
-	/**
-	 * @param host
-	 * @param tagName
-	 * @return
-	 */
-	private static boolean isWidget(EditPart host) {
-		if (host instanceof NodeEditPart) {
-			return ((NodeEditPart) host).isWidget();
-		}
-        return false;
-	}
-
-	/**
-	 * Is Caret at right?
-	 * 
-	 * @param position
-	 * @param caretRefResult
-	 * @return
-	 */
-	private static EditPart tryTwoWays(DesignPosition position,
-			List<Boolean> caretRefResult) {
-		EditPart result = null;
-		// Sibling first:
-		Node node = EditModelQuery.getInstance().getSibling(
-				DOMPositionHelper.toDOMPosition(position), true);
-		if (node != null && !EditModelQuery.isTransparentText(node)) {
-			result = Target.resolvePart(node);
-			caretRefResult.add(Boolean.FALSE);
-		} else {
-			node = EditModelQuery.getInstance().getSibling(
-					DOMPositionHelper.toDOMPosition(position), false);
-			if (node != null && !EditModelQuery.isTransparentText(node)) {
-				result = Target.resolvePart(node);
-				caretRefResult.add(Boolean.TRUE);
-			}
-		}
-		if (result == null) {
-			if (getConcretePart(position, false) != null) {
-				result = getConcretePart(position, false);
-				caretRefResult.add(Boolean.TRUE);
-			} else if (getConcretePart(position, true) != null) {
-				result = getConcretePart(position, true);
-				caretRefResult.add(Boolean.FALSE);
-			}
-		}
-		return result;
-	}
-
-	/*
-	 * Here we are doing something to avoid reference witespace tag. Since we
-	 * still need to improve whitespace tags's layout furthure more.
-	 */
-	private static EditPart getNextConcretPart(DesignPosition position,
-			List<Boolean> caretIsAtRightTest) {
-		EditPart result = null;
-		boolean caretIsAtRight = true;
-		if (position instanceof DesignRefPosition) {
-			caretIsAtRight = ((DesignRefPosition) position).caretIsAtRight();
-			result = ((DesignRefPosition) position).getRefPart();
-			caretIsAtRightTest.add(Boolean.valueOf(caretIsAtRight));
-		}
-		if (result == null
-				|| EditModelQuery.isTransparentText(Target.resolveNode(result))) {
-			caretIsAtRightTest.clear();
-			result = tryTwoWays(position, caretIsAtRightTest);
-		}
-		return result;
-	}
-
-	/**
-	 * Avoid whitespaces
-	 * 
-	 * @param position
-	 * @param forward
-	 * @return the edit part at position which is non-whitespace ? TODO:
-	 */
-	public static EditPart getConcretePart(DesignPosition position,
-			boolean forward) {
-		EditPart result = null;
-		Node node = EditModelQuery.getInstance().getSibling(
-				DOMPositionHelper.toDOMPosition(position), forward);
-		while (node != null && EditModelQuery.isTransparentText(node)) {
-			node = EditModelQuery.getInstance().getSibling(node, forward);
-		}
-		if (node != null) {
-			result = Target.resolvePart(node);
-		}
-		return result;
-	}
-
-	/**
-	 * @param position
-	 * @param forward
-	 * @return the next concrete part.
-	 */
-	public static EditPart getNextConcretPart(DesignPosition position,
-			boolean forward) {
-		Node node;
-		EditPart result = null;
-		node = EditModelQuery.getInstance().getSibling(
-				DOMPositionHelper.toDOMPosition(position), forward);
-		if (node != null) {
-			if (forward) {
-				while (node != null) {
-					if (!EditModelQuery.isTransparentText(node)
-							&& (result = Target.resolvePart(node)) != null) {
-						result = Target.resolvePart(node);
-						break;
-					}
-					node = node.getNextSibling();
-				}
-			} else {
-				while (node != null) {
-					if (!EditModelQuery.isTransparentText(node)
-							&& (result = Target.resolvePart(node)) != null) {
-						result = Target.resolvePart(node);
-						break;
-					}
-					node = node.getPreviousSibling();
-				}
-			}
-		}
-		return result;
-	}
-
-	private static Rectangle getRefRect(DesignPosition position) {
-		List<Boolean> caretLocation = new ArrayList<Boolean>();
-		EditPart part = getNextConcretPart(position, caretLocation);
-		LayoutPart layoutPart;
-		Rectangle rect = null;
-		if (part != null) {
-			layoutPart = new LayoutPart(part, null);
-			boolean caretIsAtRight = caretLocation.get(0)
-					.booleanValue();
-			final int CARET_OFFSET = 1;
-			Rectangle bounds = null;
-			IFigure figure = ((GraphicalEditPart) part).getFigure();
-			if (!caretIsAtRight) {
-				FlowBox box;
-				if ((box = layoutPart.getLine(0)) != null) {
-					bounds = LayoutPart.getBounds(box);
-				}
-			} else {
-				FlowBox box;
-				if ((box = layoutPart.getLastLine()) != null) {
-					bounds = LayoutPart.getBounds(box);
-				}
-			}
-			if (bounds == null) {
-				bounds = figure.getBounds();
-			}
-			if (!caretIsAtRight) {
-				rect = new Rectangle(bounds.x - CARET_OFFSET, bounds.y,
-						CaretUpdater.CARET_WIDTH, bounds.height);// new
-			} else {
-				rect = new Rectangle(bounds.getRight().x + CARET_OFFSET,
-						bounds.y, CaretUpdater.CARET_WIDTH, bounds.height);// new
-			}
-			figure.translateToAbsolute(rect);
-		} else {
-			System.out.println("No concrete part?");
-		}
-		return rect;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/FlowBoxLine.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/FlowBoxLine.java
deleted file mode 100644
index 5e45ac1..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/FlowBoxLine.java
+++ /dev/null
@@ -1,249 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.jst.pagedesigner.validation.caret.ActionData;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-
-/**
- * FlowBoxLine collects EditParts in a line that cover the x or y coordinate of
- * design view caret. An EditPart may be a widget that can't contains children,
- * a TextEditPart which contains a set of flowbox, or a widgets container which
- * contains some other editparts. For container, there are two types: white box
- * to visitor, that is the container * visitor should consider its content, like
- * <A>, <B>. etc, or black box to visitor, like <TABLE>. Black box means the
- * container will be considered as a whole from outside. For non-container
- * widget we only see TextEditPart can be broken at line end. For black box,
- * only start box or latest box are used for final reference, for white box, we
- * will process its content for reference <@see
- * EditPartPositionHelper.findEditPartPosition>. For Text, the char that is
- * closest to caret will be referenced. In this line class, tree types of
- * EditPart are collected: TextEditPart, Widget, BlackBox container.
- * 
- * @author mengbo
- */
-public class FlowBoxLine {
-	private int _x;
-
-	private int _y;
-
-	private int _height;
-
-	private int _width;
-
-	private HashMap _parts = new HashMap();
-
-	private IPositionMediator _validator;
-
-	private Point _point;
-
-	/**
-	 * @param rect
-	 * @param validator
-	 * @param point
-	 */
-	public FlowBoxLine(Rectangle rect, IPositionMediator validator, Point point) {
-		_x = rect.x;
-		_y = rect.y;
-		_width = rect.width;
-		_height = rect.height;
-		_validator = validator;
-		_point = point;
-	}
-
-	/**
-	 * @return Returns the _height.
-	 */
-	public int getHeight() {
-		return _height;
-	}
-
-	/**
-	 * @return Returns the _width.
-	 */
-	public int getWidth() {
-		return _width;
-	}
-
-	/**
-	 * @return Returns the _x.
-	 */
-	public int getX() {
-		return _x;
-	}
-
-	/**
-	 * @return Returns the _y.
-	 */
-	public int getY() {
-		return _y;
-	}
-
-	/**
-	 * @return the part list
-	 */
-	public Map getPartsList() {
-		return _parts;
-	}
-
-	/**
-	 * @return the right bottom coordiate
-	 */
-	public Point getRightBottom() {
-		return new Point(_x + _width, _y + _height);
-	}
-
-	/**
-	 * @param part
-	 * @param point
-	 * @return layout part added
-	 */
-	public boolean addLayoutPart(EditPart part, Point point) {
-		Assert.isTrue(part != null && point != null);
-		Rectangle rect = null;
-		LayoutPart lPart = new LayoutPart(part, point);
-		if (_parts.size() == 0) {
-			resetBounds(lPart);
-			return true;
-		}
-		if (!interact(lPart)) {
-			if (closer(lPart)) {
-				resetBounds(lPart);
-				return true;
-			}
-            return false;
-		}
-        rect = lPart.getAbsoluteBounds();
-		int xx = Math.min(rect.x, _x);
-		int width = Math.max(rect.getRight().x, getRightBottom().x) - xx;
-		int yy = Math.min(rect.y, _y);
-		int height = Math.max(rect.getBottom().y, getRightBottom().y) - yy;
-		_x = xx;
-		_y = yy;
-		_width = width;
-		_height = height;
-		_parts.put(part, lPart);
-		return true;
-	}
-
-	/**
-	 * @param lPart
-	 * @return true if layout part is within the right bottom corner of the line
-	 */
-	public boolean interact(LayoutPart lPart) {
-		Rectangle rect = lPart.getAbsoluteBounds();
-		return !(rect.getBottom().y <= _y || getRightBottom().y <= rect.y);
-	}
-
-	/**
-	 * @param part
-	 * @return true if the line contains part
-	 */
-	public boolean contains(EditPart part) {
-		return _parts.containsKey(part);
-	}
-
-	/**
-	 * @param part
-	 * @return true if the line contains part
-	 */
-	public boolean contains(LayoutPart part) {
-		return _parts.containsValue(part);
-	}
-
-	/**
-	 * @param part
-	 * @return the layout part for part
-	 */
-	public LayoutPart getLayoutPart(EditPart part) {
-		return (LayoutPart) _parts.get(part);
-	}
-
-	// 
-	/**
-	 * For vertical movement, we need to see if there is part cover p.x.
-	 * 
-	 * @return the closest edit part
-	 */
-	public EditPart getClosestPart() {
-		if (_parts.isEmpty()) {
-			return null;
-		}
-		Collection parts = _parts.values();
-		Iterator iterator = parts.iterator();
-		LayoutPart closestPart = (LayoutPart) iterator.next();
-		if (iterator.hasNext()) {
-			while (iterator.hasNext()) {
-				LayoutPart nextPart = (LayoutPart) iterator.next();
-				closestPart = CaretPositionResolver.getCloserPart(closestPart,
-						nextPart, _point);
-			}
-		}
-		// for children.
-		LayoutPart result = null;
-		if (_validator.getActionData().getActionType() == ActionData.KEYBOARD_NAVAGATION
-				|| //
-				closestPart.isInline()) {
-			result = CaretPositionResolver.getInstance(_validator, _point)
-					.resolveClosestPartFrom(closestPart);
-		} else {
-			result = closestPart;
-		}
-		if (result != null) {
-			return result.getPart();
-		}
-        return null;
-	}
-
-	/**
-	 * See how close the part,box is closer to point, if it is closer than
-	 * current FlowBoxLine. return true;
-	 */
-	private boolean closer(LayoutPart lPart) {
-		int lineYOffset = Math.abs(CaretPositionResolver.getYDistance(
-				getBounds(), _point));
-		int partYOffset = Math.abs(CaretPositionResolver.getYDistance(lPart
-				.getAbsoluteBounds(), _point));
-		return lineYOffset > partYOffset;
-	}
-
-	/**
-	 * @return the bounding rectangle of the line
-	 */
-	public Rectangle getBounds() {
-		return new Rectangle(_x, _y, _width, _height);
-	}
-
-	private void resetBounds(Rectangle rect) {
-		_x = rect.x;
-		_y = rect.y;
-		_width = rect.width;
-		_height = rect.height;
-	}
-
-	private void resetBounds(LayoutPart lPart) {
-		EditPart part = lPart.getPart();
-		Rectangle rect = lPart.getAbsoluteBounds();
-		resetBounds(rect);
-		_parts.clear();
-		_parts.put(part, lPart);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/HTMLGraphicalViewer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/HTMLGraphicalViewer.java
deleted file mode 100644
index 7080136..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/HTMLGraphicalViewer.java
+++ /dev/null
@@ -1,547 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.draw2d.FigureCanvas;
-import org.eclipse.draw2d.Viewport;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.ui.parts.ScrollingGraphicalViewer;
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jst.pagedesigner.commands.nav.CaretPositionTracker;
-import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
-import org.eclipse.jst.pagedesigner.parts.DocumentEditPart;
-import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
-import org.eclipse.jst.pagedesigner.tools.ExposeHelper;
-import org.eclipse.swt.widgets.Canvas;
-import org.eclipse.swt.widgets.Caret;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMNode;
-import org.w3c.dom.Node;
-
-/**
- * For the GraphicalViewer selection management, we have two different selection
- * mode: Range mode and object mode.
- * 
- * Range mode is to support inline text editing, it selects a range. Object mode
- * selects a list of edit parts.
- * 
- * We let the super class of HTMLGraphicalViewer to handle object selection, and
- * add range selection support in this class. Need to override certain selection
- * related methods of super class to handle selection mode switching.
- * 
- * @author mengbo
- */
-/*package*/ class HTMLGraphicalViewer extends ScrollingGraphicalViewer implements
-		IHTMLGraphicalViewer, CaretPositionTracker {
-	private IEditorPart _parentPart;
-	private Caret _caret;
-	// initially nothing selected, treat as object selectin mode.
-	private boolean _rangeMode = false;
-	private DesignRange _selectionRange = null;
-	private int _inBatch = 0;
-	private final CaretUpdater _caretUpdater;
-	private int _xOffset;
-	private final List<IHTMLGraphicalViewerListener>  _htmlViewerListeners;
-	// private ListenerList _postSelectionChangedListeners = new
-	// ListenerList(1);
-
-	/**
-	 * @param parent 
-	 * 
-	 */
-	public HTMLGraphicalViewer(IEditorPart parent) {
-		_parentPart = parent;
-		// CaretUpdater is not fully initialized yet, since this time the
-		// viewport is not
-		// initialized yet, and we need add listener to range model change.
-        _htmlViewerListeners = new ArrayList<IHTMLGraphicalViewerListener>();
-		_caretUpdater = new CaretUpdater(this);
-	}
-
-	/**
-	 * Adds listener both as a selection changed listener and as an
-	 * {@link IHTMLGraphicalViewerListener}.  Callers of this method
-	 * need not call addSelectionChangedListener.
-	 * @param listener
-	 */
-	public void addHTMLViewerListener(IHTMLGraphicalViewerListener listener)
-	{
-	    addSelectionChangedListener(listener);
-	    
-	    if (!_htmlViewerListeners.contains(listener))
-	    {
-	        _htmlViewerListeners.add(listener);
-	    }
-	}
-	
-	/**
-	 * Removes listener both as a selection changed listener and as an
-     * {@link IHTMLGraphicalViewerListener}.  Callers of this method
-     * need not call removeSelectionChangedListener.
-	 * @param listener
-	 */
-	public void removeHTMLViewerListener(IHTMLGraphicalViewerListener listener)
-	{
-	    removeSelectionChangedListener(listener);
-	    _htmlViewerListeners.remove(listener);
-	}
-
-	public Viewport getViewport() {
-		FigureCanvas canvas = this.getFigureCanvas();
-		if (canvas != null) {
-			return canvas.getViewport();
-		}
-        return null;
-	}
-
-	public IDOMModel getModel() {
-		// XXX: temp implementation.
-		EditPart part = this.getContents();
-		if (part != null) {
-			return ((IDOMNode) part.getModel()).getModel();
-		}
-        return null;
-	}
-
-	/**
-	 * @return the status line manager
-	 */
-	public IStatusLineManager getStatusLineManager() {
-		if (_parentPart == null) {
-			return null;
-		}
-        return _parentPart.getEditorSite().getActionBars()
-        		.getStatusLineManager();
-	}
-
-	public Caret getCaret() {
-		if (_caret == null) {
-			Canvas parentCanvas = (Canvas) getControl();
-			if (parentCanvas == null || parentCanvas.isDisposed()) {
-				return null;
-			}
-
-			_caret = new Caret(parentCanvas, 0);
-			_caretUpdater.connectViewer();
-		}
-		return _caret;
-
-	}
-
-	/**
-	 * this method normally should only be called when in object selection mode.
-	 * 
-	 * @return the edit part that has primary selection or null if none
-	 */
-	public EditPart getPrimarySelectedNode() {
-		List list = this.getSelectedEditParts();
-		if (list.isEmpty()) {
-			return null;
-		}
-		for (int i = 0, n = list.size(); i < n; i++) {
-			EditPart part = (EditPart) list.get(i);
-			if (part.getSelected() == EditPart.SELECTED_PRIMARY) {
-				return part;
-			}
-		}
-		return (EditPart) list.get(0);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.IHTMLGraphicalViewer#ensureRangeSelectionMode()
-	 */
-	public void ensureRangeSelectionMode() {
-		if (!_rangeMode) {
-			EditPart primary = getPrimarySelectedNode();
-			this.deselectAll();
-			DesignPosition begin = primary == null ? DesignPosition.INVALID
-					: DesignPosition.createPositionBeforePart(primary);
-			DesignPosition after = primary == null ? DesignPosition.INVALID
-					: DesignPosition.createPositionAfterPart(primary);
-			internalSetRange(begin, after);
-			fireSelectionChanged();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.IHTMLGraphicalViewer#ensureObjectSelectionMode()
-	 */
-	public void ensureObjectSelectionMode() {
-		if (_rangeMode) {
-			// switch to object selection mode with no selection.
-			internalToObjectMode();
-			fireSelectionChanged();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.IHTMLGraphicalViewer#isInRangeMode()
-	 */
-	public boolean isInRangeMode() {
-		return _rangeMode;
-	}
-
-	public ISelection getSelection() {
-		if (isInRangeMode()) {
-			return getRangeSelection();
-		}
-        return super.getSelection();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.IHTMLGraphicalViewer#startSelectionChange()
-	 */
-	public void startSelectionChange() {
-		if (_inBatch == 0) {
-			fireSelectionAboutToChange();
-		}
-		_inBatch++;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.IHTMLGraphicalViewer#selectionChanged()
-	 */
-	public void selectionChanged() {
-		if (--_inBatch == 0) {
-			fireSelectionChanged();
-			fireSelectionChangeFinished();
-		}
-	}
-
-	/**
-	 * 
-	 */
-	private void fireSelectionAboutToChange() {
-		IHTMLGraphicalViewerListener listeners[] = 
-		    _htmlViewerListeners.toArray(new IHTMLGraphicalViewerListener[0]);
-
-		for (int i = 0; i < listeners.length; i++) 
-		{
-			listeners[i].selectionAboutToChange();
-		}
-	}
-
-	/**
-	 * 
-	 */
-	private void fireSelectionChangeFinished()
-	{
-        IHTMLGraphicalViewerListener listeners[] = 
-            _htmlViewerListeners.toArray(new IHTMLGraphicalViewerListener[0]);
-        for (int i = 0; i < listeners.length; i++) 
-        {
-            listeners[i].selectionChangeFinished();
-        }
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.AbstractEditPartViewer#fireSelectionChanged()
-	 */
-	protected void fireSelectionChanged() {
-		if (_inBatch == 0)// && this.getControl().isFocusControl())
-		{
-			super.fireSelectionChanged();
-			// firePostSelectionChanged(new SelectionChangedEvent(this,
-			// getSelection()));
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.AbstractEditPartViewer#setSelection(org.eclipse.jface.viewers.ISelection)
-	 */
-	public void setSelection(ISelection newSelection) {
-		if (newSelection instanceof IStructuredSelection) {
-			internalToObjectMode();
-			ExposeHelper.expose(newSelection, this);
-			updateRangeSelection(newSelection);
-			super.setSelection(newSelection);
-		} else if (newSelection instanceof DesignRange) {
-			DesignRange range = (DesignRange) newSelection;
-			internalSetRange(range.getStartPosition(), range.getEndPosition());
-			fireSelectionChanged();
-		}
-		// else we don't support, ignore
-	}
-
-
-	/**
-	 * @param newSelection
-	 */
-	public void updateRangeSelection(ISelection newSelection) {
-		if (newSelection instanceof IStructuredSelection && //
-				!(((IStructuredSelection) newSelection).getFirstElement() instanceof DocumentEditPart)) {
-			Object element = ((IStructuredSelection) newSelection)
-					.getFirstElement();
-			if (element instanceof ElementEditPart) {
-				updateRangeSelection(new DesignRefPosition((EditPart) element,
-						false), new DesignRefPosition((EditPart) element, true));
-			} else if (element instanceof Node) {
-				IDOMPosition start = new DOMRefPosition((Node) element, false);
-				IDOMPosition end = new DOMRefPosition((Node) element, true);
-				updateRangeSelection(DOMPositionHelper.toDesignPosition(start),
-						DOMPositionHelper.toDesignPosition(end));
-			}
-		}
-	}
-
-	/**
-	 * This method is used to synchronize range mode selection when node
-	 * selection is changed.
-	 * 
-	 * @param position
-	 * @param position2
-	 */
-	private void updateRangeSelection(DesignPosition position,
-			DesignPosition position2) {
-		// if only one position is invalid, we will make a collapsed range using
-		// the valid position
-		if (position == null) {
-			position = DesignPosition.INVALID;
-		}
-		if (position2 == null || !position2.isValid()) {
-			position2 = position;
-		}
-		if (!position.isValid()) {
-			position = position2;
-		}
-
-		_selectionRange = new DesignRange(position, position2);
-	}
-
-	// -------------------------------------------------------------------------------------------------
-	// override super class methods for selection handling.
-	// operations that handles object selection
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.AbstractEditPartViewer#appendSelection(org.eclipse.gef.EditPart)
-	 */
-	public void appendSelection(EditPart editpart) {
-		internalToObjectMode();
-		super.appendSelection(editpart); // super will fireSelectionChanged.
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.AbstractEditPartViewer#deselectAll()
-	 */
-	public void deselectAll() {
-		internalToObjectMode();
-		super.deselectAll(); // super.deselectAll() will fireSelectionChanged
-	}
-
-	/**
-	 * Clear the selection to null. When the model is modified, the selection is
-	 * invalid, so we need to clear the selection. We change the selection
-	 * directly, it won't need to fire selectionchange event to other part.
-	 * 
-	 */
-	public void clearSelectionRange() {
-		internalToObjectMode();
-		_selectionRange = null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.AbstractEditPartViewer#deselect(org.eclipse.gef.EditPart)
-	 */
-	public void deselect(EditPart editpart) {
-		if (!_rangeMode) {
-			super.deselect(editpart); // super will fireSelectionChanged.
-		}
-		// else just ignore.
-	}
-
-	// ---------------------------------------------------------------------------------------------
-	// range selection handling methods.
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.IHTMLGraphicalViewer#getRangeSelection()
-	 */
-	public DesignRange getRangeSelection() {
-		return _selectionRange;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.IHTMLGraphicalViewer#setRange(org.eclipse.jst.pagedesigner.selection.EditPartPosition,
-	 *      org.eclipse.jst.pagedesigner.selection.EditPartPosition)
-	 */
-	public void setRange(DesignPosition position, DesignPosition position2) {
-		internalSetRange(position, position2);
-		fireSelectionChanged();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.parts.IHTMLGraphicalViewer#setRangeEndPosition(org.eclipse.jst.pagedesigner.selection.EditPartPosition)
-	 */
-	public void setRangeEndPosition(DesignPosition position) {
-		DesignRange range = getRangeSelection();
-		DesignPosition begin = null;
-		if (range != null) {
-			begin = range.getStartPosition();
-		}
-		internalSetRange(begin, position);
-		fireSelectionChanged();
-	}
-
-	// --------------------------------------------------------------------------------------
-	/**
-	 * internall switch to object mode, no selection change event is fired. the
-	 * caller must call some other methods that will result in selection change
-	 * event after calling this method.
-	 */
-	private void internalToObjectMode() {
-		_rangeMode = false;
-	}
-
-	/**
-	 * this method will not fire selection changed event. caller should do that.
-	 * 
-	 * @param position
-	 * @param position2
-	 */
-	private void internalSetRange(DesignPosition position,
-			DesignPosition position2) {
-		if (!_rangeMode) {
-			// XXX: deselectAll() will result in fireSelectionChange, so here is
-			// one unnecessary
-			// event fire. But should be ok.
-			deselectAll();
-			_rangeMode = true;
-		}
-		// if only one position is invalid, we will make a collapsed range using
-		// the valid position
-		if (position == null) {
-			position = DesignPosition.INVALID;
-		}
-		if (position2 == null || !position2.isValid()) {
-			position2 = position;
-		}
-		if (!position.isValid()) {
-			position = position2;
-		}
-
-		_selectionRange = new DesignRange(position, position2);
-	}
-
-	/**
-	 * debug method, dump some debug information to the console
-	 */
-	public void dumpStatus() {
-		if (isInRangeMode()) {
-			// System.out.println("Range start: " +
-			// this.getRangeSelection().getStartPosition());
-			// System.out.println("Range end: " +
-			// this.getRangeSelection().getEndPosition());
-		} else {
-			// System.out.println("Object selection mode");
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.nav.CaretPositionTracker#getXoffset()
-	 */
-	public int getXoffset() {
-		return _xOffset;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.nav.CaretPositionTracker#setXoffset(int)
-	 */
-	public void setXoffset(int xoffset) {
-		this._xOffset = xoffset;
-	}
-
-	/**
-	 * 
-	 */
-	public void updateHorizontalPos() {
-		Caret caret = getCaret();
-		if (caret != null && !caret.isDisposed() && isInRangeMode()) {
-			org.eclipse.swt.graphics.Rectangle rect = caret.getBounds();
-			setXoffset(rect.x);
-		}
-	}
-    
-	// public void addPostSelectionChangedListener(ISelectionChangedListener
-	// listener)
-	// {
-	// _postSelectionChangedListeners.add(listener);
-	//
-	// }
-	//
-	// public void removePostSelectionChangedListener(ISelectionChangedListener
-	// listener)
-	// {
-	// _postSelectionChangedListeners.remove(listener);
-	// }
-
-	/**
-	 * Notifies any post selection listeners that a post selection event has
-	 * been received. Only listeners registered at the time this method is
-	 * called are notified.
-	 * 
-	 * @param event
-	 *            a selection changed event
-	 * 
-	 * @see #addPostSelectionChangedListener(ISelectionChangedListener)
-	 */
-	// public void firePostSelectionChanged(final SelectionChangedEvent event)
-	// {
-	// Object[] listeners = _postSelectionChangedListeners.getListeners();
-	// for (int i = 0; i < listeners.length; ++i)
-	// {
-	// final ISelectionChangedListener l = (ISelectionChangedListener)
-	// listeners[i];
-	// SafeRunnable.run(new SafeRunnable()
-	// {
-	// public void run()
-	// {
-	// l.selectionChanged(event);
-	// }
-	// });
-	// }
-	// }
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/HTMLGraphicalViewerListenenerAdapter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/HTMLGraphicalViewerListenenerAdapter.java
deleted file mode 100644
index 4b368aa..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/HTMLGraphicalViewerListenenerAdapter.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-
-/**
- * @author cbateman
- * 
- * Default adapter class for IHTMLGraphicalViewerListener
- *
- */
-public abstract class HTMLGraphicalViewerListenenerAdapter implements
-        IHTMLGraphicalViewerListener {
-
-    public void selectionAboutToChange() {
-        // do nothing -- override to implement
-    }
-
-    public void selectionChangeFinished() {
-        // do nothing -- override to implement
-    }
-
-    public void selectionChanged(SelectionChangedEvent event) {
-        // do nothing == override to implement
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/IDropLocationStrategy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/IDropLocationStrategy.java
deleted file mode 100644
index 0798fea..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/IDropLocationStrategy.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import java.util.List;
-
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.requests.DropRequest;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-
-/**
- * A strategy used to determine the closest valid drop location given
- * a current position.
- * 
- * Note: clients should not implement or sub-class this interface.  Instead,
- * sub-class AbstractDropLocationStrategy.
- * @author cbateman
- *
- */
-public interface IDropLocationStrategy
-{
-    /**
-     * @param host
-     * @param p
-     * @param validator
-     * @return the closest valid design positionn to p, starting from host
-     * that is valid based on validator, or null if there is no such position
-     * (drop not valid).  validator.isValidPosition must be honoured.
-     */
-    DesignPosition calculateDesignPosition(EditPart host, Point p, IPositionMediator validator);
-    
-    /**
-     * May choose to contribute target feedback given a target part host and given
-     * the proposed drops location given by position
-     * 
-     * @param host 
-     * @param position
-     * @param request 
-     * @return must contain all IFigure objects that were added to the feedback layer by
-     * this call.  Once returned, these IFigure's must not be kept as state information
-     * by the strategy because they may be manipulated at any time after return to the caller.
-     * This includes erasing them from the feedback layer.  List must be modifiable by
-     * the caller.
-     * 
-     * Note: most feedback in Draw2D requires that it is added to the feedback layer
-     * before it can be fully initialized, which is why this call adds feedback and then
-     * returns it.  The caller is responsible for erasing the figures in the list.
-     */
-    List showTargetFeedback(EditPart host, DesignPosition position, DropRequest request);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/IHTMLGraphicalViewer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/IHTMLGraphicalViewer.java
deleted file mode 100644
index 6ee3ce4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/IHTMLGraphicalViewer.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import org.eclipse.draw2d.Viewport;
-import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.widgets.Caret;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
-
-/**
- * @author mengbo
- */
-public interface IHTMLGraphicalViewer extends GraphicalViewer 
-{
-    /**
-     * Factory for IHTMLGraphicalViewers
-     *
-     */
-    static class Factory
-    {
-        /**
-         * @param part 
-         * @return a new graphical viewer for part
-         */
-        public static IHTMLGraphicalViewer createGraphicalViewer(IEditorPart part)
-        {
-            return new HTMLGraphicalViewer(part);
-        }
-    }
-
-	/**
-	 * @return the dom model
-	 */
-	public IDOMModel getModel();
-
-	/**
-	 * ensure we are in range selection mode
-	 */
-	public void ensureRangeSelectionMode();
-
-	/**
-	 * 
-	 */
-	public void ensureObjectSelectionMode();
-
-	/**
-	 * @return true if in range mode
-	 */
-	public boolean isInRangeMode();
-
-	/**
-	 * @return the current selection range
-	 */
-	public DesignRange getRangeSelection();
-
-	/**
-	 * @param position
-	 * @param position2
-	 */
-	public void setRange(DesignPosition position, DesignPosition position2);
-
-	/**
-	 * @param position
-	 */
-	public void setRangeEndPosition(DesignPosition position);
-
-	/**
-	 * @return the caret
-	 */
-	public Caret getCaret();
-
-	/**
-	 * indicate a batch of operations is began, and may result in selection
-	 * change. This viewer will only fire a single selection changed event when
-	 * this batch of operations finish.
-	 */
-	public void startSelectionChange();
-
-	/**
-	 * batch operation that change the selection finished.
-	 * 
-	 */
-	public void selectionChanged();
-
-	/**
-	 * @return the view port
-	 */
-	public Viewport getViewport();
-	
-	/**
-	 * @return the status line manager
-	 */
-	public IStatusLineManager getStatusLineManager();
-	
-	/**
-	 * @param newSelection
-	 */
-	public void updateRangeSelection(ISelection newSelection);
-	
-	/**
-	 * Update the horizontal position
-	 */
-	public void updateHorizontalPos();
-
-	/**
-	 * Clear the selection to null. When the model is modified, the selection is
-     * invalid, so we need to clear the selection. We change the selection
-     * directly, it won't need to fire selectionchange event to other part.
-     */
-	public void clearSelectionRange();
-
-	/**
-     * Adds listener both as a selection changed listener and as an
-     * {@link IHTMLGraphicalViewerListener}.  Callers of this method
-     * need not call addSelectionChangedListener.
-     * @param listener
-     */
-    public void addHTMLViewerListener(IHTMLGraphicalViewerListener listener);
-    
-    /**
-     * Removes listener both as a selection changed listener and as an
-     * {@link IHTMLGraphicalViewerListener}.  Callers of this method
-     * need not call removeSelectionChangedListener.
-     * @param listener
-     */
-    public void removeHTMLViewerListener(IHTMLGraphicalViewerListener listener);
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/IHTMLGraphicalViewerListener.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/IHTMLGraphicalViewerListener.java
deleted file mode 100644
index 0d48ca9..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/IHTMLGraphicalViewerListener.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-
-/**
- * @author mengbo
- */
-public interface IHTMLGraphicalViewerListener extends ISelectionChangedListener {
-	/**
-	 * Fired before selection changes
-	 */
-	public void selectionAboutToChange();
-
-	/**
-	 * Fired after selection changed listeners have all been processed
-	 * for a change
-	 */
-	public void selectionChangeFinished();
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/LayoutPart.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/LayoutPart.java
deleted file mode 100644
index 31c3713..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/LayoutPart.java
+++ /dev/null
@@ -1,476 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.geometry.Point;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalEditPart;
-import org.eclipse.jst.pagedesigner.IHTMLConstants;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.CSSTextFigure;
-import org.eclipse.jst.pagedesigner.css2.layout.FlowBox;
-import org.eclipse.jst.pagedesigner.css2.layout.FlowUtilities;
-import org.eclipse.jst.pagedesigner.css2.layout.TextFragmentBox;
-import org.eclipse.jst.pagedesigner.css2.layout.TextLayoutSupport;
-import org.eclipse.jst.pagedesigner.dom.DOMRefPosition;
-import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
-import org.eclipse.jst.pagedesigner.parts.SubNodeEditPart;
-import org.eclipse.jst.pagedesigner.parts.TextEditPart;
-import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
-import org.eclipse.jst.pagedesigner.validation.caret.Target;
-import org.w3c.dom.Node;
-
-/**
- * @author mengbo
- */
-public final  class LayoutPart {
-	private final static int MAX_OFFSET_TO_EDGE = 10;
-
-	private EditPart _part;
-
-	private FlowBox _box;
-
-	private final Point EMPTY_POINT = new Point(0, 0);
-
-	private Point _point = EMPTY_POINT;
-
-	/**
-	 * If caller didn't resolve FlowBox, call this.
-	 * 
-	 * @param part
-	 * @param point
-	 */
-	public LayoutPart(EditPart part, Point point) {
-		Assert.isTrue(part != null);
-		_part = part;
-		_point = point;
-	}
-
-	/**
-	 * @return Returns the _box, when it is null, generate box with part and
-	 *         point.
-	 */
-	public FlowBox getBox() {
-		if (_box == null) {
-			_box = getClosestBox();
-		}
-		return _box;
-	}
-
-	/**
-	 * @return Returns the _part.
-	 */
-	public EditPart getPart() {
-		return _part;
-	}
-
-	/**
-	 * Get closest box's bounds.
-	 * 
-	 * @param point
-	 * @return
-	 */
-	private Rectangle getClosestBoxAbsoluteBounds() {
-		Rectangle rect = null;
-		if (getBox() != null) {
-			rect = getAbsoluteBounds(getBox());
-		}
-		return rect;
-	}
-
-	/**
-	 * Try to get the closest flowbox absolute bounds.
-	 * 
-	 * @return the bounding rectangle
-	 */
-	public Rectangle getAbsoluteBounds() {
-		Rectangle bounds = null;
-		if ((bounds = getClosestBoxAbsoluteBounds()) == null) {
-			// This should never happens.
-			bounds = EditPartPositionHelper.getAbsoluteBounds(_part);
-		}
-		return bounds;
-	}
-
-	/**
-	 * Get box's absolute bounds.
-	 * 
-	 * @param box
-	 * @return the box's bounding rectangle
-	 */
-	public Rectangle getAbsoluteBounds(FlowBox box) {
-		if (box != null) {
-			IFigure figure = ((GraphicalEditPart) _part).getFigure();
-			Rectangle rect = new Rectangle(box.getX(), box.getY(), box.getWidth(), box
-					.getHeight());
-			figure.translateToAbsolute(rect);
-			return rect;
-		}
-		return null;
-	}
-
-	/**
-	 * Closest box is the part's FlowBox which y coordinate is closest to point,
-	 * and then its x coordinate is more close to point than other boxs of the
-	 * same line.
-	 * 
-	 * @param part
-	 * @param point
-	 * @return
-	 */
-	private FlowBox getClosestBox() {
-		FlowBox closestBox = null;
-		List fragments = getLines(_part);
-
-		// if there is one which are at the same line with relative,
-		// calculate that line first;
-		for (int i = 0; i < fragments.size(); i++) {
-			FlowBox box = (FlowBox) fragments.get(i);
-			Rectangle boxRect = getAbsoluteBounds(box);
-			if (boxRect.contains(_point.x, _point.y)) {
-				closestBox = box;
-				break;
-			}
-            if (closestBox == null) {
-            	closestBox = box;
-            } else {
-            	// compare y.
-            	int offset1 = Math.abs(CaretPositionResolver.getYDistance(
-            			boxRect, _point));
-            	Rectangle closestRect = getAbsoluteBounds(closestBox);
-            	int offset2 = Math.abs(CaretPositionResolver.getYDistance(
-            			closestRect, _point));
-            	if (offset1 < offset2) {
-            		closestBox = box;
-            	}
-            }
-            // at the same line
-            if (closestBox != box && boxRect.contains(boxRect.x, _point.y)) {
-            	// compare x.
-            	int offset1 = Math.abs(CaretPositionResolver.getXDistance(
-            			boxRect, _point));
-            	Rectangle closestRect = getAbsoluteBounds(closestBox);
-            	int offset2 = Math.abs(CaretPositionResolver.getXDistance(
-            			closestRect, _point));
-            	if (offset1 < offset2) {
-            		closestBox = box;
-            	}
-            }
-		}
-		return closestBox;
-	}
-
-	/**
-	 * The point is whitin the bounds of the figure.
-	 * 
-	 * @param point
-	 * @return true if point is the absolute bounds of this
-	 */
-	public boolean contains(Point point) {
-		return getAbsoluteBounds().contains(point);
-	}
-
-	/**
-	 * @return the design position
-	 */
-	public DesignPosition resolveTextPosition() {
-		DesignPosition result = null;
-		if (_part instanceof TextEditPart
-				&& !EditModelQuery.isTransparentText(Target.resolveNode(_part))) {
-			FlowBox flowBox = getBox();
-			if (flowBox instanceof TextFragmentBox) {
-				TextFragmentBox box = (TextFragmentBox) flowBox;
-				if (((TextEditPart) _part).getFigure() instanceof CSSTextFigure) {
-					CSSTextFigure figure = (CSSTextFigure) ((TextEditPart) _part)
-							.getFigure();
-					Rectangle boxRect = getAbsoluteBounds(box);
-					int index = FlowUtilities.getTextInWidth(box.getTextData(),
-							figure.getCSSStyle().getCSSFont().getSwtFont(),
-							_point.x - boxRect.x, TextLayoutSupport
-									.getAverageCharWidth(box));
-					result = new DesignPosition(_part, box._offset + index);
-				}
-			}
-		}
-		return result;
-	}
-
-	/**
-	 * @param validator
-	 * @return resolve the design position using validator
-	 */
-	public DesignPosition resolvePosition(IPositionMediator validator) {
-		DesignPosition result;
-		if ((result = resolveTextPosition()) == null) {
-			boolean atPointLeft = isBeforePoint(_point);
-//			boolean atPointRight = isAfterPoint(_point);
-//			if (atPointLeft == atPointRight) {
-//			    // TODO: and...?
-//			}
-			Target target = new Target(getPart());
-			if (validator.isValidPosition(new DOMRefPosition(target.getNode(),
-					atPointLeft))) {
-				result = new DesignRefPosition(_part, atPointLeft);
-			} else if (validator.isValidPosition(new DOMRefPosition(target
-					.getNode(), !atPointLeft))) {
-				result = new DesignRefPosition(_part, !atPointLeft);
-			} else if (validator.isEditable(target)) {
-				if (atPointLeft) {
-					result = new DesignPosition(_part, 0);
-				} else {
-					result = new DesignPosition(_part, _part.getChildren()
-							.size());
-				}
-			}
-		}
-		return result;
-	}
-
-    // TODO: dead?
-//	private IFigure getFigure() {
-//		return ((GraphicalEditPart) _part).getFigure();
-//	}
-
-	private boolean isAfterPoint(Point point) {
-		boolean result = false;
-		FlowBox flowBox = getLine(0);
-		if (IHTMLConstants.TAG_BR.equalsIgnoreCase(Target.resolveNode(_part)
-				.getNodeName())) {
-			if (flowBox != null) {
-				Rectangle boxRect = getAbsoluteBounds(flowBox);
-				result = CaretPositionResolver.getYDistance(boxRect, point) == 0;
-			}
-		} else {
-
-			if (flowBox != null) {
-				Rectangle boxRect = getAbsoluteBounds(flowBox);
-				if (CaretPositionResolver.getXDistance(boxRect, point) != 0) {
-					result = CaretPositionResolver.getXDistance(boxRect, point) < 0
-							&& // 
-							CaretPositionResolver.getYDistance(boxRect, point) == 0;
-				}
-			}
-		}
-		result |= isUnderCaret();
-		// if (isWidget() && flowBox != null)
-		// {
-		// result |= contains(point) &&
-		// CaretPositionResolver.toXMiddle(getAbsoluteBounds(flowBox), point) <
-		// 0;
-		// }
-		return result;
-
-	}
-
-	/*package*/ boolean isBeforePoint(Point point) {
-		boolean result = false;
-		FlowBox flowBox = getLastLine();
-		if (flowBox != null) {
-			Rectangle boxRect = getAbsoluteBounds(flowBox);
-			if (IHTMLConstants.TAG_BR.equalsIgnoreCase(Target
-					.resolveNode(_part).getNodeName())) {
-				return CaretPositionResolver.getYDistance(boxRect, point) == 0;
-			} else if (CaretPositionResolver.getXDistance(boxRect, point) != 0) {
-				result = CaretPositionResolver.getXDistance(boxRect, point) > 0
-						&& // 
-						CaretPositionResolver.getYDistance(boxRect, point) == 0;
-			}
-		}
-		result |= isAboveCaret();
-		// if (isWidget() && flowBox != null)
-		// {
-		// result |= contains(point) &&
-		// CaretPositionResolver.toXMiddle(getAbsoluteBounds(flowBox), point) >
-		// 0;
-		// }
-		return result;
-		// return !isAfterPoint(point);
-	}
-
-	/*package*/ boolean isBeforePoint() {
-		return isBeforePoint(_point);
-	}
-
-	/*package*/ boolean atLeftPart(Point point) {
-		FlowBox flowBox = getBox();
-		if (flowBox != null) {
-			Rectangle boxRect = getAbsoluteBounds(flowBox);
-			return CaretPositionResolver.toXMiddle(boxRect, point) < 0;
-		}
-		return true;
-	}
-
-	/*package*/ boolean isAfterPoint() {
-		return isAfterPoint(_point);
-	}
-
-	// TODO: dead but possibly useful?
-//	private boolean atSameLine(Point point) {
-//		Rectangle bounds = getAbsoluteBounds();
-//		return bounds.contains(bounds.getTop().x, point.y);
-//	}
-
-	/*package*/ boolean atSameRow(Point point) {
-		Rectangle bounds = getAbsoluteBounds();
-		return bounds.contains(point.x, bounds.getRight().y);
-	}
-
-	/*package*/ static Rectangle getBounds(FlowBox box) {
-		return new Rectangle(box.getX(), box.getY(), box.getWidth(), box.getHeight());
-	}
-
-	/**
-	 * @return Returns the _point.
-	 */
-	public Point getPoint() {
-		return _point;
-	}
-
-	FlowBox getLine(int index) {
-		FlowBox result = null;
-		List lines = getLines(_part);
-		if (lines.size() > 0 && index >= 0 && index <= lines.size() - 1) {
-			result = (FlowBox) lines.get(index);
-		}
-		return result;
-	}
-
-	FlowBox getLastLine() {
-		FlowBox result = null;
-		List lines = getLines(_part);
-		if (lines.size() > 0) {
-			result = (FlowBox) lines.get(lines.size() - 1);
-		}
-		return result;
-	}
-
-	/**
-	 * @param part
-	 * @return
-	 */
-	List getLines(EditPart part) {
-		List fragments = new ArrayList();
-		if (part instanceof SubNodeEditPart) {
-			IFigure figure = ((GraphicalEditPart) part).getFigure();
-
-			if (figure instanceof CSSTextFigure) {
-				fragments = ((CSSTextFigure) figure).getFragments();
-				((CSSTextFigure) figure).getCSSStyle();
-			} else if (figure instanceof CSSFigure) {
-				fragments = ((CSSFigure) figure).getFragmentsForRead();
-				((CSSFigure) figure).getCSSStyle();
-			}
-		}
-		return fragments;
-	}
-
-	/**
-	 * To search for none empty string, this is not final.
-	 * @param part 
-	 * @return the edit part
-	 * 
-	 */
-	/*package*/ static EditPart getConcretePart(EditPart part) {
-		if (part != null) {
-			Node node = Target.resolveNode(part);
-			Node child = node.getFirstChild();
-			EditPart result;
-			while (child != null) {
-				if (!EditModelQuery.isTransparentText(child)
-						&& (result = Target.resolvePart(child)) != null) {
-					return result;
-				}
-				child = child.getNextSibling();
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * To search for none empty string, this is not final.
-	 * Equivalent to getConcretePart(getPart())
-	 * 
-	 * @return the edit part
-	 * 
-	 */
-	public EditPart getConcretePart() {
-		return getConcretePart(_part);
-	}
-
-	/**
-	 * @param node
-	 * @return the node
-	 */
-	public static Node getConcreteNode(Node node) {
-		if (node != null) {
-			Node child = node.getFirstChild();
-			while (child != null) {
-				if (!EditModelQuery.isTransparentText(child)) {
-					return node;
-				}
-				child = child.getNextSibling();
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * @return true if is close to edge
-	 */
-	public boolean isCloseToEdgeFromOutSide() {
-		boolean result = false;
-		if (EditModelQuery.isBlockNode(Target.resolveNode(_part))) {
-			result = Math.abs(getAbsoluteBounds().getLeft().x - _point.x) <= MAX_OFFSET_TO_EDGE;
-			if (!result) {
-				result = Math.abs(getAbsoluteBounds().getRight().x - _point.x) <= MAX_OFFSET_TO_EDGE;
-			}
-		}
-		return result;
-	}
-
-	private boolean isAboveCaret() {
-		return getAbsoluteBounds().getBottom().y <= _point.y;
-	}
-
-	private boolean isUnderCaret() {
-		return getAbsoluteBounds().getTop().y >= _point.y;
-	}
-
-	/**
-	 * @return tru if getPart() is considered inline
-	 */
-	/*package*/ boolean isInline() {
-		return EditModelQuery.isInline(Target.resolveNode(_part));
-	}
-
-    // TODO: dead?
-//	private boolean isWidget() {
-//		return EditModelQuery.isWidget(_part);
-//	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer sb = new StringBuffer();
-		sb.append("editPart:" + _part + ", --- box: " + getBox());
-		return sb.toString();
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/TextPosition.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/TextPosition.java
deleted file mode 100644
index 46850b4..0000000
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/TextPosition.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Sybase, Inc. and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     Sybase, Inc. - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.pagedesigner.viewer;
-
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMText;
-
-/**
- * This class used to identify a position in a text node. It's very similiar to
- * EditPartPosition. Used instead of EditPartPosition when in cases we are in
- * the middle of handling something without available EditPart created.
- * 
- * offset has the same meaning as in EditPartPosition.
- * 
- * @author mengbo
- */
-public class TextPosition {
-	private IDOMText _containerNode;
-
-	private int _offset;
-
-	/**
-	 * @param part
-	 * @param offset
-	 */
-	public TextPosition(IDOMText part, int offset) {
-		_containerNode = part;
-		_offset = offset;
-	}
-
-	/**
-	 * if _containerPart is null, means it is invalid
-	 * 
-	 * @return the text node
-	 */
-	public IDOMText getTextNode() {
-		return _containerNode;
-	}
-
-	/**
-	 * if offset < 0, means it is invalid.
-	 * 
-	 * @return the offset
-	 */
-	public int getOffset() {
-		return _offset;
-	}
-
-	/**
-	 * @return if this position is considered valid
-	 */
-	public boolean isValid() {
-		return _containerNode != null && _offset >= 0;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object obj) {
-		if (obj instanceof TextPosition) {
-			TextPosition p = (TextPosition) obj;
-			return p.getTextNode() == this._containerNode
-					&& p.getOffset() == this._offset;
-		}
-		return false;
-	}
-
-    @Override
-    public int hashCode() 
-    {
-        // match hash code to equals criteria
-        return System.identityHashCode(getTextNode()) 
-                ^ System.identityHashCode(Integer.valueOf(getOffset()));
-    }
-	
-	
-}
